{
  "version": 3,
  "sources": ["../../../../../node_modules/ms/index.js", "../../../../../node_modules/debug/src/common.js", "../../../../../node_modules/debug/src/browser.js", "../../src/code-editor/workers/codeCheckerAndAta.ts", "../../../../../node_modules/@framerjs/framer-events/lib/esm/generated/CanvasPageDelete.js", "../../src/app/ai/agents/commandTargets.ts", "../../src/app/ai/agents/DocumentParser.ts", "../../src/app/ai/agents/debug/utils.ts", "../../src/app/ai/agents/linting/lib/matchers.ts", "../../src/app/ai/agents/linting/lib/payloads.ts", "../../src/app/ai/agents/linting/lib/TreeLinter.ts", "../../src/app/ai/agents/linting/lib/predicates.ts", "../../src/app/ai/agents/linting/utils/getUnhandledCaseRecorder.ts", "../../src/app/ai/agents/linting/rules/borderIsIncomplete.ts", "../../../../../node_modules/emoji-regex/index.mjs", "../../src/app/ai/agents/linting/rules/colorContrast.ts", "../../src/app/ai/agents/linting/rules/componentVariantMatchesBreakpoint.ts", "../../src/app/ai/agents/linting/utils/overlay.ts", "../../src/app/ai/agents/linting/rules/immediateParentOverflow.ts", "../../src/app/ai/agents/linting/rules/incompatibleOverflow.ts", "../../src/app/ai/agents/linting/rules/incompleteEventActions.ts", "../../src/app/ai/agents/linting/rules/lightboxEffectRequiresImageFill.ts", "../../src/app/ai/agents/linting/rules/overlappingGroundNodes.ts", "../../src/app/ai/agents/linting/rules/relativeWidthContentRequiresMaxWidth.ts", "../../src/app/ai/agents/linting/rules/repeaterHasNoRepeatedDescendant.ts", "../../src/app/ai/agents/linting/rules/richTextVariableStylePresets.ts", "../../src/app/ai/agents/linting/rules/zeroDimensions.ts", "../../src/app/ai/agents/linting/index.ts", "../../src/app/ai/agents/linting/utils/colors.ts", "../../src/app/ai/agents/linting/utils/fill.ts", "../../src/app/ai/agents/linting/utils/textColors.ts", "../../src/app/ai/agents/linting/lib/NodesDataProvider.ts", "../../../../../node_modules/dedent/dist/dedent.mjs", "../../src/app/ai/agents/prompt/reviewInstructions.ts", "../../src/app/ai/agents/tools/serializeChanges.ts", "../../src/app/ai/agents/tools/reviewChanges.ts", "../../src/app/ai/agents/treeTraversal.ts", "../../src/app/agent/references.ts", "../../src/app/agent/editor/utils/input.ts", "../../src/app/ai/agents/nodeToDSLCommands.ts", "../../src/app/ai/agents/tools/askClarification.ts", "../../src/app/ai/agents/tools/createComponentFromFrame.ts", "../../src/app/ai/agents/tools/cleanHtml.ts", "../../src/app/ai/agents/tools/fetchExternalUrl.ts", "../../src/app/ai/agents/tools/flattenComponentInstance.ts", "../../src/app/ai/agents/tools/utils/wrapExecutionInUpdater.ts", "../../src/app/ai/agents/tools/makeExternalComponentLocal.ts", "../../src/document/stores/publishErrorTitle.ts", "../../src/app/ai/agents/tools/publish.ts", "../../src/app/ai/agents/tools/utils/getPublishUrls.ts", "../../src/app/ai/agents/tools/queryImages.ts", "../../../../../node_modules/flexsearch/dist/flexsearch.bundle.module.min.mjs", "../../src/app/ai/agents/context/fonts/fontPicker.ts", "../../src/app/ai/agents/examples/font-descriptions.json", "../../src/app/ai/agents/context/fonts/utils.ts", "../../src/app/ai/agents/context/fonts/queryFonts.ts", "../../src/export/exportLayoutTemplateToHTMLForScreenshot.ts", "../../src/export/exportSmartComponentToHTMLForScreenshot.ts", "../../src/app/ai/agents/tools/utils/requestAgentScreenshot.ts", "../../src/app/ai/agents/tools/utils/AgentScreenshots.ts", "../../src/app/ai/agents/tools/readProjectToolResultOutput.ts", "../../src/app/ai/agents/tools/readProject.ts", "../../src/app/ai/agents/abortableStream.ts", "../../src/app/ai/agents/prompt/markdown.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/implementationGuidelinesPrompt.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/propControlsPrompt.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/prompt.ts", "../../../../../node_modules/openai/src/_vendor/zod-to-json-schema/Options.ts", "../../../../../node_modules/@openai/agents-core/src/shims/shims-browser.ts", "../../../../../node_modules/@openai/agents-core/src/logger.ts", "../../../../../node_modules/@openai/agents-core/src/config.ts", "../../../../../node_modules/@openai/agents-core/src/types/protocol.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/context.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/processor.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/utils.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/spans.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/traces.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/provider.ts", "../../../../../node_modules/@openai/agents-core/src/tracing/createSpans.ts", "../../../../../node_modules/@openai/agents-core/src/toolIdentity.ts", "../../../../../node_modules/@openai/agents-core/src/tool.ts", "../../../../../node_modules/@openai/agents-core/src/mcp.ts", "../../../../../node_modules/@openai/agents-core/src/shims/mcp-server/browser.ts", "../../../../../node_modules/@openai/agents-core/src/utils/applyDiff.ts", "../../src/utils/codeFiles.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/CodeFilesPatchSession.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/applyPatchStream.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/typecheck.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/execute.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges.ts", "../../src/app/ai/agents/tools/script/controls.ts", "../../src/app/ai/agents/tools/script/icons.ts", "../../src/app/ai/utils/openRouterUsage.ts", "../../src/app/ai/agents/prompt/promptEnv.ts", "../../src/app/ai/agents/prompt/cms.ts", "../../src/app/ai/agents/prompt/componentRules.ts", "../../src/app/ai/agents/prompt/designRules.ts", "../../src/app/ai/agents/prompt/eventHandlers.ts", "../../src/app/ai/agents/prompt/overlayRules.ts", "../../src/app/ai/agents/prompt/replicas.ts", "../../src/app/ai/agents/prompt/scopeTypes.ts", "../../src/app/ai/agents/prompt/transitions.ts", "../../src/app/ai/agents/tools/script/extractDesignPatterns.ts", "../../../../../node_modules/tokenx/dist/index.mjs", "../../src/app/ai/agents/toolSchema.ts", "../../src/app/ai/agents/tokens.ts", "../../src/app/ai/agents/tools/script/packNodesIntoTokenBudgetBatches.ts", "../../src/app/ai/agents/tools/script/intelligence.ts", "../../src/app/ai/agents/tools/script/paginate.ts", "../../src/app/ai/agents/tools/script/replaceText.ts", "../../src/app/ai/agents/tools/script/runtime/utils.ts", "../../src/app/ai/agents/tools/script/runtime/fetch.ts", "../../src/app/ai/agents/tools/script/runtime/getInnerText.ts", "../../src/app/ai/agents/tools/script/runtime/walkWithSkipChildren.ts", "../../src/app/ai/agents/tools/script/runtime/main.ts", "../../src/app/ai/agents/tools/script/bridge.ts", "../../src/app/ai/agents/tools/script/tool.ts", "../../src/app/ai/agents/tools/transformers/utils.ts", "../../src/app/ai/agents/tools/viewImage.ts", "../../src/app/ai/agents/tools/toolSet.ts", "../../src/app/ai/agents/messages.ts", "../../src/document/components/utils/siteParameters.ts", "../../src/document/components/utils/getActiveWebPageURL.ts", "../../src/document/components/chrome/Pages/utils/updateRouteSegmentPath.ts", "../../src/document/components/chrome/Pages/utils/promptAndDeleteRouteSegment.ts", "../../src/document/components/utils/breakpointSuggestion.ts", "../../src/plugins/pluginErrors.ts", "../../../../plugin-api/src/utils.ts", "../../../../plugin-api/src/messages.ts", "../../src/plugins/pluginManifestValidation.ts", "../../src/utils/joinPaths.ts", "../../src/plugins/plugins.ts", "../../src/utils/truncateString.ts", "../../src/plugins/toast.ts", "../../src/app/ai/agents/evals/export/AgentTrainingDataCollector.ts", "../../src/document/components/chrome/shared/UpsellModal/utils/siteSettingsUpsellModals.tsx", "../../src/document/components/chrome/siteSettings/Redirects/ensureRedirectLimits.ts", "../../src/document/components/chrome/shared/utils/duplicateLayoutTemplate.ts", "../../src/app/ai/agents/context/richtext/richTextDestination.ts", "../../src/app/ai/agents/createNode.ts", "../../src/app/ai/agents/createVariable.ts", "../../src/app/ai/agents/createVirtualNode.ts", "../../src/app/ai/agents/defferedThrower.ts", "../../src/app/ai/agents/processCommand.ts", "../../src/app/agent/workers/generateSessionTitle.ts", "../../src/app/agent/utils/messages.ts", "../../src/app/ai/agents/harnessDisplayTimeline.ts", "../../src/app/ai/raindrop/AgentInteraction.ts", "../../src/app/ai/utils/languageModelUsdEstimate.ts", "../../src/app/ai/agents/agentHydration.ts", "../../src/app/ai/agents/changeSummary.ts", "../../src/app/ai/agents/diffLines.ts", "../../src/app/ai/agents/collectIdMappingsFromHistory.ts", "../../src/app/ai/agents/debug/logStepUsage.ts", "../../src/app/ai/agents/errors.ts", "../../src/app/ai/raindrop/ScreenshotTargetCollector.ts", "../../src/app/ai/agents/cache/cache.ts", "../../src/app/ai/agents/debug/logAgentRequest.ts", "../../src/app/ai/agents/debug/logStreamConfig.ts", "../../src/app/ai/agents/prompt/linkRules.ts", "../../src/app/ai/agents/evals/examples/avatars.ts", "../../src/app/ai/agents/evals/examples/breakpoints.ts", "../../src/app/ai/agents/evals/examples/card.ts", "../../src/app/ai/agents/evals/examples/centreNav.ts", "../../src/app/ai/agents/evals/examples/context.ts", "../../src/app/ai/agents/evals/examples/createNodes.ts", "../../src/app/ai/agents/evals/examples/dense.ts", "../../src/app/ai/agents/evals/examples/denseFixedCol.ts", "../../src/app/ai/agents/evals/examples/denseGrid.ts", "../../src/app/ai/agents/evals/examples/featureGrid.ts", "../../src/app/ai/agents/evals/examples/fraction.ts", "../../src/app/ai/agents/evals/examples/iconControls.ts", "../../src/app/ai/agents/evals/examples/imageGrid.ts", "../../src/app/ai/agents/evals/examples/nav.ts", "../../src/app/ai/agents/evals/examples/overlay.ts", "../../src/app/ai/agents/evals/examples/replicateIcons.ts", "../../src/app/ai/agents/evals/examples/richTextNode.ts", "../../src/app/ai/agents/evals/examples/row.ts", "../../src/app/ai/agents/evals/examples/shadow.ts", "../../src/app/ai/agents/evals/examples/swapImages.ts", "../../src/app/ai/agents/evals/examples/textStylePreset.ts", "../../src/app/ai/agents/prompt/formatReadProjectCall.ts", "../../src/app/ai/agents/prompt/formatScriptCall.ts", "../../src/app/ai/agents/prompt/coreExamples.ts", "../../src/app/ai/agents/prompt/corePrinciples.ts", "../../src/app/ai/agents/prompt/formRules.ts", "../../src/app/ai/agents/prompt/iconRules.ts", "../../src/app/ai/agents/tools/checklistPolicy.ts", "../../src/app/ai/agents/prompt/checklist.ts", "../../src/app/ai/agents/prompt/implementationNames.ts", "../../src/app/ai/agents/prompt/implementation.ts", "../../src/app/ai/agents/prompt/layoutTemplateRules.ts", "../../src/app/ai/agents/prompt/overview.ts", "../../src/app/ai/agents/prompt/dslCommands.ts", "../../src/app/ai/agents/prompt/projectUpdates.ts", "../../src/app/ai/agents/prompt/messages.ts", "../../src/app/ai/agents/prompt/response.ts", "import-bundle:/Users/alex/Projects/FramerStudio/src/app/vekter/src/app/ai/agents/prompt/bundled/scripts.ts?bundle", "../../src/app/ai/agents/prompt/protocolRules.ts", "../../src/app/ai/agents/prompt/tools.ts", "../../src/app/ai/agents/prompt/systemPrompt.ts", "../../src/app/ai/agents/streamParts.ts", "../../src/app/ai/agents/synchronizeAgentContext.ts", "../../src/app/ai/agents/tools/transformers/imageTransformer.ts", "../../src/app/ai/agents/tools/transformers/messageTransformer.ts", "../../src/app/ai/agents/tools/transformers/unloadedExamplesTransformer.ts", "../../src/app/ai/agents/stream.ts", "../../src/app/ai/agents/summarizeHistory.ts", "../../src/app/ai/agents/tools/requestCodeFileChanges/revertCodeFileHistoryChanges.ts", "../../src/app/ai/agents/transformHistoryToModelMessages.ts", "../../src/app/ai/agents/types.ts", "../../src/app/ai/agents/Agent.ts", "../../src/document/components/chrome/localization/getCodeGenerationScopeId.ts"],
  "sourcesContent": ["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "import type { SetupAta, Typecheck } from \"@framerjs/code-checker-worker\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { type Remote, proxy, wrap } from \"comlink\"\nimport type ts from \"typescript\"\nimport { absoluteEditorPath } from \"utils/platformPaths.ts\"\nimport { performanceMark, performanceMeasure } from \"utils/userTiming.ts\"\n\nconst log = getLogger(\"app:code-editor:code-checker\")\n\ninterface CodeCheckerWorker {\n\ttypecheck: Typecheck\n\tsetupAta: SetupAta\n}\n\nlet codeCheckerWorker: Remote<CodeCheckerWorker>\nfunction getCodeCheckerWorker() {\n\tif (!codeCheckerWorker) {\n\t\tcodeCheckerWorker = wrap(new Worker(absoluteEditorPath(\"./codeCheckerWorker.js\"), { type: \"module\" }))\n\t}\n\treturn codeCheckerWorker\n}\n\n/** Prewarms the typechecker by running a dummy typecheck. This allows us to download the worker and all network dependencies necessary ahead of time. */\nlet hasPrewarmed = false\nexport const prewarmTypechecker = async () => {\n\tif (hasPrewarmed) return\n\thasPrewarmed = true\n\n\tconst codeCheckerWorker = getCodeCheckerWorker()\n\tawait codeCheckerWorker.typecheck(\"test.ts\", \"const x = 1\")\n}\n\n/** Typechecks the given code with given compiler options. Returns the diagnostics for the code. */\nexport const typecheck: Typecheck = async (\n\tfileName,\n\tcode,\n\tcompilerOptions?: ts.server.protocol.CompilerOptions,\n\tsessionId?: string,\n) => {\n\tconst codeCheckerWorker = getCodeCheckerWorker()\n\n\ttry {\n\t\tconst now = performance.now()\n\t\tperformanceMark(\"typecheck-start\")\n\t\tconst result = await codeCheckerWorker.typecheck(fileName, code, compilerOptions, sessionId)\n\t\tperformanceMark(\"typecheck-end\")\n\t\tperformanceMeasure(\"typecheck\", \"typecheck-start\", \"typecheck-end\")\n\t\tlog.debug(\"typechecking took\", performance.now() - now, \"ms\", {\n\t\t\tfileName,\n\t\t\tcode,\n\t\t\tcompilerOptions,\n\t\t\tsessionId,\n\t\t\tresult,\n\t\t})\n\n\t\treturn result\n\t} catch (error) {\n\t\tlog.error(error)\n\t\treturn []\n\t}\n}\n\ninterface NpmTypeFetcherOptions {\n\treceivedFile?: (code: string, path: string) => void\n\tfinished?: (vfs: Map<string, string>) => void\n\tprogress?: (percent: number) => void\n\tlog?: (msg: string) => void\n}\n\n/**\n * Creates a stateful type acquirer.\n * - A type acquirer parses given code, finds all imports, and fetches types for them from jsdelivr CDN.\n * - The state here the cache of all .d.ts files fetched so far. Do not throw it away; some npm modules\n *   have hundreds of small files, and re-fetching them is a strain on the network and browser cache,\n *   even if they are already cached there.\n *\n * @example\n * const ata = await setupAutomaticTypeAcquisition({\n *   receivedFile: (code, path) => {\n *     // gets called for each file received from the network\n *     console.log(\"received file\", code, path)\n *   },\n *   finished: (vfs) => {\n *     // gets called with a virtual file system when all files have been received from the network\n *     console.log(\"finished\", vfs)\n *   },\n * })\n *\n * await ata(\"import 'react' // types: 18.2.0\")\n * // \u2192 will fetch types for react 18.2.0 and call `receivedFile` and `finished` callbacks accordingly\n */\nexport async function setupAutomaticTypeAcquisition({ receivedFile, finished, progress, log }: NpmTypeFetcherOptions) {\n\tconst codeCheckerWorker = getCodeCheckerWorker()\n\n\treturn codeCheckerWorker.setupAta(\n\t\treceivedFile && proxy(receivedFile),\n\t\tfinished && proxy(finished),\n\t\tprogress && proxy(progress),\n\t\tlog && proxy(log),\n\t)\n}\n", "import { triggerEvent } from \"../listeners\";\nfunction createCanvasPageDeleteEvent(payload) {\n  console.warn(\"[DEPRECATED] Use triggerCanvasPageDeleteEvent instead of createCanvasPageDeleteEvent.\");\n  return {\n    ...payload,\n    event: \"canvas_page_delete\"\n  };\n}\nconst meta = {\n  track: true\n};\nfunction triggerCanvasPageDeleteEvent(payload) {\n  const event = {\n    ...payload,\n    event: \"canvas_page_delete\"\n  };\n  triggerEvent(event, meta);\n}\nexport {\n  createCanvasPageDeleteEvent,\n  triggerCanvasPageDeleteEvent\n};\n", "import type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { MaybeCanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport { isCollectionItemNode, isCollectionNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { isVariableReferenceHandle } from \"./context/dynamicValues.ts\"\nimport { isVirtualNodeId, parseVirtualNodeId } from \"./context/richtext/document.ts\"\nimport { parseRichTextTarget } from \"./context/richtext/targets.ts\"\nimport { CommandType, isAddVariableCommandAttributes, type Command } from \"./dsl.ts\"\n\n/**\n * Determines the node which a command should trigger an overlay for, if any\n */\nexport function getCommandOverlayTargetNode(\n\tcommand: Command,\n\tctx: AgentContext,\n\tbefore: boolean = false,\n): MaybeCanvasNode {\n\t// Can only get a target node before a Delete command is executed.\n\tif (before) {\n\t\treturn command.type === CommandType.Remove ? ctx.treeResolver.get(command.attributes.id) : null\n\t}\n\n\tswitch (command.type) {\n\t\tcase CommandType.Add:\n\t\t\tif (isAddVariableCommandAttributes(command.attributes)) return null\n\t\t\treturn ctx.treeResolver.get(command.attributes.id)\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Move:\n\t\t\treturn ctx.treeResolver.get(command.attributes.id)\n\t\tcase CommandType.Duplicate:\n\t\t\treturn ctx.treeResolver.get(command.attributes.newId)\n\t\tcase CommandType.CreateVariant:\n\t\t\treturn ctx.treeResolver.get(command.attributes.id)\n\t\tcase CommandType.Remove:\n\t\t\treturn null\n\t\tdefault:\n\t\t\tassertNever(command)\n\t}\n}\n\n/**\n * Determines the node ID(s) which a command is acting on, if any. Useful for tracking warnings/errors against commands\n *\n * Note: this was primarily added to support the reviewChanges tool determining which Changed Nodes to fully serialise\n * It is designed intentionally conservatively to not drop any relevant node IDs, even if that could occasionally mean we serialise more node data than strictly necessary\n * - Part of this is to avoid creating brand new issues (not currently backed by a specific example) where a published Warning or Error for a command like CreateVariant does need to reveal the full content of the `from` side for the agent to receive enough context\n * - Part of this is straight conservatism, as the types of halucinations (or excessive tool calls) we could create be being too agressive with the node serialisation pruning would be hard to reproduce and debug, while the cost of occasionally including some extra node data is likely low\n * - In the future both these reasons may become better understood and less relevant respectively, at which point we could refine this function to be more precise in the node IDs\n */\nexport function getCommandTouchedNodeIds(command: Command, ctx: AgentContext): NodeID[] | undefined {\n\tconst targetNodeIds = getCommandTouchedIds(command, ctx)\n\n\tconst result: NodeID[] = []\n\tfor (const nodeId of targetNodeIds) {\n\t\tconst resolvedId = resolveTargetNodeId(nodeId, ctx)\n\t\tif (resolvedId) {\n\t\t\tresult.push(resolvedId)\n\t\t}\n\t}\n\n\treturn result.length > 0 ? result : undefined\n}\n\nfunction getCommandTouchedIds(command: Command, ctx: AgentContext): string[] {\n\tswitch (command.type) {\n\t\tcase CommandType.Add:\n\t\t\treturn isAddVariableCommandAttributes(command.attributes) ? [command.attributes.scope] : [command.attributes.id]\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Remove:\n\t\tcase CommandType.Move: {\n\t\t\tconst dynamicValueHandle = ctx.dynamicValues.getVariableReferenceHandleByVariableId(command.attributes.id)\n\t\t\treturn isVariableReferenceHandle(dynamicValueHandle) ? [dynamicValueHandle.scopeId] : [command.attributes.id]\n\t\t}\n\t\tcase CommandType.Duplicate: {\n\t\t\tconst dynamicValueHandle = ctx.dynamicValues.getVariableReferenceHandleByVariableId(command.attributes.id)\n\t\t\treturn isVariableReferenceHandle(dynamicValueHandle)\n\t\t\t\t? [dynamicValueHandle.scopeId, command.attributes.newId]\n\t\t\t\t: [command.attributes.id, command.attributes.newId]\n\t\t}\n\t\tcase CommandType.CreateVariant:\n\t\t\treturn [command.attributes.from, command.attributes.id]\n\t\tdefault:\n\t\t\tassertNever(command)\n\t}\n}\n\nexport function getCommandCreatedIds(command: Command): string | undefined {\n\tswitch (command.type) {\n\t\tcase CommandType.Add:\n\t\t\treturn command.attributes.id\n\t\tcase CommandType.Duplicate:\n\t\t\treturn command.attributes.newId\n\t\tcase CommandType.CreateVariant:\n\t\t\treturn command.attributes.id\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Move:\n\t\tcase CommandType.Remove:\n\t\t\treturn undefined\n\t\tdefault:\n\t\t\tassertNever(command, \"Invalid command type\")\n\t}\n}\n\n/**\n * Returns the collection node ID that a command targets, if any. Must be called before the\n * command executes \u2014 removed collection items won't be resolvable in the tree afterward.\n */\nexport function getCommandCollectionTargetId(command: Command, ctx: AgentContext): NodeID | undefined {\n\tfor (const id of getCommandTargetIds(command)) {\n\t\tconst node = ctx.treeResolver.get(id)\n\t\tif (isCollectionNode(node)) return node.id\n\t\tif (isCollectionItemNode(node) && node.parentid && isCollectionNode(ctx.treeResolver.get(node.parentid))) {\n\t\t\treturn node.parentid\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function getCommandTargetIds(command: Command): readonly string[] {\n\tswitch (command.type) {\n\t\tcase CommandType.Add:\n\t\t\treturn [command.attributes.id, command.attributes.parent].filter(isString)\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Remove:\n\t\t\treturn [command.attributes.id]\n\t\tcase CommandType.Move:\n\t\t\treturn [command.attributes.id, command.attributes.parent]\n\t\tcase CommandType.Duplicate:\n\t\t\treturn [command.attributes.id, command.attributes.newId, command.attributes.parent].filter(isString)\n\t\tcase CommandType.CreateVariant:\n\t\t\treturn [command.attributes.id, command.attributes.from]\n\t\tdefault:\n\t\t\tassertNever(command, \"Invalid command type\")\n\t}\n}\n\nfunction resolveTargetNodeId(targetNodeId: string, ctx: AgentContext): NodeID | undefined {\n\tconst nodeId = getNodeIdForPossiblyVirtualId(targetNodeId)\n\tif (!nodeId) {\n\t\treturn undefined\n\t}\n\n\treturn ctx.treeResolver.get(nodeId)?.id ?? nodeId\n}\n\nexport function getNodeIdForPossiblyVirtualId(nodeIdOrVirtualId: string): string {\n\tif (isVirtualNodeId(nodeIdOrVirtualId)) {\n\t\ttry {\n\t\t\tconst richTextTarget = parseVirtualNodeId(nodeIdOrVirtualId).richTextTarget\n\t\t\tconst { nodeId } = parseRichTextTarget(richTextTarget)\n\t\t\treturn nodeId\n\t\t} catch {\n\t\t\t// If we fail to parse the virtual ID, returning it allows us to still track commands with malformed virtual IDs, even if we can't resolve them to a node.\n\t\t\treturn nodeIdOrVirtualId\n\t\t}\n\t}\n\n\treturn nodeIdOrVirtualId\n}\n", "import { getLogger } from \"@framerjs/shared\"\nimport { join } from \"utils/join.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { type RepairInfo, StreamingDSLParser } from \"../StreamingDSLParser.ts\"\nimport { COMMAND_SEPARATOR, type Command, isDSLCommandStart, parseDSLCommand } from \"./dsl.ts\"\nimport { createBlock, ticks } from \"./fencedBlock.ts\"\n\nconst whitespaceRegex = /\\s/u\n\ninterface MarkerMatch<T extends string> {\n\tindex: number\n\tmarker: string\n\tblock: BlockHandler<T>\n}\n\nfunction isWhitespaceCharacter(value: string): boolean {\n\treturn whitespaceRegex.test(value)\n}\n\nfunction consumePostOpenFencedWhitespace(input: string): string {\n\tif (input.startsWith(\"\\r\\n\")) return input.slice(2)\n\tif (input.startsWith(\"\\n\")) return input.slice(1)\n\tif (input.startsWith(\" \") || input.startsWith(\"\\t\")) return input.slice(1)\n\treturn input\n}\n\nfunction consumePostCloseFencedWhitespace(input: string): string {\n\tif (input.startsWith(\"\\r\\n\")) return input.slice(2)\n\tif (input.startsWith(\"\\n\")) return input.slice(1)\n\treturn input\n}\n\nfunction trimTrailingFenceLineBreak(input: string): string {\n\tif (input.endsWith(\"\\r\\n\")) return input.slice(0, -2)\n\tif (input.endsWith(\"\\n\")) return input.slice(0, -1)\n\treturn input\n}\n\nfunction hasNonWhitespace(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst char = text[i]\n\t\tif (char && !isWhitespaceCharacter(char)) return true\n\t}\n\treturn false\n}\n\ninterface BlockHandler<T extends string> {\n\ttype: T\n\t// Call for each token inside the fenced block type\n\tonToken: (token: string) => void\n\t// Call when the block is complete\n\tfinalize?: () => void\n}\n\nexport class DocumentParser<T extends string> {\n\tprivate readonly markers: readonly { marker: string; block: BlockHandler<T> }[]\n\tprivate readonly maxMarkerLength: number\n\tprivate fullText = \"\"\n\tprivate pending = \"\"\n\tprivate pendingTextOutput = \"\"\n\tprivate activeBlock: BlockHandler<T> | undefined\n\tprivate lastBlockChar: string | undefined\n\n\tconstructor(\n\t\tprivate readonly blocks: readonly BlockHandler<T>[],\n\t\t// Called for each text token outside of a block\n\t\tprivate readonly onText: (text: string) => void,\n\t) {\n\t\tthis.markers = this.blocks.map(block => ({ marker: ticks + block.type, block }))\n\t\tthis.maxMarkerLength = this.markers.reduce((max, { marker }) => Math.max(max, marker.length), ticks.length)\n\t}\n\n\t// Add a token to the parser.\n\taddToken(token: string) {\n\t\tif (!token) return\n\t\tthis.fullText += token\n\t\tthis.pending += token\n\t\tthis.process(false)\n\t}\n\n\t// Call any finalizers and return the full text.\n\tfinalize() {\n\t\tthis.process(true)\n\t\tthis.flushTextOutput(true)\n\t\tthis.closeActiveBlock()\n\t\treturn this.fullText\n\t}\n\n\tprivate process(isFinal: boolean) {\n\t\twhile (this.pending.length > 0) {\n\t\t\tif (this.activeBlock) {\n\t\t\t\tif (!this.processActiveBlock(isFinal)) return\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!this.processTextMode(isFinal)) return\n\t\t}\n\t}\n\n\tprivate processTextMode(isFinal: boolean): boolean {\n\t\tconst match = this.findNextOpenMarker(isFinal)\n\t\tif (match) {\n\t\t\tconst text = this.pending.slice(0, match.index)\n\t\t\tif (text) this.emitText(text)\n\t\t\tthis.pending = this.pending.slice(match.index + match.marker.length)\n\t\t\tthis.pending = consumePostOpenFencedWhitespace(this.pending)\n\t\t\tthis.activeBlock = match.block\n\t\t\treturn true\n\t\t}\n\n\t\tif (isFinal) {\n\t\t\tif (this.pending) this.emitText(this.pending)\n\t\t\tthis.pending = \"\"\n\t\t\treturn true\n\t\t}\n\n\t\tconst keep = this.maxMarkerLength\n\t\tconst flushLength = this.pending.length - keep\n\t\tif (flushLength <= 0) return false\n\t\tthis.emitText(this.pending.slice(0, flushLength))\n\t\tthis.pending = this.pending.slice(flushLength)\n\t\treturn true\n\t}\n\n\tprivate processActiveBlock(isFinal: boolean): boolean {\n\t\tconst closeIndex = this.findCloseIndex(this.pending, isFinal)\n\t\tif (closeIndex >= 0) {\n\t\t\t// If the closing fence starts on a new line, exclude that preceding line break from content.\n\t\t\tconst closesOnOwnLine = this.isFenceOnOwnLine(closeIndex)\n\t\t\tconst rawContent = this.pending.slice(0, closeIndex)\n\t\t\tconst content = closesOnOwnLine ? trimTrailingFenceLineBreak(rawContent) : rawContent\n\t\t\tif (content) this.emitBlock(content)\n\t\t\tthis.pending = this.pending.slice(closeIndex + ticks.length)\n\t\t\tthis.pending = consumePostCloseFencedWhitespace(this.pending)\n\t\t\tthis.lastBlockChar = undefined\n\t\t\tthis.closeActiveBlock()\n\t\t\treturn true\n\t\t}\n\n\t\tif (isFinal) {\n\t\t\tif (this.pending) this.emitBlock(this.pending)\n\t\t\tthis.pending = \"\"\n\t\t\treturn true\n\t\t}\n\n\t\tconst keep = ticks.length\n\t\tconst flushLength = this.pending.length - keep\n\t\tif (flushLength <= 0) return false\n\t\tthis.emitBlock(this.pending.slice(0, flushLength))\n\t\tthis.pending = this.pending.slice(flushLength)\n\t\treturn true\n\t}\n\n\tprivate isFenceOnOwnLine(closeIndex: number): boolean {\n\t\tconst previous = closeIndex === 0 ? this.lastBlockChar : this.pending[closeIndex - 1]\n\t\treturn previous === \"\\n\" || previous === \"\\r\"\n\t}\n\n\tprivate emitBlock(token: string) {\n\t\tthis.activeBlock?.onToken(token)\n\t\tthis.lastBlockChar = token[token.length - 1]\n\t}\n\n\tprivate emitText(token: string) {\n\t\tthis.pendingTextOutput += token\n\t\tthis.flushTextOutput(false)\n\t}\n\n\tprivate flushTextOutput(isFinal: boolean) {\n\t\tif (!this.pendingTextOutput) return\n\t\tif (hasNonWhitespace(this.pendingTextOutput)) {\n\t\t\tthis.onText(this.pendingTextOutput)\n\t\t\tthis.pendingTextOutput = \"\"\n\t\t\treturn\n\t\t}\n\t\tif (isFinal) this.pendingTextOutput = \"\"\n\t}\n\n\tprivate closeActiveBlock() {\n\t\tif (!this.activeBlock) return\n\t\tthis.activeBlock.finalize?.()\n\t\tthis.activeBlock = undefined\n\t}\n\n\tprivate findNextOpenMarker(isFinal: boolean): MarkerMatch<T> | undefined {\n\t\tlet match: MarkerMatch<T> | undefined\n\n\t\tfor (const entry of this.markers) {\n\t\t\tlet searchFrom = 0\n\t\t\twhile (searchFrom < this.pending.length) {\n\t\t\t\tconst index = this.pending.indexOf(entry.marker, searchFrom)\n\t\t\t\tif (index < 0) break\n\t\t\t\tconst next = this.pending[index + entry.marker.length]\n\t\t\t\tif (isUndefined(next) && !isFinal) break\n\t\t\t\tif (isUndefined(next) || this.isBoundaryCharacter(next)) {\n\t\t\t\t\tif (!match || index < match.index || (index === match.index && entry.marker.length > match.marker.length)) {\n\t\t\t\t\t\tmatch = { index, marker: entry.marker, block: entry.block }\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tsearchFrom = index + 1\n\t\t\t}\n\t\t}\n\t\treturn match\n\t}\n\n\tprivate findCloseIndex(input: string, isFinal: boolean): number {\n\t\tlet start = 0\n\t\twhile (start < input.length) {\n\t\t\tconst index = input.indexOf(ticks, start)\n\t\t\tif (index < 0) return -1\n\n\t\t\tconst previous = index === 0 ? this.lastBlockChar : input[index - 1]\n\t\t\tif (isUndefined(previous) || previous === \"\\n\" || previous === \"\\r\") return index\n\n\t\t\tconst next = input[index + ticks.length]\n\t\t\tif (isUndefined(next) && !isFinal) return -1\n\t\t\tif (isUndefined(next) || this.isBoundaryCharacter(next)) {\n\t\t\t\treturn index\n\t\t\t}\n\n\t\t\tstart = index + 1\n\t\t}\n\t\treturn -1\n\t}\n\n\tprivate isBoundaryCharacter(value: string): boolean {\n\t\treturn isWhitespaceCharacter(value)\n\t}\n}\n\nexport const PROJECT_UPDATE_LABEL = \"project-update\"\nexport const DESIGN_PLAN_LABEL = \"design-plan\"\n\nexport function formatProjectUpdateBlock(string: string): string {\n\treturn createBlock(PROJECT_UPDATE_LABEL, string)\n}\n\nexport function formatAnnotation(value: string): string {\n\treturn `/** ${value} */`\n}\n\nexport function formatDesignPlanBlock(string: string): string {\n\treturn createBlock(DESIGN_PLAN_LABEL, string)\n}\n\ninterface LabeledProjectUpdateBlock {\n\tlabel: string\n\tcontent: string\n}\n\nexport function formatLabeledProjectUpdateBlock(blocks: LabeledProjectUpdateBlock[]): string {\n\treturn formatProjectUpdateBlock(\n\t\tjoin.linesFrom(blocks.map(block => join.lines(formatAnnotation(block.label), block.content))),\n\t)\n}\n\nconst log = getLogger(\"ai:agents\")\n\nclass DesignPlanner {\n\tprivate buffer = \"\"\n\tconstructor(private readonly onToken: (text: string) => void) {}\n\n\taddToken(token: string) {\n\t\tthis.buffer += token\n\t\tthis.onToken(token)\n\t}\n\tfinalize() {\n\t\tlog.debug(\"Updated Design Plan:\", { plan: this.buffer })\n\t\tthis.buffer = \"\"\n\t}\n}\n\nexport function createDocumentParser({\n\tonDSLCommand,\n\tonDSLRepair,\n\tonText,\n\tonDesignPlan,\n\tonAnnotation,\n}: {\n\tonDSLCommand: (parsed: Command | Error, raw: string) => void\n\tonDSLRepair?: (info: RepairInfo) => void\n\tonDesignPlan: (text: string) => void\n\tonText: (text: string) => void\n\tonAnnotation: (text: string) => void\n}) {\n\tconst designPlan = new DesignPlanner(onDesignPlan)\n\tconst dsl = new StreamingDSLParser(COMMAND_SEPARATOR, parseDSLCommand, onDSLCommand, {\n\t\tisCommandStart: isDSLCommandStart,\n\t\tonAnnotation,\n\t\tonError: onDSLCommand,\n\t\tonRepair: onDSLRepair,\n\t})\n\n\treturn new DocumentParser(\n\t\t[\n\t\t\t{\n\t\t\t\ttype: PROJECT_UPDATE_LABEL,\n\t\t\t\tonToken: (token: string) => dsl.addToken(token),\n\t\t\t\tfinalize: () => dsl.finalize(),\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: DESIGN_PLAN_LABEL,\n\t\t\t\tonToken: (token: string) => designPlan.addToken(token),\n\t\t\t\tfinalize: () => designPlan.finalize(),\n\t\t\t},\n\t\t],\n\t\tonText,\n\t)\n}\n", "export function formatElapsedMs(elapsedMs: number): string {\n\tif (elapsedMs < 1000) return `${elapsedMs}ms`\n\tif (elapsedMs < 10_000) return `${(elapsedMs / 1000).toFixed(2)}s`\n\treturn `${(elapsedMs / 1000).toFixed(1)}s`\n}\n", "import { assert, assertNever } from \"@framerjs/shared\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { createUnusedObject } from \"utils/createUnusedObject.ts\"\nimport { entriesIterator } from \"utils/entries.ts\"\nimport { isFunction, isNull, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { NodesDataProvider, NodesDataProviderKey } from \"./NodesDataProvider.ts\"\n\nexport type NodeMatcherGuard<TNode extends CanvasNode = CanvasNode> = (node: CanvasNode) => node is TNode\n\nexport type InferGuardedNode<TMatcher extends AnyMatcherArgument = AnyMatcherArgument> = TMatcher extends {\n\tguard: NodeMatcherGuard<infer TNode>\n}\n\t? TNode\n\t: CanvasNode\n\n// Prevent excess keys in matcher configs\nexport type Exact<Actual, Shape> = Actual & Record<Exclude<keyof Actual, keyof Shape>, never>\n\nexport type NodeMatcherArgument<TNode extends CanvasNode, TMatcher extends MatcherConditions<TNode>> = {\n\t/**\n\t * Use to access CanvasNode subtypes with relevant traits available.\n\t *\n\t * This guard will propagate type information through the entire linting process\n\t *\n\t * @default CanvasNode\n\t */\n\tguard?: NodeMatcherGuard<TNode>\n} & Omit<Exact<TMatcher, MatcherConditions<TNode>>, \"guard\">\nexport type NodeMatcher<TNode extends CanvasNode, TMatcher extends MatcherConditions<TNode>> = {\n\tguard: NodeMatcherGuard<TNode>\n} & TMatcher\nexport type AnyMatcherArgument = NodeMatcherArgument<CanvasNode, MatcherConditions<CanvasNode>>\n\n//\n// Calculated Node Trait Accessors\n//\n\ntype LooseNodesDataProvider = {\n\t[K in keyof NodesDataProvider]?: (\n\t\tnode: CanvasNode,\n\t\t...args: Tail<Parameters<NodesDataProvider[K]>>\n\t) => ReturnType<NodesDataProvider[K]>\n}\ntype Tail<T extends readonly unknown[]> = T extends readonly [unknown, ...infer Rest] ? Rest : []\n\nexport type ComputedNodeValue<K extends NodesDataProviderKey = NodesDataProviderKey> = ReturnType<NodesDataProvider[K]>\ntype ComputedNodeAccessor<K extends NodesDataProviderKey> = (\n\t...args: Tail<Parameters<NodesDataProvider[K]>>\n) => ReturnType<NodesDataProvider[K]>\n\ntype IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never\n\n/**\n * Does a few things:\n *\n * - strips the first $ prefix from all keys, since this is going on to a $node object it's cleaner that way\n * - only returns keys which are valid for the current node type\n */\ntype ComputedAccessorKey<TNode extends CanvasNode, K extends NodesDataProviderKey> = K extends `$${infer NodeKey}`\n\t? [TNode] extends [Parameters<NodesDataProvider[K]>[0]]\n\t\t? NodeKey\n\t\t: IsUnion<TNode> extends true\n\t\t\t? [TNode] extends [Record<NodeKey, unknown>]\n\t\t\t\t? NodeKey\n\t\t\t\t: never\n\t\t\t: NodeKey extends keyof TNode\n\t\t\t\t? NodeKey\n\t\t\t\t: never\n\t: never\n\nexport type ComputedNodeAccessors<TNode extends CanvasNode> = {\n\t[K in NodesDataProviderKey as ComputedAccessorKey<TNode, K>]: ComputedNodeAccessor<K>\n}\n\n//\n// Direct Node Trait Accessors\n//\n\ntype NonFunctionPropertyKeys<T> = T extends unknown\n\t? {\n\t\t\t[K in keyof T]: T[K] extends (...args: never[]) => unknown ? never : K\n\t\t}[keyof T]\n\t: never\ntype NodePropertyKey<TNode extends CanvasNode = CanvasNode> = Extract<NonFunctionPropertyKeys<TNode>, string>\ntype AnyNodePropertyKey = NodePropertyKey<CanvasNode>\n\ntype NodePropertyValue<\n\tTNode extends CanvasNode,\n\tK extends NodePropertyKey<TNode> = NodePropertyKey<TNode>,\n> = TNode extends unknown ? (K extends keyof TNode ? TNode[K] : never) : never\n\n//\n// Combined Matcher Keys and Values\n//\n\nexport type MatcherNodeKey<TNode extends CanvasNode = CanvasNode> =\n\t| NodePropertyKey<TNode>\n\t| `$${ComputedAccessorKey<TNode, NodesDataProviderKey>}`\ntype AnyMatcherNodeKey = AnyNodePropertyKey | NodesDataProviderKey\n\nexport type MatcherNodeValue<TNode extends CanvasNode, K extends MatcherNodeKey<TNode>> = K extends NodesDataProviderKey\n\t? ComputedNodeValue<K>\n\t: K extends NodePropertyKey<TNode>\n\t\t? NodePropertyValue<TNode, K>\n\t\t: never\ntype AnyMatcherNodeValue<K extends AnyMatcherNodeKey = AnyMatcherNodeKey> = K extends NodesDataProviderKey\n\t? ComputedNodeValue<K>\n\t: K extends AnyNodePropertyKey\n\t\t? NodePropertyValue<CanvasNode, K>\n\t\t: never\n\ntype MatcherValue<TNode extends CanvasNode, K extends MatcherNodeKey<TNode>> =\n\t| MatcherNodeValue<TNode, K>\n\t| readonly MatcherNodeValue<TNode, K>[]\n\t| NodePredicate<TNode, K>\n\ntype AnyMatcherValue<K extends AnyMatcherNodeKey = AnyMatcherNodeKey> =\n\t| AnyMatcherNodeValue<K>\n\t| readonly AnyMatcherNodeValue<K>[]\n\t| AnyNodePredicate<K>\ntype AnyMatcherEntry<K extends AnyMatcherNodeKey = AnyMatcherNodeKey> = [K, AnyMatcherValue<K>]\n\nexport type MatcherConditions<TNode extends CanvasNode = CanvasNode> = {\n\t[K in MatcherNodeKey<TNode>]?: MatcherValue<TNode, K>\n}\n\n//\n// Simple Node Predicates\n//\n\ntype NodePredicate<TNode extends CanvasNode, K extends MatcherNodeKey<TNode>> = (\n\tvalue: MatcherNodeValue<TNode, K>,\n\tnode: TNode,\n) => boolean\ntype AnyNodePredicate<K extends AnyMatcherNodeKey = AnyMatcherNodeKey> = (\n\tvalue: AnyMatcherNodeValue<K>,\n\tnode: CanvasNode,\n) => boolean\n\nfunction isNodePredicate(value: unknown): value is AnyNodePredicate {\n\treturn isFunction(value)\n}\n\n//\n// Main Exports\n//\n\n// Note: logic layers below here are intentionally softly typed since propagating node type information through\n// the entire matching process is complex and hard to understand (and for some corner cases seems impossible)\n// It's not all-or-no safety though: LooseNodesDataProvider, CanvasNode, and helpers like AnyMatcherValue get us to a high safety level\nexport function createMatchChecker<const TMatcher extends AnyMatcherArgument>(\n\tnodesDataProvider: NodesDataProvider,\n\tmatcher: TMatcher,\n) {\n\treturn {\n\t\tisMatch: (node: CanvasNode) => {\n\t\t\tif (matcher.guard && !matcher.guard(node)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tfor (const entry of entriesIterator(matcher)) {\n\t\t\t\tif (entry[0] === \"guard\" || !isMatcherEntry(entry)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst [matcherKey, matcherValue] = entry\n\n\t\t\t\tif (!isNodesDataProviderKey(nodesDataProvider, matcherKey) && !isNodePropertyKey(node, matcherKey)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tif (matchesNodeMatcherValue(nodesDataProvider, node, matcherKey, matcherValue)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\tmatcher,\n\t}\n}\n\nconst computedNodeAccessorsCache = new WeakMap<\n\tLooseNodesDataProvider,\n\tMap<CanvasNode, ComputedNodeAccessors<CanvasNode>>\n>()\nexport function createComputedNodeAccessors(\n\tnodesDataProvider: LooseNodesDataProvider,\n\tnode: CanvasNode,\n): ComputedNodeAccessors<CanvasNode> {\n\tconst cache = computedNodeAccessorsCache\n\n\tconst cachedForNodesDataProvider =\n\t\tcache.get(nodesDataProvider) ?? new Map<CanvasNode, ComputedNodeAccessors<CanvasNode>>()\n\tcache.set(nodesDataProvider, cachedForNodesDataProvider)\n\n\tlet facade: ComputedNodeAccessors<CanvasNode> | undefined = cachedForNodesDataProvider.get(node)\n\tif (!facade) {\n\t\tfacade = new Proxy<ComputedNodeAccessors<CanvasNode>>(createUnusedObject(\"ComputedNodeAccessors\"), {\n\t\t\tget(_, prop) {\n\t\t\t\t// the $node API doesn't need a $ prefixed on _everything_, but the data provider does so we add this back\n\t\t\t\tprop = \"$\" + String(prop)\n\t\t\t\tassert(isNodesDataProviderKey(nodesDataProvider, prop), `Unknown matcher node accessor: ${prop}`)\n\n\t\t\t\tconst func: ((...args: unknown[]) => unknown) | undefined = nodesDataProvider[prop]\n\t\t\t\tassert(func, `Nodes data provider does not contain a function for key ${prop}`)\n\t\t\t\treturn (...args: unknown[]) => func(node, ...args)\n\t\t\t},\n\t\t\tapply(_, __, [prop]) {\n\t\t\t\t// the $node API doesn't need a $ prefixed on _everything_, but the data provider does so we add this back\n\t\t\t\tprop = \"$\" + String(prop)\n\t\t\t\tassert(isNodesDataProviderKey(nodesDataProvider, prop), `Unknown matcher node accessor: ${prop}`)\n\n\t\t\t\tconst func: ((...args: unknown[]) => unknown) | undefined = nodesDataProvider[prop]\n\t\t\t\tassert(func, `Nodes data provider does not contain a function for key ${prop}`)\n\t\t\t\treturn (...args: unknown[]) => func(node, ...args)\n\t\t\t},\n\t\t})\n\n\t\tcachedForNodesDataProvider.set(node, facade)\n\t}\n\n\treturn facade\n}\n\nfunction arrayOrMatch(condition: unknown, value: AnyMatcherNodeValue) {\n\tif (Array.isArray(condition)) {\n\t\treturn condition.includes(value)\n\t}\n\n\treturn condition === value\n}\n\nfunction matchesNodeMatcherValue(\n\tnodesDataProvider: LooseNodesDataProvider,\n\tnode: CanvasNode,\n\tmatcherKey: AnyMatcherNodeKey,\n\tmatcherValue: AnyMatcherValue,\n) {\n\tif (isNodesDataProviderKey(nodesDataProvider, matcherKey)) {\n\t\tconst func = nodesDataProvider[matcherKey]\n\t\tassert(func, `Nodes data provider does not contain a function for key ${matcherKey}`)\n\t\tconst resolvedValue = func(node)\n\n\t\tif (isNodePredicate(matcherValue)) {\n\t\t\treturn matcherValue(resolvedValue, node)\n\t\t}\n\n\t\treturn arrayOrMatch(matcherValue, resolvedValue)\n\t}\n\n\tif (isNodePropertyKey(node, matcherKey)) {\n\t\tconst resolvedValue = node[matcherKey]\n\n\t\tif (isNodePredicate(matcherValue)) {\n\t\t\treturn matcherValue(resolvedValue, node)\n\t\t}\n\n\t\treturn arrayOrMatch(matcherValue, resolvedValue)\n\t}\n\n\tassertNever(matcherKey, `Matcher key ${String(matcherKey)} is not a valid direct node key or calculated node key`)\n}\n\nfunction isMatcherEntry(value: [PropertyKey, unknown]): value is AnyMatcherEntry {\n\tconst [key, matcherValue] = value\n\treturn isString(key) && !isUndefined(matcherValue) && !isNull(matcherValue)\n}\n\nfunction isNodePropertyKey(node: CanvasNode, value: PropertyKey): value is NodePropertyKey {\n\treturn value in node\n}\n\nfunction isNodesDataProviderKey<T extends LooseNodesDataProvider>(\n\tnodesDataProvider: T,\n\tvalue: PropertyKey,\n): value is keyof T {\n\treturn isString(value) && value.startsWith(\"$\") && value in nodesDataProvider\n}\n", "/**\n * Pipeline context and stage matches carry data through the TreeLinter's tree-walking stages\n *\n * They carry type-safe information from userland, through tree-walking, and back to the execute() method in userland for e2e type-safety of the entire linting process\n */\n\nimport { assert } from \"@framerjs/shared\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { AnyMatcherArgument, ComputedNodeAccessors, InferGuardedNode } from \"./matchers.ts\"\n\nexport interface NodeMatch<TNode extends CanvasNode = CanvasNode> {\n\tnode: TNode\n\t$node: ComputedNodeAccessors<TNode>\n}\n\nexport interface StageMatch<TMatcher extends AnyMatcherArgument = AnyMatcherArgument> extends NodeMatch<\n\tInferGuardedNode<TMatcher>\n> {\n\tmatcher: TMatcher\n}\nexport function isStageMatch<TMatcher extends AnyMatcherArgument>(\n\tmatch: AnyStageMatch<TMatcher>,\n): match is StageMatch<TMatcher> {\n\treturn \"node\" in match && \"matcher\" in match\n}\n\nexport interface StageArrayMatch<TMatcher extends AnyMatcherArgument = AnyMatcherArgument> {\n\tmatcher: TMatcher\n\tarray: NodeMatch<InferGuardedNode<TMatcher>>[]\n}\nexport function isStageArrayMatch<TMatcher extends AnyMatcherArgument>(\n\tmatch: AnyStageMatch<TMatcher>,\n): match is StageArrayMatch<TMatcher> {\n\treturn \"array\" in match && \"matcher\" in match\n}\n\nexport type AnyStageMatch<TMatcher extends AnyMatcherArgument = AnyMatcherArgument> =\n\t| StageMatch<TMatcher>\n\t| StageArrayMatch<TMatcher>\n\ninterface PipelineState<TStages extends readonly AnyStageMatch[] = readonly AnyStageMatch[]> {\n\tstages: TStages\n}\n\nexport interface PipelineContext<TStages extends readonly AnyStageMatch[] = readonly AnyStageMatch[]> {\n\tnode: CanvasNode\n\tstate: PipelineState<TStages>\n}\n\nexport type StageOutput<TStage extends AnyStageMatch = AnyStageMatch> = Iterable<TStage>\n\nexport type PipelineStage<TStage extends AnyStageMatch = AnyStageMatch> = (\n\tpayload: PipelineContext,\n) => StageOutput<TStage>\n\nexport type Stages = readonly AnyStageMatch[]\n\nexport function createInitialContext(node: CanvasNode): PipelineContext<[]> {\n\treturn {\n\t\tnode,\n\t\tstate: {\n\t\t\tstages: [],\n\t\t},\n\t}\n}\n\nexport function advancePipeline<TStages extends readonly AnyStageMatch[], TNextStage extends AnyStageMatch>(\n\tpayload: PipelineContext<TStages>,\n\tnext: TNextStage,\n): PipelineContext<[...TStages, TNextStage]> {\n\treturn {\n\t\tnode: getContinuationNode(next),\n\t\tstate: {\n\t\t\tstages: [...payload.state.stages, next],\n\t\t},\n\t}\n}\n\nexport function hasCompletedStages<TStages extends readonly AnyStageMatch[]>(\n\tstages: readonly AnyStageMatch[],\n\texpectedLength: TStages[\"length\"],\n): stages is TStages {\n\treturn stages.length === expectedLength\n}\n\n// Array Stages are currently only used for walking up parents.\n// This means we can chain off the top-most parent match\nfunction getContinuationNode(stage: AnyStageMatch): CanvasNode {\n\tif (isStageArrayMatch(stage)) {\n\t\tconst lastMatchedNode = stage.array.at(-1)?.node\n\t\tassert(lastMatchedNode, \"Payload array stage must have at least one match to continue\")\n\t\treturn lastMatchedNode\n\t}\n\n\treturn stage.node\n}\n", "import { assert, assertNever } from \"@framerjs/shared\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport type { NodesDataProvider } from \"./NodesDataProvider.ts\"\nimport { createComputedNodeAccessors, createMatchChecker } from \"./matchers.ts\"\nimport type { Exact, NodeMatcher, NodeMatcherArgument, MatcherConditions } from \"./matchers.ts\"\nimport {\n\tcreateInitialContext,\n\tadvancePipeline,\n\thasCompletedStages,\n\ttype AnyStageMatch,\n\ttype PipelineStage,\n\ttype StageOutput,\n\ttype PipelineContext,\n\ttype StageArrayMatch,\n\ttype NodeMatch,\n\ttype StageMatch,\n\ttype Stages,\n\tisStageMatch,\n\tisStageArrayMatch,\n} from \"./payloads.ts\"\n\ninterface ExecutionYield {\n\tlevel: \"warning\" | \"error\"\n\tmessage: string\n\t/**\n\t * Define which nodes this problem relates to.\n\t *\n\t * @default all Node IDs from all stages\n\t */\n\tnodeIds?: NodeID[]\n}\nexport interface LintProblem {\n\tlevel: \"warning\" | \"error\"\n\tmessage: string\n\tnodeIds: NodeID[]\n}\n\nexport interface LinterConfig {\n\tnodesToLint: readonly CanvasNode[]\n\tnodesDataProvider: NodesDataProvider\n}\n\nexport class TreeLinter<TStages extends Stages = []> {\n\tprotected constructor(\n\t\tprotected readonly config: LinterConfig,\n\t\tprotected readonly stages: PipelineStage[] = [],\n\t) {}\n\n\tstatic init(config: LinterConfig) {\n\t\tconst nodes = config.nodesToLint\n\n\t\treturn new TreeLinter<[]>({\n\t\t\t...config,\n\t\t\tnodesToLint: nodes,\n\t\t})\n\t}\n\n\t/**\n\t * Find all children of the previous stage's matches which meet the provided conditions\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfind<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t\topts?: DescendantsConfig,\n\t): ChainableTreeLinter<[...TStages, StageMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tconst maxDepth = (opts?.immediateOnly ? 1 : opts?.maxDepth) ?? Infinity\n\t\tassert(maxDepth > 0, \"maxDepth must be greater than 0 if defined\")\n\n\t\t// On the first ever walk the node we want may be the top one,\n\t\t// but from there on we would never want to find the same node twice in a row\n\t\tconst includeCurrentNode = this.stages.length === 0\n\n\t\tfunction* findMatch({ node }: PipelineContext): StageOutput {\n\t\t\tconst depthTracker = createDepthTracker(node)\n\n\t\t\tfor (const { node: child, skipChildren } of node.walkWithSkipChildren()) {\n\t\t\t\tif (child.id === node.id && !includeCurrentNode) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst depth = depthTracker.getDepth(child)\n\t\t\t\tif (depth >= maxDepth) {\n\t\t\t\t\tskipChildren()\n\t\t\t\t}\n\n\t\t\t\tif (!matchChecker.isMatch(child)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tyield {\n\t\t\t\t\tmatcher: matchChecker.matcher,\n\t\t\t\t\tnode: child,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, child),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new ChainableTreeLinter(this.config, [...this.stages, findMatch])\n\t}\n\n\t/**\n\t * Find the ground nodes (like a Breakpoint) of the previous stage's matches which meet the provided conditions\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfindAncestorGroundNode<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t): ChainableTreeLinter<[...TStages, StageMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tfunction* findMatch({ node }: PipelineContext): StageOutput {\n\t\t\tconst tree = node.tree()\n\t\t\tassert(tree, \"Expected node to be part of a tree\")\n\n\t\t\tconst groundNode = tree.getGroundNodeFor(node)\n\t\t\tif (matchChecker.isMatch(groundNode)) {\n\t\t\t\tyield {\n\t\t\t\t\tmatcher: matchChecker.matcher,\n\t\t\t\t\tnode: groundNode,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, groundNode),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new ChainableTreeLinter(this.config, [...this.stages, findMatch])\n\t}\n\n\t/**\n\t * Find the scope nodes (like a WebPageNode or DesignPageNode) of the previous stage's matches which meet the provided conditions\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfindAncestorScopeNode<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t): ChainableTreeLinter<[...TStages, StageMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tfunction* findMatch({ node }: PipelineContext): StageOutput {\n\t\t\tconst tree = node.tree()\n\t\t\tassert(tree, \"Expected node to be part of a tree\")\n\n\t\t\tconst scopeNode = tree.getScopeNodeFor(node)\n\t\t\tif (!scopeNode) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (matchChecker.isMatch(scopeNode)) {\n\t\t\t\tyield {\n\t\t\t\t\tmatcher: matchChecker.matcher,\n\t\t\t\t\tnode: scopeNode,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, scopeNode),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new ChainableTreeLinter(this.config, [...this.stages, findMatch])\n\t}\n}\n\ninterface AncestorsConfig {\n\t/**\n\t * When true, only the direct parent is considered.\n\t *\n\t * @default false\n\t */\n\timmediateOnly?: boolean\n\t/**\n\t * When true, search will stop after the first match when walking up the tree\n\t *\n\t * @default false\n\t */\n\tnearestOnly?: boolean\n}\ninterface DescendantsConfig {\n\t/**\n\t * When true, only the direct children are considered.\n\t *\n\t * @default false\n\t */\n\timmediateOnly?: boolean\n\t/**\n\t * Maximum descendant depth to search, where direct children are depth 1.\n\t *\n\t * @default unlimited\n\t */\n\tmaxDepth?: number\n}\n\nclass ChainableTreeLinter<TStages extends Stages> extends TreeLinter<TStages> {\n\t/**\n\t * Find all children or descendants of the previous stage's matches and collect them into a single array stage.\n\t *\n\t * This is a terminal operation and must be followed by execute().\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfindAll<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t\topts?: DescendantsConfig,\n\t): TerminalTreeLinter<[...TStages, StageArrayMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tfunction* findAllMatches(payload: PipelineContext): StageOutput<StageArrayMatch> {\n\t\t\tconst node = payload.node\n\t\t\tconst array: NodeMatch[] = []\n\n\t\t\tconst maxDepth = (opts?.immediateOnly ? 1 : opts?.maxDepth) ?? Infinity\n\t\t\tassert(maxDepth > 0, \"maxDepth must be greater than 0 if defined\")\n\n\t\t\tconst depthTracker = createDepthTracker(node)\n\t\t\tfor (const { node: child, skipChildren } of node.walkWithSkipChildren()) {\n\t\t\t\tif (child.id === node.id) {\n\t\t\t\t\t// we only care about descendants\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst depth = depthTracker.getDepth(child)\n\t\t\t\tif (depth >= maxDepth) {\n\t\t\t\t\tskipChildren()\n\t\t\t\t}\n\n\t\t\t\tif (!matchChecker.isMatch(child)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tarray.push({\n\t\t\t\t\tnode: child,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, child),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (array.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tyield { matcher: matchChecker.matcher, array }\n\t\t}\n\n\t\t// findAll does not provide a continuation strategy for further matching stages\n\t\t// so for now we just return a terminal linter to avoid needing a solution to this problem.\n\t\t// Context: findAllAncestors continues from the top-most matching ancestor,\n\t\t//   but with findAll continuation could cause a branch explosion, so we won't solve\n\t\t//   this until it's needed and we know our requirements.\n\t\treturn asTerminalTreeLinter(new ChainableTreeLinter(this.config, [...this.stages, findAllMatches]))\n\t}\n\n\t/**\n\t * Find ancestors of the previous stage's matches which meet the provided conditions\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfindAncestors<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t\topts?: AncestorsConfig,\n\t): ChainableTreeLinter<[...TStages, StageMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tfunction* findAncestor(payload: PipelineContext): StageOutput {\n\t\t\t// payload.node is captured from nodesToLint and may have been removed\n\t\t\t// from the tree between snapshot and lint. ancestors() asserts on tree\n\t\t\t// membership and would throw; skip the stage silently instead.\n\t\t\tif (!payload.node.tree()?.has(payload.node.id)) return\n\t\t\tfor (const currentNode of payload.node.ancestors()) {\n\t\t\t\tif (!matchChecker.isMatch(currentNode)) {\n\t\t\t\t\tif (opts?.immediateOnly) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tyield {\n\t\t\t\t\tmatcher: matchChecker.matcher,\n\t\t\t\t\tnode: currentNode,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, currentNode),\n\t\t\t\t}\n\n\t\t\t\tif (opts?.nearestOnly) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (opts?.immediateOnly) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new ChainableTreeLinter(this.config, [...this.stages, findAncestor])\n\t}\n\n\t/**\n\t * Find ancestors of the previous stage's matches and collect all matching ancestors into a single array stage\n\t *\n\t * - all conditions inside a matcher must be met for a node to be included\n\t * - array conditions inside a matcher are treated as \"or\" conditions\n\t */\n\tfindAllAncestors<\n\t\tconst TNode extends CanvasNode = CanvasNode,\n\t\tconst TMatcher extends MatcherConditions<TNode> = MatcherConditions<TNode>,\n\t>(\n\t\tmatcherConfig: NodeMatcherArgument<TNode, TMatcher>,\n\t): ChainableTreeLinter<[...TStages, StageArrayMatch<NodeMatcher<TNode, TMatcher>>]> {\n\t\tconst config = this.config\n\t\tconst matchChecker = createMatchChecker(config.nodesDataProvider, matcherConfig)\n\n\t\tfunction* findAncestorArray(payload: PipelineContext): StageOutput<StageArrayMatch> {\n\t\t\tif (!payload.node.tree()?.has(payload.node.id)) return\n\t\t\tconst array: NodeMatch[] = []\n\n\t\t\tfor (const currentNode of payload.node.ancestors()) {\n\t\t\t\tif (!matchChecker.isMatch(currentNode)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tarray.push({\n\t\t\t\t\tnode: currentNode,\n\t\t\t\t\t$node: createComputedNodeAccessors(config.nodesDataProvider, currentNode),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (array.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tyield { matcher: matchChecker.matcher, array }\n\t\t}\n\n\t\treturn new ChainableTreeLinter(this.config, [...this.stages, findAncestorArray])\n\t}\n\n\t*execute<const TYield extends ExecutionYield>(\n\t\tcreateLintResults: (matches: TStages) => Generator<Exact<TYield, ExecutionYield>, void, void>,\n\t): Generator<LintProblem> {\n\t\tconst stages = this.stages\n\t\tif (stages.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { isRedundant } = createBranchPruner()\n\n\t\tfunction* walkForLintProblems(payload: PipelineContext, stageIndex = 0): Generator<LintProblem> {\n\t\t\tif (stageIndex >= stages.length) {\n\t\t\t\tassert(\n\t\t\t\t\thasCompletedStages<TStages>(payload.state.stages, stages.length),\n\t\t\t\t\t\"Expected payload state to contain all matcher stages\",\n\t\t\t\t)\n\n\t\t\t\tfor (const lintResult of createLintResults(payload.state.stages)) {\n\t\t\t\t\tyield {\n\t\t\t\t\t\t...lintResult,\n\t\t\t\t\t\tnodeIds:\n\t\t\t\t\t\t\tlintResult.nodeIds && lintResult.nodeIds.length > 0\n\t\t\t\t\t\t\t\t? lintResult.nodeIds\n\t\t\t\t\t\t\t\t: payload.state.stages.flatMap(getStageMatchNodeIds),\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst stage = stages[stageIndex]\n\t\t\tassert(stage, `Missing stage at index ${stageIndex}`)\n\n\t\t\tfor (const stageResult of stage(payload)) {\n\t\t\t\tif (isRedundant(stageIndex, stageResult)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tyield* walkForLintProblems(advancePipeline(payload, stageResult), stageIndex + 1)\n\t\t\t}\n\t\t}\n\n\t\tfor (const node of this.config.nodesToLint) {\n\t\t\tyield* walkForLintProblems(createInitialContext(node))\n\t\t}\n\t}\n}\n\n/**\n * TerminalTreeLinter cannot further tree-walk and must call execute() to produce lint results. This is useful for stages like findAll which would produce a combinatorial explosion of matches if they were allowed to continue being chained.\n */\ntype TerminalTreeLinter<TStages extends Stages> = Pick<ChainableTreeLinter<TStages>, \"execute\">\nfunction asTerminalTreeLinter<TStages extends Stages>(\n\tlinter: ChainableTreeLinter<TStages>,\n): TerminalTreeLinter<TStages> {\n\treturn linter\n}\n\nfunction createDepthTracker(rootNode: CanvasNode) {\n\tconst depthByNodeId = new Map([[rootNode.id, 0]])\n\n\treturn {\n\t\tgetDepth(node: CanvasNode) {\n\t\t\tconst cachedDepth = depthByNodeId.get(node.id)\n\t\t\tif (cachedDepth !== undefined) {\n\t\t\t\treturn cachedDepth\n\t\t\t}\n\n\t\t\tassert(node.parentid, `Expected ${node.id} to have a parent when tracking descendant depth`)\n\n\t\t\tconst parentDepth = depthByNodeId.get(node.parentid)\n\t\t\tassert(!isUndefined(parentDepth), `Expected parent ${node.parentid} depth to be known before ${node.id}`)\n\n\t\t\tconst depth = parentDepth + 1\n\t\t\tdepthByNodeId.set(node.id, depth)\n\t\t\treturn depth\n\t\t},\n\t}\n}\n\nfunction getStageMatchNodeIds(stage: AnyStageMatch) {\n\tif (isStageMatch(stage)) {\n\t\treturn [stage.node.id]\n\t}\n\tif (isStageArrayMatch(stage)) {\n\t\treturn stage.array.map(match => match.node.id)\n\t}\n\n\tassertNever(stage, `Unknown stage type: ${JSON.stringify(stage)}`)\n}\n\n/**\n * During linting, it's common to begin walking from a large number of nodes\n *\n * These nodes may be siblings, ancestors, or descendants of each other\n *\n * Therefore the stage-0 may result in identical matches being found multiple times,\n * and because >= stage-1 matches are pure functions of stage-0, duplicate calls to execute() occur\n *\n * The pruner identifies branches whose walk would be redundant with one we've already\n * processed, so the caller can skip them and avoid re-walking identical sub-pipelines.\n */\nfunction createBranchPruner(): { isRedundant: (stageIndex: number, match: AnyStageMatch) => boolean } {\n\tconst seenNodeIds = new Set<string>()\n\n\treturn {\n\t\tisRedundant(stageIndex, stageResult) {\n\t\t\tif (stageIndex > 0) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tisStageMatch(stageResult),\n\t\t\t\t\"First stage must yield a StageMatch. StageArrayMatch support not currently available for stage-0 at time of writing. Add support if you need it\",\n\t\t\t)\n\n\t\t\tif (seenNodeIds.has(stageResult.node.id)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tseenNodeIds.add(stageResult.node.id)\n\t\t\treturn false\n\t\t},\n\t}\n}\n", "import type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isNull, isUndefined } from \"utils/typeChecks.ts\"\nimport type { MatcherNodeKey, MatcherNodeValue, NodeMatcherGuard } from \"./matchers.ts\"\n\nexport function isSet(value: unknown): boolean\nexport function isSet<TNode extends CanvasNode, TKey extends MatcherNodeKey<TNode>>(\n\tvalue: MatcherNodeValue<TNode, TKey>,\n): boolean\nexport function isSet<TNode extends CanvasNode, TKey extends MatcherNodeKey<TNode>>(\n\tvalue: MatcherNodeValue<TNode, TKey>,\n): boolean {\n\treturn !isUnset(value)\n}\n\nexport function isUnset<TNode extends CanvasNode, TKey extends MatcherNodeKey<TNode>>(\n\tvalue: MatcherNodeValue<TNode, TKey>,\n): boolean {\n\treturn isUndefined(value) || isNull(value)\n}\n\nexport function isEnabled<TNode extends CanvasNode, TKey extends MatcherNodeKey<TNode>>(\n\tvalue: MatcherNodeValue<TNode, TKey>,\n): boolean {\n\treturn isSet(value) && value !== false\n}\n\nexport function createGuard<const TFn extends NodeMatcherGuard>(fn: TFn): TFn {\n\treturn fn\n}\n", "import { record } from \"web/lib/tracker.ts\"\n\ninterface UnhandledCaseRecorder {\n\trecordCase(caseName: string, state: Record<string, unknown>): void\n}\n\nexport function getUnhandledCaseRecorder(namespace: string): UnhandledCaseRecorder {\n\treturn {\n\t\trecordCase(caseName, state) {\n\t\t\trecord(\"agent_unhandled_case\", {\n\t\t\t\tcase: `${namespace}/${caseName}`,\n\t\t\t\tstate: JSON.stringify(state),\n\t\t\t})\n\t\t},\n\t}\n}\n", "import { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { withBorder } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport { borderPropsForNode } from \"document/models/CanvasTree/traits/utils/borderForNode.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { isEnabled } from \"../lib/predicates.ts\"\nimport { getUnhandledCaseRecorder } from \"../utils/getUnhandledCaseRecorder.ts\"\n\nconst unhandled = getUnhandledCaseRecorder(\"border_is_incomplete_rule\")\n\nexport function borderIsIncomplete(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: withBorder,\n\t\t\tborderEnabled: isEnabled,\n\t\t})\n\t\t.execute(function* ([nodeMatch]) {\n\t\t\tconst borderProps = borderPropsForNode(nodeMatch.node)\n\t\t\tconst isDynamic = isDynamicValue(nodeMatch.node.borderEnabled)\n\n\t\t\tconst missing: string[] = []\n\t\t\tif (borderProps.borderWidth === undefined) missing.push(\"width\")\n\t\t\tif (borderProps.borderColor === undefined) missing.push(\"color\")\n\n\t\t\tif (missing.length === 0) return\n\n\t\t\tif (isDynamic) {\n\t\t\t\tunhandled.recordCase(\"dynamic_border_value\", { nodeId: nodeMatch.node.id, missing })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tyield {\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: `Borders are incomplete. Missing: ${missing.join(\", \")}.`,\n\t\t\t}\n\t\t})\n}\n", "export default () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26D3\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26F9(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC3\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC08\\uDC26](?:\\u200D\\u2B1B)?|[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC2\\uDECE-\\uDEDB\\uDEE0-\\uDEE8]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n", "import type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tisLayoutTemplateNode,\n\tisRichTextNode,\n\tisSmartComponentNode,\n\tisTextNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { hasFillEnabled, type WithFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { withOpacity } from \"document/models/CanvasTree/traits/WithOpacity.ts\"\nimport { isBreakpointVariant, isSmartComponentVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport emojiRegex from \"emoji-regex\"\nimport type { WithOpacity } from \"library/index.ts\"\nimport { Color } from \"library/render/types/Color/Color.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport pluralize from \"pluralize\"\nimport { isNumber, isUndefined } from \"utils/typeChecks.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { RuleConfig } from \"../lib/RuleConfig.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { createGuard } from \"../lib/predicates.ts\"\nimport type { FillStops } from \"../utils/fill.ts\"\nimport { getUnhandledCaseRecorder } from \"../utils/getUnhandledCaseRecorder.ts\"\n\nconst unhandled = getUnhandledCaseRecorder(\"color_contrast_rule\")\n\n// Thresholds are deliberately softer than WCAG (which starts at 4.5) \u2014 Framer prioritises\n// creative freedom over strict accessibility compliance. Bolder/heavier text needs less\n// contrast to remain legible; thin text needs more. Numbers are provisional and should be\n// calibrated against real Framer designs before we commit to them in the long term.\nconst contrastThresholdBold = 1.5\nconst contrastThresholdNormal = 1.8\nconst contrastThresholdThin = 2.2\nconst defaultConfig: RuleConfig = { themes: new Set([\"light\"]) }\nconst emojiPresentationPattern = /\\p{Emoji_Presentation}/u\nconst emojiModifierPattern = /\\p{Emoji_Modifier}/u\nconst emojiVariationSelector = String.fromCodePoint(0xfe0f)\nconst textVariationSelector = String.fromCodePoint(0xfe0e)\nconst emojiKeycap = String.fromCodePoint(0x20e3)\nconst getEmojiRegex = (() => {\n\tlet expression: RegExp | undefined\n\treturn () => expression ?? (expression = emojiRegex())\n})()\n\nfunction getThresholdForWeight(weight: number | string | undefined): number {\n\tconst numeric = typeof weight === \"number\" ? weight : Number(weight)\n\tif (!Number.isFinite(numeric)) return contrastThresholdNormal\n\tif (numeric >= 600) return contrastThresholdBold\n\tif (numeric <= 300) return contrastThresholdThin\n\treturn contrastThresholdNormal\n}\n\nfunction isEmojiPresentationMatch(match: string): boolean {\n\tconst firstCharacter = match[Symbol.iterator]().next().value\n\tif (!firstCharacter || match.includes(textVariationSelector)) return false\n\n\treturn (\n\t\temojiPresentationPattern.test(firstCharacter) ||\n\t\tmatch.includes(emojiVariationSelector) ||\n\t\tmatch.includes(emojiKeycap) ||\n\t\temojiModifierPattern.test(match)\n\t)\n}\n\nfunction isEmojiOnlyTextRun(text: string): boolean {\n\tconst trimmedText = text.trim()\n\tif (!trimmedText) return false\n\n\tconst expression = getEmojiRegex()\n\texpression.lastIndex = 0\n\tlet lastIndex = 0\n\tlet match: RegExpExecArray | null = null\n\n\twhile ((match = expression.exec(trimmedText))) {\n\t\tif (trimmedText.slice(lastIndex, match.index).trim()) return false\n\t\tif (!isEmojiPresentationMatch(match[0])) return false\n\n\t\tlastIndex = expression.lastIndex\n\t}\n\n\treturn lastIndex > 0 && trimmedText.slice(lastIndex).trim().length === 0\n}\n\nexport function colorContrast(linter: TreeLinter, config: RuleConfig = defaultConfig) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: createGuard(node => isRichTextNode(node) || isTextNode(node)),\n\t\t})\n\t\t.findAllAncestors({\n\t\t\tguard: createGuard((node): node is CanvasNode & WithFill & WithOpacity => {\n\t\t\t\tif (hasFillEnabled(node)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (withOpacity(node)) {\n\t\t\t\t\t// We only care about non-fill nodes when they could affect child opacity\n\t\t\t\t\tconst opacity = node.resolveValue(\"opacity\")\n\t\t\t\t\tif (isNumber(opacity) && opacity < 1) return true\n\t\t\t\t}\n\t\t\t\tif (isBreakpointVariant(node) || isSmartComponentVariant(node)) {\n\t\t\t\t\t// These variants should be our final ancestor even if their fill is not set.\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}),\n\t\t})\n\t\t.execute(function* ([textElement, backgroundElements]) {\n\t\t\tfor (const theme of config.themes) {\n\t\t\t\tconst textColors = textElement.$node.$textColors(theme)\n\t\t\t\tif (!textColors) {\n\t\t\t\t\tunhandled.recordCase(\"unhandled_text_colors\", {\n\t\t\t\t\t\tnodeId: textElement.node.id,\n\t\t\t\t\t\tnode: textElement.node.toJS(),\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst scopeNode = textElement.node.tree()?.getScopeNodeFor(textElement.node)\n\t\t\t\tassert(scopeNode, \"Expected text element to be part of a tree\")\n\t\t\t\tconst scopeUsesLayoutTemplate = isWebPageNode(scopeNode) && !!scopeNode.layoutTemplateIdentifier\n\t\t\t\tconst banTransparentOnBreakpoint =\n\t\t\t\t\t(isWebPageNode(scopeNode) && !scopeUsesLayoutTemplate) || isLayoutTemplateNode(scopeNode)\n\n\t\t\t\tfor (const match of backgroundElements.array) {\n\t\t\t\t\tif (isBreakpointVariant(match.node) && scopeUsesLayoutTemplate) continue\n\n\t\t\t\t\tconst backgroundColor = match.$node.$fillColor(theme)\n\t\t\t\t\tif (isUndefined(backgroundColor) || backgroundColor.isOpaque) continue\n\n\t\t\t\t\tconst opaqueVariantFillProblem = createOpaqueVariantFillProblem(\n\t\t\t\t\t\tmatch.node,\n\t\t\t\t\t\tscopeNode,\n\t\t\t\t\t\tbanTransparentOnBreakpoint,\n\t\t\t\t\t)\n\t\t\t\t\tif (opaqueVariantFillProblem) {\n\t\t\t\t\t\tyield opaqueVariantFillProblem\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst backgroundColorVerticals: (FillStops & { nodeId: string })[] = []\n\t\t\t\tlet fansOutOnGradientStops = false\n\t\t\t\tlet foundComputedFill = false\n\t\t\t\tfor (let index = 0; index < backgroundElements.array.length; index++) {\n\t\t\t\t\tconst isFinalAncestor = index === backgroundElements.array.length - 1\n\t\t\t\t\tconst match = backgroundElements.array[index]\n\t\t\t\t\tassert(match, \"Expected background fill to be defined\")\n\n\t\t\t\t\tif (isBreakpointVariant(match.node) && scopeUsesLayoutTemplate) {\n\t\t\t\t\t\t// Layout templates can have a separate background fill which is not part of the\n\t\t\t\t\t\t// normal ancestor chain. We do not check this for now (but in the future should)\n\t\t\t\t\t\tunhandled.recordCase(\"layout_template_background\", {\n\t\t\t\t\t\t\tnodeId: match.node.id,\n\t\t\t\t\t\t\tscopeNodeId: scopeNode.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// We do not currently consider node-opacity, as the compositing for this is more complex, and it's a corner-case\n\t\t\t\t\t// However so long as we don't encounter a non-opaque node before the first opaque fill, the contrast ratio calculation\n\t\t\t\t\t// will still be acceptable (though not perfect if any higher node ancestor has opacity set)\n\t\t\t\t\tif (withOpacity(match.node)) {\n\t\t\t\t\t\tconst opacity = match.node.resolveValue(\"opacity\")\n\t\t\t\t\t\tif (isNumber(opacity) && opacity < 1) {\n\t\t\t\t\t\t\tunhandled.recordCase(\"background_node_opacity\", {\n\t\t\t\t\t\t\t\tnodeId: match.node.id,\n\t\t\t\t\t\t\t\topacity,\n\t\t\t\t\t\t\t\ttextNodeId: textElement.node.id,\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst backgroundColor = match.$node.$fillColor(theme)\n\t\t\t\t\tif (isUndefined(backgroundColor)) {\n\t\t\t\t\t\t// Unable to check text contrast because the background fill for node ${match.node.id} was not understood\n\t\t\t\t\t\t// by the linter, may be an image or other fill type which cannot be linted.\n\t\t\t\t\t\tunhandled.recordCase(\"unhandled_fill\", {\n\t\t\t\t\t\t\tnodeId: match.node.id,\n\t\t\t\t\t\t\tfill: match.node.fillColor,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isFinalAncestor && backgroundColor.isOpaque === false) {\n\t\t\t\t\t\tconst opaqueVariantFillProblem = createOpaqueVariantFillProblem(\n\t\t\t\t\t\t\tmatch.node,\n\t\t\t\t\t\t\tscopeNode,\n\t\t\t\t\t\t\tbanTransparentOnBreakpoint,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (opaqueVariantFillProblem) {\n\t\t\t\t\t\t\tyield opaqueVariantFillProblem\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tunhandled.recordCase(\"top_ancestor_non_opaque_fill\", {\n\t\t\t\t\t\t\tnode: match.node.toJS(),\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tbackgroundColor.colors.length > 0,\n\t\t\t\t\t\t\"Expected at least one color from the background fill, or nothing if it couldn't be parsed. This implies a bug\",\n\t\t\t\t\t)\n\n\t\t\t\t\tbackgroundColorVerticals.push({ ...backgroundColor, nodeId: match.node.id })\n\t\t\t\t\tfansOutOnGradientStops ||= backgroundColor.type === \"gradient\" && backgroundColor.colors.length > 1\n\n\t\t\t\t\t// Because of the complex interactions of computed values we\n\t\t\t\t\t// do not want to composite them with each other yet.\n\t\t\t\t\t// So if we encounter two via transparency fallthrough we log it and give up\n\t\t\t\t\tif (backgroundColor.type === \"computed\") {\n\t\t\t\t\t\tif (foundComputedFill) {\n\t\t\t\t\t\t\tconst computedVerticals = backgroundColorVerticals.filter(vertical => vertical.type === \"computed\")\n\t\t\t\t\t\t\tunhandled.recordCase(\"multiple_computed_background_fills\", {\n\t\t\t\t\t\t\t\ttextNodeId: textElement.node.id,\n\t\t\t\t\t\t\t\tnodeIds: computedVerticals.map(vertical => vertical.nodeId),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfoundComputedFill = true\n\t\t\t\t\t}\n\n\t\t\t\t\tif (backgroundColor.isOpaque) {\n\t\t\t\t\t\t// Anything past this point will not be visible\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst perceivedAncestorBackgrounds = Array.from(\n\t\t\t\t\ttoPerceivedBackgroundColoursAtEachStop(backgroundColorVerticals),\n\t\t\t\t)\n\t\t\t\tfor (const textColor of textColors) {\n\t\t\t\t\tif (isEmojiOnlyTextRun(textColor.text)) continue\n\n\t\t\t\t\tconst foreground = textColor.color\n\t\t\t\t\tif (!foreground) {\n\t\t\t\t\t\tunhandled.recordCase(\"unhandled_resolved_text_color\", {\n\t\t\t\t\t\t\tnodeId: textElement.node.id,\n\t\t\t\t\t\t\tnode: textElement.node.toJS(),\n\t\t\t\t\t\t\ttextColors,\n\t\t\t\t\t\t\ttextColor,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst thresholdForWeight = getThresholdForWeight(textColor.weight)\n\t\t\t\t\tconst textBackgroundOrTransparent = textColor.background ?? Color(\"transparent\")\n\t\t\t\t\tconst problems = new Map<string, number>()\n\n\t\t\t\t\tfor (const ancestorBackground of perceivedAncestorBackgrounds) {\n\t\t\t\t\t\tconst background = Color.alphaComposite(textBackgroundOrTransparent, ancestorBackground)\n\n\t\t\t\t\t\tconst ratio = contrastRatio(foreground, background)\n\t\t\t\t\t\tif (ratio >= thresholdForWeight) continue\n\n\t\t\t\t\t\tproblems.set(background.toValue(), ratio)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (problems.size > 0) {\n\t\t\t\t\t\tconst backgroundSummaries = Array.from(problems.entries())\n\t\t\t\t\t\t\t.map(([background, ratio]) => `${ratio.toFixed(1)} for ${escapeValue(background)}`)\n\t\t\t\t\t\t\t.join(\", \")\n\n\t\t\t\t\t\tconst nodeOpacityNode = isUndefined(textColor.nodeOpacity)\n\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t: ` (includes node opacity ${textColor.nodeOpacity})`\n\n\t\t\t\t\t\tconst gradientStopsNote = fansOutOnGradientStops ? \" (sampled from gradient stops)\" : \"\"\n\n\t\t\t\t\t\tconst fontWeight = formatFontWeight(textColor.weight)\n\t\t\t\t\t\tconst fontWeightNote = fontWeight ? ` weight=${escapeValue(fontWeight)}` : \"\"\n\n\t\t\t\t\t\tconst subject = textColor.subject ?? `text=\"${textColor.text.trim().slice(0, 40)}\"`\n\t\t\t\t\t\tconst themeNote = config.themes.size > 1 ? ` in ${theme} theme` : \"\"\n\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tmessage: `Contrast ratio of ${subject}${themeNote}${fontWeightNote} color=${escapeValue(foreground.toValue())}${nodeOpacityNode} should be >= ${thresholdForWeight.toFixed(1)}. Background contrast ${pluralize(\"ratio\", problems.size)}: ${backgroundSummaries}${gradientStopsNote}`,\n\t\t\t\t\t\t\tnodeIds: [textColor.id, ...backgroundColorVerticals.map(match => match.nodeId)],\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n}\n\nfunction createOpaqueVariantFillProblem(node: CanvasNode, scopeNode: CanvasNode, banTransparentOnBreakpoint: boolean) {\n\tif (isBreakpointVariant(node) && banTransparentOnBreakpoint) {\n\t\treturn {\n\t\t\tlevel: \"error\" as const,\n\t\t\tmessage: \"Breakpoints must have an opaque background fill\",\n\t\t\tnodeIds: [node.id],\n\t\t}\n\t}\n\n\tif (isSmartComponentVariant(node) && isSmartComponentNode(scopeNode)) {\n\t\treturn {\n\t\t\tlevel: \"warning\" as const,\n\t\t\tmessage:\n\t\t\t\t\"Component variants should usually have an opaque background fill so text remains legible on different backgrounds\",\n\t\t\tnodeIds: [node.id],\n\t\t}\n\t}\n}\n\nfunction formatFontWeight(weight: number | string | undefined): string | undefined {\n\tif (typeof weight === \"number\") return String(weight)\n\tif (typeof weight === \"string\" && weight.trim().length > 0) return weight\n\treturn undefined\n}\n\n// Contrast checks based on WCAG calculations, but ratios are Framer specific\nfunction contrastRatio(foreground: Color, background: Color) {\n\tconst foregroundLuminance = Color.luminance(Color.alphaComposite(foreground, background))\n\tconst backgroundLuminance = Color.luminance(background)\n\tconst lighter = Math.max(foregroundLuminance, backgroundLuminance)\n\tconst darker = Math.min(foregroundLuminance, backgroundLuminance)\n\n\treturn (lighter + 0.05) / (darker + 0.05)\n}\n\n// Each background could in theory be a gradient.\n// We recurse to the rearmost layer first so alpha blending happens back-to-front.\nfunction* toPerceivedBackgroundColoursAtEachStop(backgrounds: FillStops[], depth: number = 0): Generator<Color, void> {\n\tconst layer = backgrounds[depth]\n\tif (!layer) {\n\t\tyield Color(\"white\")\n\t\treturn\n\t}\n\n\tfor (const color of layer.colors) {\n\t\tif (color.a === 1) {\n\t\t\tyield color\n\t\t\tcontinue\n\t\t}\n\n\t\tfor (const backgroundBelow of toPerceivedBackgroundColoursAtEachStop(backgrounds, depth + 1)) {\n\t\t\tyield Color.alphaComposite(color, backgroundBelow)\n\t\t}\n\t}\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { breakpointVariantDefaults } from \"document/components/utils/breakpointVariantDefaults.ts\"\nimport type { FrameNode } from \"document/models/CanvasTree/index.ts\"\nimport { isCodeComponentNode, isFrameNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isBreakpointVariant, type WithBreakpoint } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { ControlType, type EnumControlDescription } from \"library/index.ts\"\nimport pluralize from \"pluralize\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { createGuard } from \"../lib/predicates.ts\"\nimport { getUnhandledCaseRecorder } from \"../utils/getUnhandledCaseRecorder.ts\"\n\nconst unhandled = getUnhandledCaseRecorder(\"component_variant_matches_breakpoint_rule\")\n\nexport function componentVariantMatchesBreakpoint(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: createGuard(node => isCodeComponentNode(node)),\n\t\t\tisVectorInstance: v => !v,\n\t\t\t$$componentLoader: loader => {\n\t\t\t\tconst variant = loader.componentForIdentifier?.properties?.variant\n\t\t\t\treturn variant?.type === ControlType.Enum && Array.isArray(titlesOrOptionsFallback(variant))\n\t\t\t},\n\t\t})\n\t\t.findAncestorGroundNode({\n\t\t\tguard: createGuard(node => isFrameNode(node) && isBreakpointVariant(node)),\n\t\t})\n\t\t.execute(function* ([codeComponent, breakpoint]) {\n\t\t\tconst node = codeComponent.node\n\t\t\tconst breakpointName = resolveBreakpointName(breakpoint.node)\n\t\t\tconst breakpointKind = classifyNameAsKind(breakpointName)\n\n\t\t\tconst componentDefinition = codeComponent.$node.$componentLoader().componentForIdentifier\n\t\t\tconst variant = componentDefinition?.properties?.variant\n\t\t\tassert(\n\t\t\t\tcomponentDefinition && variant?.type === ControlType.Enum && Array.isArray(titlesOrOptionsFallback(variant)),\n\t\t\t\t\"Node Guard should have filtered for a variant enum already, so this is unexpected. Please check the guard logic for this lint rule.\",\n\t\t\t)\n\t\t\tconst controlProps = node.getControlProps(componentDefinition.properties)\n\n\t\t\tconst rawCurrentVariantId =\n\t\t\t\tcontrolProps.variant?.type === ControlType.Enum ? controlProps.variant.value : undefined\n\t\t\tconst currentVariantId = isDynamicValue(rawCurrentVariantId)\n\t\t\t\t? codeComponent.$node.$getResolvedControlPropValues().variant\n\t\t\t\t: rawCurrentVariantId\n\t\t\tassert(\n\t\t\t\tisString(currentVariantId),\n\t\t\t\t\"Expected variant control ID to be a string as anything else would be unexpected for a canvas-level instance\",\n\t\t\t)\n\n\t\t\tlet currentVariantIndex: number | undefined = undefined\n\t\t\tconst mostAppropriateVariantIndexes = new Set<number>()\n\t\t\tfor (let variantIndex = 0; variantIndex < titlesOrOptionsFallback(variant).length; variantIndex++) {\n\t\t\t\tconst id = variant.options?.[variantIndex]\n\t\t\t\tconst name = titlesOrOptionsFallback(variant)?.[variantIndex]\n\t\t\t\tif (!id || !isString(name)) continue\n\n\t\t\t\t// Track this for later\n\t\t\t\tif (currentVariantId === id) {\n\t\t\t\t\tcurrentVariantIndex = variantIndex\n\n\t\t\t\t\tif (name === breakpointName) {\n\t\t\t\t\t\t// exact name matches are authoritative when they're also the selected variant\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst variantKind = classifyNameAsKind(name)\n\t\t\t\tif (variantKind === breakpointKind) {\n\t\t\t\t\tmostAppropriateVariantIndexes.add(variantIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isUndefined(currentVariantIndex)) {\n\t\t\t\t// This is likely only possible if a variant has been removed while an instance is set to it\n\t\t\t\tyield {\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tmessage: `The current variant ID \"${currentVariantId}\" does not match any of the available options for this component`,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (mostAppropriateVariantIndexes.size === 0) {\n\t\t\t\tunhandled.recordCase(\"unclassified_variant_names\", {\n\t\t\t\t\tnodeId: node.id,\n\t\t\t\t\tbreakpointName,\n\t\t\t\t\tvariantTitles: titlesOrOptionsFallback(variant),\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (mostAppropriateVariantIndexes.has(currentVariantIndex)) {\n\t\t\t\t// if we agree on the selection, then we're good\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst matchTitles: string[] = []\n\t\t\tfor (const variantIndex of mostAppropriateVariantIndexes) {\n\t\t\t\tconst title = titlesOrOptionsFallback(variant)?.[variantIndex]\n\t\t\t\tif (isString(title)) {\n\t\t\t\t\tmatchTitles.push(title)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentVariantTitle = titlesOrOptionsFallback(variant)?.[currentVariantIndex]\n\n\t\t\tyield {\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage: `This component has ${matchTitles.length} matching ${pluralize(\"variant\", matchTitles.length)}: \\\"${matchTitles.join('\", \"')}\\\" for the \\\"${breakpointName}\\\" breakpoint, but is set to \\\"${currentVariantTitle}\\\".`,\n\t\t\t}\n\t\t})\n}\n\nfunction resolveBreakpointName(node: FrameNode & WithBreakpoint) {\n\tconst name = node.resolveValue(\"name\")\n\tif (isString(name)) {\n\t\treturn name\n\t}\n\n\tfor (const defaultBreakpoint of breakpointVariantDefaults) {\n\t\tif (node.width === defaultBreakpoint.width) {\n\t\t\treturn defaultBreakpoint.name\n\t\t}\n\t}\n\n\treturn Dictionary.Breakpoint\n}\n\nfunction classifyNameAsKind(breakpointOrVariantName: string): \"desktop\" | \"tablet\" | \"phone\" | symbol {\n\tif (/desktop|large|fullscreen/iu.test(breakpointOrVariantName)) {\n\t\treturn \"desktop\"\n\t}\n\tif (/tablet|ipad|medium/iu.test(breakpointOrVariantName)) {\n\t\treturn \"tablet\"\n\t}\n\tif (/phone|mobile|small/iu.test(breakpointOrVariantName)) {\n\t\treturn \"phone\"\n\t}\n\treturn Symbol(\"unknown\")\n}\n\nfunction titlesOrOptionsFallback(value: EnumControlDescription) {\n\treturn value.optionTitles ?? value.options\n}\n", "import type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport { isFixedOrRelativeOverlay } from \"document/models/CanvasTree/nodes/utils/overlayHelpers.ts\"\n\n/**\n * Returns true when the node is a fixed or relative overlay with no rect\n * dimensions set. Overlays are auto-expanded during creation and gain rect\n * dimensions then; before that (e.g. on a collapsed overlay after a project\n * reload) their rect is unreliable, so dimension-checking lint rules should\n * skip them.\n */\nexport function isUnmeasuredOverlay(node: CanvasNode): boolean {\n\treturn isFixedOrRelativeOverlay(node) && !node.cache.parentDirectedRect\n}\n", "import { isDrawableNode, type CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { DrawableNode } from \"document/models/CanvasTree/nodes/TreeNode.ts\"\nimport { isFixedOrRelativeOverlay } from \"document/models/CanvasTree/nodes/utils/overlayHelpers.ts\"\nimport { withDOMLayout } from \"document/models/CanvasTree/traits/WithDOMLayout.ts\"\nimport { withOverflow } from \"document/models/CanvasTree/traits/WithOverflow.ts\"\nimport { isRotated } from \"document/models/CanvasTree/traits/WithRotation.ts\"\nimport { hasNonIdentityTransforms } from \"document/models/CanvasTree/traits/WithTransforms.ts\"\nimport { isVisibleNode } from \"document/models/CanvasTree/traits/WithVisibility.ts\"\nimport { isPositionFixed } from \"document/models/CanvasTree/traits/utils/positionTypeHelpers.ts\"\nimport { Polygon } from \"library/render/types/Polygon.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { createGuard } from \"../lib/predicates.ts\"\nimport { getUnhandledCaseRecorder } from \"../utils/getUnhandledCaseRecorder.ts\"\nimport { isUnmeasuredOverlay } from \"../utils/overlay.ts\"\n\nconst unhandled = getUnhandledCaseRecorder(\"immediate_parent_overflow_rule\")\n\ntype Axis = \"x\" | \"y\"\n\nfunction axisGeometry(\n\tchildRect: { x: number; y: number; width: number; height: number },\n\tparentRect: { width: number; height: number },\n\taxis: Axis,\n) {\n\tif (axis === \"x\") {\n\t\treturn { start: childRect.x, size: childRect.width, parentSize: parentRect.width }\n\t}\n\treturn { start: childRect.y, size: childRect.height, parentSize: parentRect.height }\n}\n\nfunction overflowsPositionForAxis(\n\tchildRect: { x: number; y: number; width: number; height: number },\n\tparentRect: { width: number; height: number },\n\taxis: Axis,\n) {\n\tconst { start, size, parentSize } = axisGeometry(childRect, parentRect, axis)\n\treturn start < 0 || start + size > parentSize\n}\n\nfunction resolvedOverflowForAxis(parentNode: CanvasNode, axis: Axis) {\n\tif (!withOverflow(parentNode)) return \"visible\"\n\tconst axisKey: \"overflowX\" | \"overflowY\" = axis === \"x\" ? \"overflowX\" : \"overflowY\"\n\treturn parentNode.resolveValue(axisKey) ?? parentNode.resolveValue(\"overflow\") ?? \"visible\"\n}\n\nfunction clipsOverflowForAxis(parentNode: CanvasNode, axis: Axis) {\n\tconst overflow = resolvedOverflowForAxis(parentNode, axis)\n\treturn overflow === \"clip\" || overflow === \"hidden\"\n}\n\nfunction isWaitingForMeasuredDOMRect(node: CanvasNode) {\n\tif (!withDOMLayout(node)) return false\n\tif (!node.usesDOMRect()) return false\n\treturn node.getDOMRect() === null\n}\n\nexport function immediateParentOverflow(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: createGuard(\n\t\t\t\t(node): node is DrawableNode =>\n\t\t\t\t\tisDrawableNode(node) && !isPositionFixed(node) && !isFixedOrRelativeOverlay(node) && isVisibleNode(node),\n\t\t\t),\n\t\t})\n\t\t.findAncestors(\n\t\t\t{\n\t\t\t\tguard: createGuard((node): node is DrawableNode => isDrawableNode(node) && isVisibleNode(node)),\n\t\t\t},\n\t\t\t{ immediateOnly: true },\n\t\t)\n\t\t.execute(function* ([child, parent]) {\n\t\t\tconst childNode = child.node\n\t\t\tconst parentNode = parent.node\n\t\t\tif (isWaitingForMeasuredDOMRect(childNode) || isWaitingForMeasuredDOMRect(parentNode)) {\n\t\t\t\tunhandled.recordCase(\"waiting_for_dom_rect\", {\n\t\t\t\t\tchildNodeId: childNode.id,\n\t\t\t\t\tparentNodeId: parentNode.id,\n\t\t\t\t\tchildWaiting: isWaitingForMeasuredDOMRect(childNode),\n\t\t\t\t\tparentWaiting: isWaitingForMeasuredDOMRect(parentNode),\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// When the immediate parent is an overlay with no rect dimensions set\n\t\t\t// (e.g. a collapsed hover panel after a project reload) the parent rect\n\t\t\t// is unreliable and would produce false positives.\n\t\t\tif (isUnmeasuredOverlay(parentNode)) {\n\t\t\t\tunhandled.recordCase(\"unmeasured_overlay_parent\", {\n\t\t\t\t\tchildNodeId: childNode.id,\n\t\t\t\t\tparentNodeId: parentNode.id,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst childRect = child.$node.rect()\n\t\t\tconst parentRect = parent.$node.rect()\n\n\t\t\tconst warnX = overflowsPositionForAxis(childRect, parentRect, \"x\") && clipsOverflowForAxis(parentNode, \"x\")\n\t\t\tconst warnY = overflowsPositionForAxis(childRect, parentRect, \"y\") && clipsOverflowForAxis(parentNode, \"y\")\n\n\t\t\tif (warnX || warnY) {\n\t\t\t\tyield {\n\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"This element is positioned outside its parent's bounds, and the parent clips overflow. It may be partially or fully hidden.\",\n\t\t\t\t\tnodeIds: [childNode.id, parentNode.id],\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Canvas-space polygon containment for transformed elements\n\t\t\tif (!hasNonIdentityTransforms(childNode) && !isRotated(childNode)) return\n\t\t\tif (!clipsOverflowForAxis(parentNode, \"x\") && !clipsOverflowForAxis(parentNode, \"y\")) return\n\n\t\t\tconst childCorners = child.$node.$canvasCornerPoints()\n\t\t\tconst parentCorners = parent.$node.$canvasCornerPoints()\n\t\t\tif (Polygon.contains(parentCorners, childCorners)) return\n\n\t\t\tyield {\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"This element's transform causes it to extend beyond its parent's bounds, and the parent clips overflow. It may be partially or fully hidden.\",\n\t\t\t\tnodeIds: [childNode.id, parentNode.id],\n\t\t\t}\n\t\t})\n}\n", "import {\n\tcompatibleOverflowCounterpart,\n\tisAxisOverflowCompatible,\n\tisOverflowValue,\n\twithOverflow,\n} from \"document/models/CanvasTree/traits/WithOverflow.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\n\nexport function incompatibleOverflow(linter: TreeLinter) {\n\treturn linter.find({ guard: withOverflow }).execute(function* ([nodeMatch]) {\n\t\tconst node = nodeMatch.node\n\t\tconst mainOverflow = node.resolveValue(\"overflow\")\n\t\tif (!isOverflowValue(mainOverflow)) return\n\n\t\tfor (const axisKey of [\"overflowX\", \"overflowY\"] as const) {\n\t\t\tconst axisValue = node.resolveValue(axisKey)\n\t\t\tif (!isOverflowValue(axisValue)) continue\n\t\t\tif (isAxisOverflowCompatible(mainOverflow, axisValue)) continue\n\n\t\t\tconst compatible = compatibleOverflowCounterpart[mainOverflow]\n\t\t\tyield {\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: `${axisKey} ${escapeValue(axisValue)} is incompatible with overflow ${escapeValue(mainOverflow)} and will be ignored in the published site. Use ${escapeValue(compatible)} or ${escapeValue(mainOverflow)} instead.`,\n\t\t\t}\n\t\t}\n\t})\n}\n", "import { assert } from \"@framerjs/shared\"\nimport type { CanvasTree } from \"document/models/CanvasTree/CanvasTree.ts\"\nimport { isNavigationAction } from \"document/models/CanvasTree/actions/navigationActions.ts\"\nimport { isSetVariableValueAction } from \"document/models/CanvasTree/actions/setVariableValueActions.ts\"\nimport { isTriggerEventAction } from \"document/models/CanvasTree/actions/triggerEventActions.ts\"\nimport { isSetVariantAction } from \"document/models/CanvasTree/actions/variantActions.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport { isFixedOrRelativeOverlay } from \"document/models/CanvasTree/nodes/utils/overlayHelpers.ts\"\nimport { withFrameEvents, frameEventKeys } from \"document/models/CanvasTree/traits/WithFrameEvents.ts\"\nimport { withVariables } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport {\n\tHardCodedCodeIdentifier,\n\tisHardCodedCodeIdentifier,\n} from \"document/models/CanvasTree/traits/utils/hardCodedCodeComponentIdentifiers.ts\"\nimport type { EventAction } from \"document/models/EventAction.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\n\ntype IncompleteReason =\n\t| \"missingVariantTarget\"\n\t| \"unresolvedVariantTarget\"\n\t| \"missingNavigationTarget\"\n\t| \"unresolvedNavigationTarget\"\n\t| \"missingOverlayTarget\"\n\t| \"unresolvedOverlayTarget\"\n\t| \"overlayTargetNotOverlay\"\n\t| \"overlayTargetWrongParent\"\n\t| \"missingTriggerEventReference\"\n\t| \"unresolvedTriggerEventReference\"\n\t| \"missingVariableReference\"\n\t| \"unresolvedVariableReference\"\n\t| \"missingActionDefinition\"\n\ninterface IncompleteResult {\n\treason: IncompleteReason\n\tdetail: string\n}\n\ninterface EntityLoader {\n\tcomponentForIdentifier: (id: string) => unknown\n\terrorForIdentifier: (id: string) => unknown\n}\n\nfunction classifyIncompleteAction(\n\taction: EventAction,\n\ttriggerNode: CanvasNode,\n\ttree: CanvasTree,\n\tloader: EntityLoader,\n): IncompleteResult | undefined {\n\tif (!isHardCodedCodeIdentifier(action.actionIdentifier)) {\n\t\tif (!loader.componentForIdentifier(action.actionIdentifier) && loader.errorForIdentifier(action.actionIdentifier)) {\n\t\t\treturn { reason: \"missingActionDefinition\", detail: action.actionIdentifier }\n\t\t}\n\t}\n\n\tif (isSetVariantAction(action)) {\n\t\tif (action.controls.type?.value !== \"set\") return undefined\n\n\t\tconst variantId = action.controls.variantId?.value\n\t\tif (!variantId || !isString(variantId)) return { reason: \"missingVariantTarget\", detail: \"\" }\n\n\t\tconst scopeNode = tree.getScopeNodeFor(triggerNode)\n\t\tif (!scopeNode || !tree.get(variantId)) {\n\t\t\treturn { reason: \"unresolvedVariantTarget\", detail: variantId }\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tif (isNavigationAction(action)) {\n\t\tif (action.controls.type?.value !== \"next\") return undefined\n\n\t\tconst target = action.controls.target?.value\n\t\tif (!target || !isString(target)) return { reason: \"missingNavigationTarget\", detail: \"\" }\n\n\t\tif (!tree.get(target)) {\n\t\t\treturn { reason: \"unresolvedNavigationTarget\", detail: target }\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tif (\n\t\taction.actionIdentifier === HardCodedCodeIdentifier.showOverlayAction ||\n\t\taction.actionIdentifier === HardCodedCodeIdentifier.showRelativeOverlayAction\n\t) {\n\t\tconst overlayId = action.controls.overlay?.value\n\t\tif (!overlayId || !isString(overlayId)) return { reason: \"missingOverlayTarget\", detail: \"\" }\n\n\t\tconst overlayNode = tree.get(overlayId)\n\t\tif (!overlayNode) return { reason: \"unresolvedOverlayTarget\", detail: overlayId }\n\n\t\tif (!isFixedOrRelativeOverlay(overlayNode)) {\n\t\t\treturn { reason: \"overlayTargetNotOverlay\", detail: overlayId }\n\t\t}\n\n\t\t// Mirror runtime resolution in `OverlayCollector.addOverlayTrigger`: the publishable\n\t\t// overlay must live directly under this trigger (matched by primary id, so replicas\n\t\t// referencing the primary's overlay id resolve correctly without accepting overlays\n\t\t// parented by a sibling replica).\n\t\tconst hasMatchingChild = triggerNode.children?.some(child => child.getPrimaryId() === overlayId)\n\t\tif (!hasMatchingChild) {\n\t\t\treturn { reason: \"overlayTargetWrongParent\", detail: overlayId }\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tif (isTriggerEventAction(action)) {\n\t\tconst varId = action.controls.id?.value\n\t\tif (!isString(varId)) return { reason: \"missingTriggerEventReference\", detail: \"\" }\n\n\t\tconst scopeNode = tree.getScopeNodeFor(triggerNode)\n\t\tif (!scopeNode || !withVariables(scopeNode) || !scopeNode.hasVariable(varId)) {\n\t\t\treturn { reason: \"unresolvedTriggerEventReference\", detail: varId }\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tif (isSetVariableValueAction(action)) {\n\t\tconst varId = action.controls.variableId?.value\n\t\tif (!isString(varId)) return { reason: \"missingVariableReference\", detail: \"\" }\n\n\t\tconst scopeNode = tree.getScopeNodeFor(triggerNode)\n\t\tif (!scopeNode || !withVariables(scopeNode) || !scopeNode.hasVariable(varId)) {\n\t\t\treturn { reason: \"unresolvedVariableReference\", detail: varId }\n\t\t}\n\n\t\treturn undefined\n\t}\n}\n\nconst messages: Record<IncompleteReason, (detail: string) => string> = {\n\tmissingVariantTarget: () =>\n\t\t\"Set Variant action is configured to set a specific variant but no target variant is specified.\",\n\tunresolvedVariantTarget: identifier =>\n\t\t`Set Variant action references variant ${escapeValue(identifier)} which no longer exists in the document.`,\n\tmissingNavigationTarget: () => \"Navigate action is configured to go to a specific page but no target is specified.\",\n\tunresolvedNavigationTarget: identifier =>\n\t\t`Navigate action references page ${escapeValue(identifier)} which no longer exists in the document.`,\n\tmissingOverlayTarget: () => \"Show Overlay action has no overlay target specified.\",\n\tunresolvedOverlayTarget: identifier =>\n\t\t`Show Overlay action references overlay ${escapeValue(identifier)} which no longer exists in the document.`,\n\toverlayTargetNotOverlay: identifier =>\n\t\t`Show Overlay action references ${escapeValue(identifier)} which is not an overlay.`,\n\toverlayTargetWrongParent: identifier =>\n\t\t`Show Overlay action references overlay ${escapeValue(identifier)} which is not a direct child of this node.`,\n\tmissingTriggerEventReference: () => \"Trigger Event action has no event variable specified.\",\n\tunresolvedTriggerEventReference: identifier =>\n\t\t`Trigger Event action references variable ${escapeValue(identifier)} which no longer exists in scope.`,\n\tmissingVariableReference: () => \"Set Variable Value action has no variable specified.\",\n\tunresolvedVariableReference: identifier =>\n\t\t`Set Variable Value action references variable ${escapeValue(identifier)} which no longer exists in scope.`,\n\tmissingActionDefinition: identifier =>\n\t\t`Action ${escapeValue(identifier)} could not be found. The code action may have been removed or renamed.`,\n}\n\nexport function incompleteEventActions(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: withFrameEvents,\n\t\t})\n\t\t.execute(function* ([match]) {\n\t\t\tconst node = match.node\n\t\t\tconst tree = node.tree()\n\t\t\tassert(tree, \"Expected node to be part of a tree\")\n\t\t\tconst loader = match.$node.$entityLoader()\n\n\t\t\tfor (const eventKey of frameEventKeys) {\n\t\t\t\tconst actions = node[eventKey]\n\t\t\t\tif (!actions || actions.length === 0) continue\n\n\t\t\t\tfor (const action of actions) {\n\t\t\t\t\tconst result = classifyIncompleteAction(action, node, tree, loader)\n\t\t\t\t\tif (!result) continue\n\n\t\t\t\t\tyield {\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tmessage: messages[result.reason](result.detail),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n}\n", "import { hasImageFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { withLightboxEffect } from \"document/models/CanvasTree/traits/WithLightboxEffect.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\n\nexport function lightboxEffectRequiresImageFill(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: withLightboxEffect,\n\t\t\tlightboxEffectEnabled: value => value === true,\n\t\t})\n\t\t.execute(function* ([nodeMatch]) {\n\t\t\tif (hasImageFill(nodeMatch.node)) return\n\n\t\t\tyield {\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Lightbox effect is enabled but this frame has no image fill. The lightbox animates the frame's own background image, so apply it directly to the frame with the image fill (for example, the inner image), not to a wrapper container.\",\n\t\t\t}\n\t\t})\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { type CanvasNode, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { Rect } from \"library/render/types/Rect.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\n\nexport function overlappingGroundNodes(linter: TreeLinter) {\n\treturn linter\n\t\t.findAncestorScopeNode({\n\t\t\tguard: isScopeNode,\n\t\t})\n\t\t.findAll({}, { immediateOnly: true })\n\t\t.execute(function* ([scope, groundNodes]) {\n\t\t\tfor (let leftIndex = 0; leftIndex < groundNodes.array.length; leftIndex++) {\n\t\t\t\tconst leftNode = groundNodes.array[leftIndex]\n\t\t\t\tassert(leftNode, \"Ground node element was in array but is undefined\")\n\t\t\t\tconst leftRect = leftNode.$node.rect()\n\n\t\t\t\t// index+1 ensures we only check each pair of nodes once\n\t\t\t\tfor (let rightIndex = leftIndex + 1; rightIndex < groundNodes.array.length; rightIndex++) {\n\t\t\t\t\tconst rightNode = groundNodes.array[rightIndex]\n\t\t\t\t\tassert(rightNode, \"Ground node element was in array but is undefined\")\n\n\t\t\t\t\tconst rightRect = rightNode.$node.rect()\n\t\t\t\t\tif (!Rect.intersects(leftRect, rightRect)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tyield {\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tmessage: `The ground nodes \"${getNodeLabel(leftNode.node)}\" and \"${getNodeLabel(rightNode.node)}\" overlap in the \"${getNodeLabel(scope.node)}\" scope.`,\n\t\t\t\t\t\tnodeIds: [leftNode.node.id, rightNode.node.id],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n}\n\nfunction getNodeLabel(node: CanvasNode) {\n\tconst name = node.resolveValue(\"name\")\n\treturn isString(name) && name.length > 0 ? name : node.id\n}\n", "import type { CanvasNode, FrameNode, MaybeNodeID, RichTextNode } from \"document/models/CanvasTree/index.ts\"\nimport { isFrameNode, isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isPinnable, type WithPins } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport { supportsSizeConstraints } from \"document/models/CanvasTree/traits/WithSizeConstraints.ts\"\nimport {\n\tisBreakpointVariant,\n\ttype IsBreakpoint,\n\ttype IsVariant,\n} from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { DimensionType } from \"library/render/types/Constraints.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { isUnset, createGuard, isSet } from \"../lib/predicates.ts\"\n\nconst MAX_WALK_DEPTH = 2\nconst DESKTOP_BREAKPOINT_THRESHOLD = 1200\nconst RISKY_RELATIVE_WIDTH_THRESHOLD = 0.8\nconst SAFE_TEXT_LENGTH_THRESHOLD = 75\n\nexport function relativeWidthContentRequiresMaxWidth(linter: TreeLinter) {\n\treturn linter\n\t\t.findAncestorGroundNode({\n\t\t\tguard: createGuard(node => isFrameNode(node) && isBreakpointVariant(node)),\n\t\t\twidth: (value, node) => value >= DESKTOP_BREAKPOINT_THRESHOLD || isLargestBreakpoint(node),\n\t\t})\n\t\t.find(\n\t\t\t{\n\t\t\t\tguard: createGuard(node => isPinnable(node) && supportsSizeConstraints(node)),\n\t\t\t\twidthType: [DimensionType.Percentage, DimensionType.FractionOfFreeSpace, DimensionType.Viewport],\n\t\t\t\tmaxWidth: isUnset,\n\t\t\t\twidth: (_, node) => {\n\t\t\t\t\tconst widthFraction = getRelativeWidth0To1(node)\n\t\t\t\t\treturn !isUndefined(widthFraction) && widthFraction.width >= RISKY_RELATIVE_WIDTH_THRESHOLD\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ maxDepth: 1 },\n\t\t)\n\t\t.findAll(\n\t\t\t{\n\t\t\t\tguard: createGuard(node => isPinnable(node) && supportsSizeConstraints(node)),\n\t\t\t},\n\t\t\t{ maxDepth: MAX_WALK_DEPTH },\n\t\t)\n\t\t.execute(function* ([_breakpoint, breakpointChild, descendants]) {\n\t\t\tconst breakpointChildRelativeWidth = getRelativeWidth0To1(breakpointChild.node)\n\t\t\tassert(\n\t\t\t\t!isUndefined(breakpointChildRelativeWidth),\n\t\t\t\t\"breakpointChild should have been filtered for having a relative width but did not have it\",\n\t\t\t)\n\n\t\t\t// Collect every walked branch (top-down: descendant closest to `breakpointChild` first,\n\t\t\t// leaf last) which never applies a fixed or max-width constraint within the walked depth.\n\t\t\tconst failingBranches: { node: CanvasNode & WithPins }[][] = []\n\t\t\tfor (const branch of walkTreeBranches(descendants.array)) {\n\t\t\t\tlet hasAnyWidthConstraintApplied = false\n\n\t\t\t\tlet relativeWidth = breakpointChildRelativeWidth\n\n\t\t\t\tfor (const layer of branch) {\n\t\t\t\t\tconst layerWidth = getRelativeWidth0To1(layer.node)\n\t\t\t\t\tif (isUndefined(layerWidth)) {\n\t\t\t\t\t\t// This is a fixed width section so this branch is fine\n\t\t\t\t\t\thasAnyWidthConstraintApplied = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isSet(layer.node.maxWidth)) {\n\t\t\t\t\t\t// This node has a maxWidth set so this branch is fine\n\t\t\t\t\t\thasAnyWidthConstraintApplied = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\t// Even if text has a relative width, if it's short enough it won't cause readability issues it's fine\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tisRichTextNode(layer.node) &&\n\t\t\t\t\t\tlayer.node.getTextContent().length < SAFE_TEXT_LENGTH_THRESHOLD &&\n\t\t\t\t\t\ttextFitOK(layer.node)\n\t\t\t\t\t) {\n\t\t\t\t\t\thasAnyWidthConstraintApplied = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\trelativeWidth = calculateChildRelativeWidth(relativeWidth, layerWidth)\n\t\t\t\t\tif (relativeWidth.width < RISKY_RELATIVE_WIDTH_THRESHOLD) {\n\t\t\t\t\t\thasAnyWidthConstraintApplied = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hasAnyWidthConstraintApplied) {\n\t\t\t\t\tfailingBranches.push(branch)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (failingBranches.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prune all failing branches to their longest shared prefix so we emit a single warning\n\t\t\t// pointing at the smallest sub-tree that contains every failing leaf, instead of yielding\n\t\t\t// one warning per leaf with overlapping ancestor lists that drag every walked node into\n\t\t\t// the downstream problem set (e.g. reviewChanges).\n\t\t\tconst firstFailingBranch = failingBranches[0]\n\t\t\tassert(firstFailingBranch, \"Expected at least one failing branch\")\n\t\t\tconst sharedPrefixIds: string[] = []\n\t\t\tfor (let index = 0; index < firstFailingBranch.length; index++) {\n\t\t\t\tconst candidate = firstFailingBranch[index]\n\t\t\t\tassert(candidate, \"Expected node to exist\")\n\n\t\t\t\tconst candidateId = candidate.node.id\n\t\t\t\tconst sharedAcrossAllBranches = failingBranches.every(branch => branch[index]?.node.id === candidateId)\n\t\t\t\tif (!sharedAcrossAllBranches) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tsharedPrefixIds.push(candidateId)\n\t\t\t}\n\n\t\t\tyield {\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage: `Content inside a full-bleed or proportional layout should set a maxWidth so it does not span too wide on large screens. Linter has checked to a child depth of ${MAX_WALK_DEPTH} for performance reasons. Consider if the layout needs a maxWidth added.`,\n\t\t\t\tnodeIds: [breakpointChild.node.id, ...sharedPrefixIds],\n\t\t\t}\n\t\t})\n}\n\nfunction textFitOK(node: RichTextNode) {\n\treturn isUndefined(node.textFitScale) || node.textFitScale < RISKY_RELATIVE_WIDTH_THRESHOLD\n}\n\nfunction getRelativeWidth0To1(node: CanvasNode & WithPins): RelativeWidth | undefined {\n\tconst { widthType, width } = node\n\tswitch (widthType) {\n\t\tcase DimensionType.Percentage:\n\t\tcase DimensionType.Viewport:\n\t\tcase DimensionType.FractionOfFreeSpace:\n\t\t\treturn { widthType, width }\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\ntype RelativeWidth = {\n\twidth: number\n\twidthType?: DimensionType.Percentage | DimensionType.Viewport | DimensionType.FractionOfFreeSpace\n}\n\nfunction calculateChildRelativeWidth(parent: RelativeWidth, child: RelativeWidth): RelativeWidth {\n\tif (child.widthType === DimensionType.Viewport) {\n\t\treturn child\n\t}\n\treturn {\n\t\twidth: parent.width * child.width,\n\t}\n}\n\nfunction isLargestBreakpoint(breakpointNode: CanvasNode & FrameNode & IsVariant & IsBreakpoint) {\n\tconst tree = breakpointNode.tree()\n\tassert(tree, \"Expected node to be part of a tree\")\n\n\tconst siblings = tree.getSiblingsIncludingSelf(breakpointNode)\n\tfor (const sibling of siblings) {\n\t\tif (isFrameNode(sibling) && isBreakpointVariant(sibling) && sibling.width > breakpointNode.width) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Turn a descendants array into flat branches.\n *\n * Maybe if this is needed in other places we can move it to be either a TreeLinter method or a utility\n */\nfunction* walkTreeBranches<T extends { node: CanvasNode }>(flatNodes: T[]) {\n\tconst nodeIndexesByID = new Map<string, number>()\n\tconst leafNodesIDs = new Set<string>()\n\tfor (let index = 0; index < flatNodes.length; index++) {\n\t\tconst flatNode = flatNodes[index]\n\t\tassert(flatNode, \"Expected node to exist\")\n\n\t\tnodeIndexesByID.set(flatNode.node.id, index)\n\n\t\t// Figure out which nodes are our (effective) leafs\n\t\tleafNodesIDs.add(flatNode.node.id)\n\t\tif (flatNode.node.parentid) {\n\t\t\tleafNodesIDs.delete(flatNode.node.parentid)\n\t\t}\n\t}\n\n\tfor (const leafNodeId of leafNodesIDs) {\n\t\tconst branch: T[] = []\n\n\t\tlet currentNodeID: MaybeNodeID = leafNodeId\n\t\twhile (currentNodeID) {\n\t\t\tconst currentNodeIndex = nodeIndexesByID.get(currentNodeID)\n\t\t\tif (isUndefined(currentNodeIndex)) {\n\t\t\t\t// We've reached an ancestor which is not in our subtree\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst parent = flatNodes[currentNodeIndex]\n\t\t\tassert(parent, \"Expected node to exist\")\n\n\t\t\tbranch.unshift(parent)\n\t\t\tcurrentNodeID = parent.node.parentid\n\t\t}\n\n\t\tyield branch\n\t}\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport type { DataRepeater } from \"document/models/CanvasTree/nodes/FrameNode.ts\"\nimport { isDataRepeater } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getRepeatedItemOfDataRepeater } from \"utils/repeaterUtils.ts\"\nimport type { LintProblem, TreeLinter } from \"../lib/TreeLinter.ts\"\n\nexport function repeaterHasNoRepeatedDescendant(linter: TreeLinter): Generator<LintProblem> {\n\treturn linter\n\t\t.findAncestorScopeNode({ guard: isScopeNode })\n\t\t.find({ guard: isDataRepeater })\n\t\t.execute(function* ([, match]) {\n\t\t\tyield* checkRepeater(match.node)\n\t\t})\n}\n\nfunction* checkRepeater(repeater: DataRepeater): Generator<LintProblem> {\n\tconst tree = repeater.tree()\n\tassert(tree, \"Expected repeater to be part of a tree\")\n\n\tif (getRepeatedItemOfDataRepeater(tree, repeater)) return\n\n\tconst declaredId = repeater.repeatedItemId ?? repeater.collectionRepeatedItemId\n\tif (!declaredId) return\n\n\tconst reason = tree.get(declaredId) ? \"is not a direct child of this CMS Collection List\" : \"has been deleted\"\n\n\tyield {\n\t\tlevel: \"error\",\n\t\tmessage: `This CMS Collection List has no repeated descendant. \\`collectionList.repeatedDescendantId\\` points at \\`${declaredId}\\`, which ${reason}. Set \\`collectionList.repeatedDescendantId\\` to a direct child of this CMS Collection List.`,\n\t\tnodeIds: [repeater.id],\n\t}\n}\n", "import { isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithStylePresetsKey } from \"document/models/CanvasTree/traits/WithStylePresets.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\n\n// Fixed subset of presets that a variable-bound rich text node should have configured.\n// CMS content is user-editable and SC rich text props are consumer-controlled, so any tag\n// could appear at any time. Checking a fixed subset avoids the performance cost of resolving\n// actual content while covering the most common tags.\nconst essentialPresets: readonly WithStylePresetsKey[] = [\"stylePresetParagraph\", \"stylePresetHeading1\"]\n\nexport function richTextVariableStylePresets(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: isRichTextNode,\n\t\t\t// htmlContent is only set as a VariableReference for ControlType.RichText bindings\n\t\t\thtmlContent: isVariableReference,\n\t\t})\n\t\t.execute(function* ([richText]) {\n\t\t\tconst node = richText.node\n\n\t\t\tconst missingPresets = essentialPresets.filter(key => !node[key])\n\n\t\t\tif (missingPresets.length === 0) return\n\n\t\t\tyield {\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage: `This rich text element is bound to a variable but is missing style presets for: ${missingPresets.map(escapeValue).join(\", \")}.`,\n\t\t\t}\n\t\t})\n}\n", "import { isDrawableNode } from \"document/models/CanvasTree/index.ts\"\nimport type { TreeLinter } from \"../lib/TreeLinter.ts\"\nimport { isUnmeasuredOverlay } from \"../utils/overlay.ts\"\n\nexport function zeroDimensions(linter: TreeLinter) {\n\treturn linter\n\t\t.find({\n\t\t\tguard: isDrawableNode,\n\t\t\t$rect: (value, node) => !!value && (value.height === 0 || value.width === 0) && !isUnmeasuredOverlay(node),\n\t\t})\n\t\t.execute(function* ([match]) {\n\t\t\tconst { height, width } = match.$node.rect()\n\n\t\t\tyield {\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage: `This element has width of ${width} and height of ${height}, which may indicate that it is not visible or not laid out as intended.`,\n\t\t\t}\n\t\t})\n}\n", "import { getLogger } from \"@framerjs/shared\"\nimport { TaskScheduler } from \"document/loader/TaskScheduler.ts\"\nimport type { RuleConfig } from \"./lib/RuleConfig.ts\"\nimport { TreeLinter, type LinterConfig, type LintProblem } from \"./lib/TreeLinter.ts\"\nimport { borderIsIncomplete } from \"./rules/borderIsIncomplete.ts\"\nimport { colorContrast } from \"./rules/colorContrast.ts\"\nimport { componentVariantMatchesBreakpoint } from \"./rules/componentVariantMatchesBreakpoint.ts\"\nimport { immediateParentOverflow } from \"./rules/immediateParentOverflow.ts\"\nimport { incompatibleOverflow } from \"./rules/incompatibleOverflow.ts\"\nimport { incompleteEventActions } from \"./rules/incompleteEventActions.ts\"\nimport { lightboxEffectRequiresImageFill } from \"./rules/lightboxEffectRequiresImageFill.ts\"\nimport { overlappingGroundNodes } from \"./rules/overlappingGroundNodes.ts\"\nimport { relativeWidthContentRequiresMaxWidth } from \"./rules/relativeWidthContentRequiresMaxWidth.ts\"\nimport { repeaterHasNoRepeatedDescendant } from \"./rules/repeaterHasNoRepeatedDescendant.ts\"\nimport { richTextVariableStylePresets } from \"./rules/richTextVariableStylePresets.ts\"\nimport { zeroDimensions } from \"./rules/zeroDimensions.ts\"\n\nconst log = getLogger(\"ai:agents:linting\")\n\ntype Rule = (linter: TreeLinter, config: RuleConfig) => Iterable<LintProblem>\nconst rules: [name: string, rule: Rule][] = [\n\t[\"borderIsIncomplete\", borderIsIncomplete],\n\t[\"colorContrast\", colorContrast],\n\t[\"componentVariantMatchesBreakpoint\", componentVariantMatchesBreakpoint],\n\t[\"immediateParentOverflow\", immediateParentOverflow],\n\t[\"incompatibleOverflow\", incompatibleOverflow],\n\t[\"zeroDimensions\", zeroDimensions],\n\t[\"richTextVariableStylePresets\", richTextVariableStylePresets],\n\t[\"relativeWidthContentRequiresMaxWidth\", relativeWidthContentRequiresMaxWidth],\n\t[\"overlappingGroundNodes\", overlappingGroundNodes],\n\t[\"incompleteEventActions\", incompleteEventActions],\n\t[\"lightboxEffectRequiresImageFill\", lightboxEffectRequiresImageFill],\n\t[\"repeaterHasNoRepeatedDescendant\", repeaterHasNoRepeatedDescendant],\n]\n\ninterface GetLintProblemsConfig extends LinterConfig {\n\truleConfig: RuleConfig\n\n\t/**\n\t * Optional idle callback hook so linting can yield via the active engine scheduler.\n\t *\n\t * When set TaskScheduler will run on Slow mode, which yields to this callback\n\t * When unset TaskScheduler will run on Fast mode, which yields CPU time\n\t */\n\tschedulerYieldCallback?: (callback: VoidFunction) => void\n}\n\nexport async function getLintProblems(config: GetLintProblemsConfig): Promise<LintProblem[]> {\n\tlog.info(\"Starting linting process for project changes...\", config)\n\tconst now = Date.now()\n\n\tconst schedulerMode: \"fast\" | \"slow\" = config.schedulerYieldCallback ? \"slow\" : \"fast\"\n\tconst taskScheduler = new TaskScheduler(config.schedulerYieldCallback)[schedulerMode]()\n\n\tconst linter = TreeLinter.init(config)\n\tconst problems: LintProblem[] = []\n\n\tawait taskScheduler.run(async () => {\n\t\tfor (const [ruleName, rule] of rules) {\n\t\t\ttry {\n\t\t\t\tfor (const warning of rule(linter, config.ruleConfig)) {\n\t\t\t\t\tproblems.push(warning)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlog.reportError(error, { context: \"Agent lint rule failed\", rule: ruleName })\n\t\t\t}\n\n\t\t\t// Individual rules are typically 2-5ms each on very large trees (like Site) - 100x cheaper in many cases\n\t\t\t// So we yield after each rule to allow the UI to update and keep the app responsive.\n\t\t\t// In hidden tabs browsers throttle scheduler.yield()/setTimeout to ~1s+, which stretches\n\t\t\t// review_changes from ~50ms to many seconds. Skip yielding when there is no UI to be polite to.\n\t\t\t// TODO: consider short-circuiting `schedulerYield()` itself in @framerjs/shared so every\n\t\t\t// fast-mode TaskScheduler caller benefits, not just the agent linter.\n\t\t\tif (typeof document === \"undefined\" || document.visibilityState !== \"hidden\") {\n\t\t\t\tawait taskScheduler.yield()\n\t\t\t}\n\t\t}\n\t})\n\n\tconst duration = Date.now() - now\n\tlog.debug(`Linting completed in ${duration}ms`, problems)\n\n\treturn problems\n}\n", "import { assertNever, emptyArray, getLogger } from \"@framerjs/shared\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tisComputedValue,\n\tisComputedValueFromVariableReference,\n\ttype ComputedValue,\n} from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isVariableReference, type VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { computeValue } from \"document/models/CanvasTree/traits/utils/computeValue.ts\"\nimport { P3Color, Color } from \"library/render/types/Color/Color.ts\"\nimport { parseCSSVariable } from \"library/render/utils/parseCSSVariable.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { ColorTheme, Tokens } from \"../../context/tokens.ts\"\n\nconst log = getLogger(\"ai:agents:linting\")\n\ntype StaticCSSColorValue = string | undefined | VariableReference\ntype DynamicCSSColorValue = ComputedValue\ntype CSSColorValue = StaticCSSColorValue | DynamicCSSColorValue\n\nexport interface ParseCSSColorsOptions {\n\ttokens: Tokens\n\ttheme?: ColorTheme\n\tnode: CanvasNode\n}\n\nfunction parseCSSColorString(color: string, tokens?: Tokens, theme: ColorTheme = \"light\"): Color | undefined {\n\t// Color tokens are stored as `var(--token-<id>)` without an inline fallback,\n\t// so resolve them through the agent's Tokens store before parsing.\n\tconst tokenColor = tokens?.resolve(color)?.node.colorForMode(theme === \"dark\")\n\tconst resolvedColor = tokenColor ?? parseCSSVariable(color).fallback ?? color\n\tconst parsedColor = Color(P3Color.srgbFromValue(resolvedColor))\n\tif (parsedColor.isValid === false) {\n\t\treturn undefined\n\t}\n\treturn parsedColor\n}\n\nexport function parseCSSColorValue(value: StaticCSSColorValue, options: ParseCSSColorsOptions): Color | undefined\nexport function parseCSSColorValue(value: DynamicCSSColorValue, options: ParseCSSColorsOptions): Color[]\nexport function parseCSSColorValue(value: CSSColorValue, options: ParseCSSColorsOptions): Color | undefined | Color[] {\n\tif (isUndefined(value)) return undefined\n\n\tif (isString(value)) {\n\t\treturn parseCSSColorString(value, options.tokens, options.theme)\n\t}\n\n\tif (isVariableReference(value)) {\n\t\tconst variableValue = options.node.cache.getVariableReferenceValue(value)\n\t\tif (isString(variableValue)) {\n\t\t\treturn parseCSSColorString(variableValue, options.tokens, options.theme)\n\t\t}\n\t\tlog.reportError(new Error(`Variable reference did not resolve to a string value`), { value, variableValue })\n\t\treturn undefined\n\t}\n\n\tif (isComputedValue(value)) {\n\t\tconst colorStrings = getComputedColors(value, options.node)\n\t\treturn parseCSSColorStrings(colorStrings, options)\n\t}\n\n\tassertNever(value, `Unsupported CSS color value type: ` + JSON.stringify(value))\n}\n\nfunction parseCSSColorStrings(rawValues: readonly string[], options: ParseCSSColorsOptions): Color[] {\n\tconst colors = new Map<string, Color>()\n\n\tfor (const colorValue of rawValues) {\n\t\tconst color = parseCSSColorString(colorValue, options.tokens, options.theme)\n\t\tif (!color) continue\n\n\t\tcolors.set(color.toValue(), color)\n\t}\n\n\treturn Array.from(colors.values())\n}\n\nfunction getComputedColors(computedValue: ComputedValue, node: CanvasNode) {\n\tconst usesVariableStartValue = isComputedValueFromVariableReference(computedValue)\n\tconst inputControl = usesVariableStartValue\n\t\t? node.cache.getVariableControlByReference(computedValue.startValue)\n\t\t: undefined\n\tconst startValue = usesVariableStartValue\n\t\t? (node.cache.getVariableReferenceValue(computedValue.startValue) ?? getControlInitialValue(inputControl))\n\t\t: undefined\n\n\t// Eventually we could enumerate alternative computed values as stops\n\t// But for simplicity right now we are only checking the initial/default state.\n\tconst colorValue = computeValue(\n\t\tcomputedValue,\n\t\tnode.cache,\n\t\tundefined,\n\t\tinputControl,\n\t\tundefined,\n\t\tnode.cache.activeRouterLocale,\n\t\tusesVariableStartValue ? { startValue } : undefined,\n\t)\n\n\tif (!isString(colorValue)) {\n\t\treturn emptyArray<string>()\n\t}\n\n\treturn [colorValue]\n}\n\nfunction getControlInitialValue(\n\tinputControl: ReturnType<CanvasNode[\"cache\"][\"getVariableControlByReference\"]>,\n): unknown {\n\tif (!inputControl || !(\"initialValue\" in inputControl)) return undefined\n\treturn inputControl.initialValue\n}\n", "import type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { hasFillEnabled, type WithFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { Color } from \"library/index.ts\"\nimport { assert, assertNever } from \"library/utils/assert.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport type { ColorTheme } from \"../../context/tokens.ts\"\nimport { parseCSSColorValue, type ParseCSSColorsOptions } from \"./colors.ts\"\n\nexport interface FillStops {\n\ttype: \"single\" | \"gradient\" | \"computed\"\n\tcolors: Color[]\n\tisOpaque: boolean\n}\n\nexport function getFillStops(\n\tnode: CanvasNode & WithFill,\n\tagentContext: AgentContext,\n\ttheme: ColorTheme = \"light\",\n): FillStops | undefined {\n\tif (!hasFillEnabled(node) || !node.fillType) {\n\t\treturn createTransparentFillStops()\n\t}\n\n\tif (node.fillType === \"image\") {\n\t\t// Don't support images for now since establishing a color is non-trivial\n\t\treturn undefined\n\t}\n\n\t// We need to calculate some things ourself now traits doesn't give us granularity\n\tswitch (node.fillType) {\n\t\tcase \"color\": {\n\t\t\tconst colors = isComputedValue(node.fillColor)\n\t\t\t\t? parseCSSColorValue(node.fillColor, {\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\ttokens: agentContext.tokens,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t})\n\t\t\t\t: arrayWhenValue(parseCSSColorValue(node.fillColor, { node: node, tokens: agentContext.tokens, theme }))\n\n\t\t\tif (colors.length === 0) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: isComputedValue(node.fillColor) ? \"computed\" : \"single\",\n\t\t\t\tcolors,\n\t\t\t\tisOpaque: colors.every(color => color.a === 1),\n\t\t\t}\n\t\t}\n\t\tcase \"linear-gradient\": {\n\t\t\tassert(node.fillLinearGradient, `fillType was linear-gradient but fillLinearGradient was not set`)\n\t\t\tconst colors = calculateIntermediateColorsForStops(node.fillLinearGradient?.stops ?? [], {\n\t\t\t\tnode: node,\n\t\t\t\ttokens: agentContext.tokens,\n\t\t\t\ttheme,\n\t\t\t})\n\n\t\t\tif (colors.length === 0) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"gradient\",\n\t\t\t\tcolors,\n\t\t\t\tisOpaque: colors.every(color => color.a === 1),\n\t\t\t}\n\t\t}\n\n\t\tcase \"radial-gradient\": {\n\t\t\tassert(node.fillRadialGradient, `fillType was radial-gradient but fillRadialGradient was not set`)\n\t\t\tconst colors = calculateIntermediateColorsForStops(node.fillRadialGradient?.stops ?? [], {\n\t\t\t\tnode: node,\n\t\t\t\ttokens: agentContext.tokens,\n\t\t\t\ttheme,\n\t\t\t})\n\n\t\t\tif (colors.length === 0) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"gradient\",\n\t\t\t\tcolors,\n\t\t\t\tisOpaque: colors.every(color => color.a === 1),\n\t\t\t}\n\t\t}\n\n\t\tcase \"conic-gradient\": {\n\t\t\tassert(node.fillConicGradient, `fillType was conic-gradient but fillConicGradient was not set`)\n\t\t\tconst colors = calculateIntermediateColorsForStops(node.fillConicGradient?.stops ?? [], {\n\t\t\t\tnode: node,\n\t\t\t\ttokens: agentContext.tokens,\n\t\t\t\ttheme,\n\t\t\t})\n\n\t\t\tif (colors.length === 0) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"gradient\",\n\t\t\t\tcolors,\n\t\t\t\tisOpaque: colors.every(color => color.a === 1),\n\t\t\t}\n\t\t}\n\n\t\tdefault:\n\t\t\tassertNever(node.fillType, `Unsupported fill type ${String(node.fillType)}`)\n\t}\n}\n\nfunction createTransparentFillStops(): FillStops {\n\treturn {\n\t\ttype: \"single\",\n\t\tcolors: [Color(\"transparent\")],\n\t\tisOpaque: false,\n\t}\n}\n\nfunction arrayWhenValue(color: Color | undefined): Color[] {\n\treturn color ? [color] : []\n}\n\nfunction calculateIntermediateColorsForStops(\n\tstops: readonly { value: string }[],\n\toptions: ParseCSSColorsOptions,\n): Color[] {\n\tif (stops.length === 0) return []\n\tif (stops.length === 1) {\n\t\tconst stop = parseCSSColorValue(stops[0]?.value, options)\n\t\tif (stop) {\n\t\t\treturn [stop]\n\t\t}\n\t\treturn []\n\t}\n\n\tconst colors: Color[] = []\n\tfor (let stopIndex = 0; stopIndex < stops.length; stopIndex++) {\n\t\tconst isFinalStop = stopIndex === stops.length - 1\n\n\t\tconst colorString1 = stops[stopIndex]?.value\n\t\tconst colorString2 = stops.at(stopIndex + 1)?.value\n\t\tassert(\n\t\t\tcolorString1 && (colorString2 || isFinalStop),\n\t\t\t`Expected to find two colors at stops ${stopIndex} and stopIndex+1`,\n\t\t)\n\n\t\tconst color1 = parseCSSColorValue(colorString1, options)\n\t\tif (color1) colors.push(color1)\n\n\t\tconst color2 = parseCSSColorValue(colorString2, options)\n\n\t\t// We just calculate a single intermediate at the halfway point\n\t\t// This way transitions like black->white are validated against grey text as black->grey->white\n\t\t// Gradients are continuous but this gives us a better chance of catching issues\n\t\tif (color1 && color2) {\n\t\t\tconst intermediaryColor = Color.mixAsColor(color1, color2, 0.5)\n\t\t\tcolors.push(intermediaryColor)\n\t\t}\n\t}\n\n\treturn colors\n}\n", "import type { CanvasNode, RichTextNode } from \"document/models/CanvasTree/index.ts\"\nimport { isTextStylePresetPrimaryNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isVariableReference, type VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { withOpacity } from \"document/models/CanvasTree/traits/WithOpacity.ts\"\nimport { textStylePresetKeys } from \"document/models/CanvasTree/traits/WithStylePresets.ts\"\nimport { withTextContent } from \"document/models/CanvasTree/traits/WithTextContent.ts\"\nimport { textStyleDefaults, type WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { Color } from \"library/render/types/Color/Color.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { getFontStyleProperties } from \"../../../../../text/index.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { isVirtualRichTextTextBlock } from \"../../context/richtext/document.ts\"\nimport { walkVirtualRichText } from \"../../context/richtext/traversal.ts\"\nimport type { ColorTheme } from \"../../context/tokens.ts\"\nimport { font } from \"../../traits/textStyle/font.ts\"\nimport { textBackgroundColor } from \"../../traits/textStyle/textBackgroundColor.ts\"\nimport { textColor } from \"../../traits/textStyle/textColor.ts\"\nimport { parseCSSColorValue } from \"./colors.ts\"\n\ninterface TextRun {\n\tid: string\n\ttext: string\n\tweight: string | number | undefined\n\tcolor?: Color\n\tbackground?: Color\n\tnodeOpacity?: number\n\t// When the run was synthesized (no real span to point at \u2014 e.g. a CMS-bound RichTextNode), this\n\t// describes what was actually checked so the linter message can replace `text=\"\u2026\"`.\n\tsubject?: string\n}\n\nexport function getRichTextColors(agentContext: AgentContext, node: RichTextNode, theme: ColorTheme = \"light\") {\n\t// A RichTextNode bound to a CMS variable can't be hydrated \u2014 the variable owns the HTML and\n\t// hydrating would let the agent edit it. The runtime renders such nodes by applying the\n\t// node-level per-tag presets (`stylePresetParagraph`, `stylePresetHeading{1..6}`) as CSS\n\t// classes on each tag, so we derive contrast inputs from those presets directly.\n\tif (isVariableReference(node.htmlContent)) {\n\t\treturn getCMSRichTextColors(agentContext, node, theme)\n\t}\n\n\tconst keys = new Set<string>()\n\tconst textRuns: TextRun[] = []\n\tconst opacity = resolvedNodeOpacity(node)\n\n\t// Prefer the already-hydrated document over a fresh hydrate so we don't blow away pending edits.\n\tconst document = agentContext.virtualText.maybeHydrateDocument(node)\n\tif (!document) {\n\t\treturn undefined\n\t}\n\tconst rootPreset = agentContext.treeStore.tree.getNodeWithTrait(\n\t\tdocument.textStylePreset,\n\t\tisTextStylePresetPrimaryNode,\n\t)\n\tconst rootInlineTextColor = document.inlineStyles.textColor\n\tconst rootPresetTextColor = rootPreset?.textColor\n\tconst nodeTextColor = node.getTextColors(false).at(0)\n\tconst rootInlineTextBackgroundColor = document.backgroundStyles.textBackgroundColor\n\tconst rootPresetTextBackgroundColor = rootPreset?.textBackgroundColor\n\tconst nodeTextBackgroundColor = node.getTextBackgroundColors(false).at(0)\n\tconst rootFont = document.inlineStyles.font ?? rootPreset?.font ?? node.getFontsWithVariationAxes(false).at(0)\n\n\tfor (const block of walkVirtualRichText(document)) {\n\t\tif (!isVirtualRichTextTextBlock(block)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst blockPreset = agentContext.treeStore.tree.getNodeWithTrait(\n\t\t\tblock.textStylePreset ?? document?.textStylePreset,\n\t\t\tisTextStylePresetPrimaryNode,\n\t\t)\n\t\tconst blockPresetFont = blockPreset?.font\n\t\tconst blockPresetTextColor = blockPreset?.textColor\n\t\tconst blockPresetTextBackgroundColor = blockPreset?.textBackgroundColor\n\t\tconst blockInlineFont = block.inlineStyles.font\n\t\tconst blockInlineTextColor = block.inlineStyles.textColor\n\t\tconst blockInlineTextBackgroundColor = block.backgroundStyles.textBackgroundColor\n\n\t\tfor (const span of block.children) {\n\t\t\tif (span.type === \"lineBreak\") continue\n\n\t\t\tconst spanFont = span.inlineStyles.font ?? blockInlineFont ?? blockPresetFont ?? rootFont\n\t\t\tconst colorValue =\n\t\t\t\tspan.inlineStyles.textColor ??\n\t\t\t\tblockInlineTextColor ??\n\t\t\t\trootInlineTextColor ??\n\t\t\t\tblockPresetTextColor ??\n\t\t\t\trootPresetTextColor ??\n\t\t\t\tnodeTextColor\n\t\t\tconst backgroundValue =\n\t\t\t\tspan.backgroundStyles.textBackgroundColor ??\n\t\t\t\tblockInlineTextBackgroundColor ??\n\t\t\t\trootInlineTextBackgroundColor ??\n\t\t\t\tblockPresetTextBackgroundColor ??\n\t\t\t\trootPresetTextBackgroundColor ??\n\t\t\t\tnodeTextBackgroundColor\n\t\t\tconst textRunWeight = span.bold ? 700 : span.fontWeight\n\t\t\tconst weight =\n\t\t\t\tresolveEffectiveWeight(textRunWeight ?? block.fontWeight ?? document.fontWeight, spanFont) ??\n\t\t\t\tresolveEffectiveWeight(block.fontWeight ?? document.fontWeight, blockInlineFont ?? blockPresetFont ?? rootFont)\n\n\t\t\tconst def: TextRun = {\n\t\t\t\tid: span.id,\n\t\t\t\ttext: span.text,\n\t\t\t\tweight,\n\t\t\t\tcolor: toEffectiveColor(colorValue, node, opacity, agentContext, theme),\n\t\t\t\tbackground: toEffectiveColor(backgroundValue, node, opacity, agentContext, theme),\n\t\t\t\tnodeOpacity: opacity === 1 ? undefined : opacity,\n\t\t\t}\n\n\t\t\tconst key = `${def.weight}-${serializeColor(def.color)}-${serializeColor(def.background) ?? \"none\"}`\n\t\t\tif (!keys.has(key)) {\n\t\t\t\tkeys.add(key)\n\t\t\t\ttextRuns.push(def)\n\t\t\t}\n\t\t}\n\t}\n\n\tif (textRuns.length === 0) return\n\treturn textRuns\n}\n\nfunction getCMSRichTextColors(\n\tagentContext: AgentContext,\n\tnode: RichTextNode,\n\ttheme: ColorTheme,\n): TextRun[] | undefined {\n\tconst keys = new Set<string>()\n\tconst textRuns: TextRun[] = []\n\tconst opacity = resolvedNodeOpacity(node)\n\tconst fallbackFont = textStyleDefaults.font\n\tconst fallbackTextColor = textStyleDefaults.textColor\n\tconst fallbackTextBackgroundColor = textStyleDefaults.textBackgroundColor\n\tlet hasUncustomizedTag = false\n\n\tfor (const presetKey of textStylePresetKeys) {\n\t\tconst preset = agentContext.treeStore.tree.getNodeWithTrait(node[presetKey], isTextStylePresetPrimaryNode)\n\t\tif (!preset) {\n\t\t\thasUncustomizedTag = true\n\t\t\tcontinue\n\t\t}\n\n\t\tconst presetFont = preset.font ?? fallbackFont\n\t\tconst colorValue = preset.textColor ?? fallbackTextColor\n\t\tconst backgroundValue = preset.textBackgroundColor ?? fallbackTextBackgroundColor\n\n\t\tconst def: TextRun = {\n\t\t\tid: node.id,\n\t\t\ttext: \"\",\n\t\t\tweight: resolveEffectiveWeight(undefined, presetFont),\n\t\t\tcolor: toEffectiveColor(colorValue, node, opacity, agentContext, theme),\n\t\t\tbackground: toEffectiveColor(backgroundValue, node, opacity, agentContext, theme),\n\t\t\tnodeOpacity: opacity === 1 ? undefined : opacity,\n\t\t\tsubject: `RichText \\`<${preset.tag}>\\` tag bound to a ControlType.RichText variable`,\n\t\t}\n\n\t\tconst key = `${def.weight}-${serializeColor(def.color)}-${serializeColor(def.background) ?? \"none\"}`\n\t\tif (keys.has(key)) continue\n\n\t\tkeys.add(key)\n\t\ttextRuns.push(def)\n\t}\n\n\t// Tags without a per-tag preset still render at runtime \u2014 they fall back to system defaults\n\t// (e.g., default black text). Emit one TextRun for those so the linter can flag low-contrast\n\t// default rendering when the CMS variable resolves to a tag the agent didn't customize.\n\tif (hasUncustomizedTag) {\n\t\tconst def: TextRun = {\n\t\t\tid: node.id,\n\t\t\ttext: \"\",\n\t\t\tweight: resolveEffectiveWeight(undefined, fallbackFont),\n\t\t\tcolor: toEffectiveColor(fallbackTextColor, node, opacity, agentContext, theme),\n\t\t\tbackground: toEffectiveColor(fallbackTextBackgroundColor, node, opacity, agentContext, theme),\n\t\t\tnodeOpacity: opacity === 1 ? undefined : opacity,\n\t\t\tsubject: `RichText tags without a per-tag preset bound to a ControlType.RichText variable (default styling)`,\n\t\t}\n\n\t\tconst key = `${def.weight}-${serializeColor(def.color)}-${serializeColor(def.background) ?? \"none\"}`\n\t\tif (!keys.has(key)) {\n\t\t\tkeys.add(key)\n\t\t\ttextRuns.push(def)\n\t\t}\n\t}\n\n\treturn textRuns.length > 0 ? textRuns : undefined\n}\n\nexport function getTextColors(\n\tagentContext: AgentContext,\n\tnode: CanvasNode & WithTextStyle,\n\ttheme: ColorTheme = \"light\",\n) {\n\tconst keys = new Set<string>()\n\tconst textRuns: TextRun[] = []\n\tconst opacity = resolvedNodeOpacity(node)\n\n\tconst textColorStyle = textColor.toAttributes(node, undefined, agentContext)\n\tif (!textColorStyle?.textColor) {\n\t\treturn undefined\n\t}\n\n\tconst fontStyle = font.toAttributes(node, undefined, agentContext)\n\tconst textBackgroundColorStyle = textBackgroundColor.toAttributes(node, undefined, agentContext)\n\n\t// resolveValue(\"textContent\") is typed `undefined` though it does return a string in practice\n\tconst resolvedTextContent: unknown = withTextContent(node) ? node.resolveValue(\"textContent\") : undefined\n\n\tconst def: TextRun = {\n\t\tid: node.id,\n\t\ttext: isString(resolvedTextContent) ? resolvedTextContent : \"\",\n\t\tweight: resolveEffectiveWeight(fontStyle?.fontWeight, fontStyle?.fontName),\n\t\tcolor: toEffectiveColor(textColorStyle.textColor, node, opacity, agentContext, theme),\n\t\tbackground: toEffectiveColor(textBackgroundColorStyle?.textBackgroundColor, node, opacity, agentContext, theme),\n\t\tnodeOpacity: opacity === 1 ? undefined : opacity,\n\t}\n\n\tconst key = `${def.weight}-${serializeColor(def.color)}-${serializeColor(def.background) ?? \"none\"}`\n\tif (!keys.has(key)) {\n\t\tkeys.add(key)\n\t\ttextRuns.push(def)\n\t}\n\n\treturn textRuns\n}\n\nfunction resolveEffectiveWeight(\n\texplicitWeight: string | number | undefined,\n\tfontSelector: string | undefined,\n): string | number | undefined {\n\tif (explicitWeight !== undefined) return explicitWeight\n\tif (!fontSelector) return undefined\n\n\treturn getFontStyleProperties(fontSelector).fontWeight\n}\n\nfunction resolvedNodeOpacity(node: CanvasNode): number {\n\tif (!withOpacity(node)) return 1\n\treturn node.resolveValue(\"opacity\") ?? 1\n}\n\nfunction toEffectiveColor(\n\tcolorValue: string | VariableReference | undefined,\n\tnode: CanvasNode,\n\topacity: number,\n\tagentContext: AgentContext,\n\ttheme: ColorTheme,\n): Color | undefined {\n\tif (!colorValue) return undefined\n\n\tconst color = parseCSSColorValue(colorValue, { node: node, tokens: agentContext.tokens, theme })\n\tif (!color) return undefined\n\treturn opacity === 1 ? color : Color.multiplyAlpha(color, opacity)\n}\n\nfunction serializeColor(color: Color | undefined): string | undefined {\n\treturn color?.toValue()\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport type { CanvasNode, CodeComponentNode, RichTextNode } from \"document/models/CanvasTree/index.ts\"\nimport { isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { WithFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { convertCornerPointsToCanvas } from \"document/models/CanvasTree/utils/geometry.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { getRoundedContextRect } from \"../../context/nodes.ts\"\nimport type { ColorTheme } from \"../../context/tokens.ts\"\nimport { getFillStops } from \"../utils/fill.ts\"\nimport { getRichTextColors, getTextColors } from \"../utils/textColors.ts\"\n\n// Expand this whenever you need to support a new node trait in the linting rules\n// You can then define new `$`-prefixed trait utilities for this interface\n// Why $-prefix? To avoid naming conflicts with actual node traits and to make it clear that these are computed utilities which may involve extra processing to extract values from nodes\ntype SupportedNodeTraits = [CanvasNode, WithFill]\n\nexport function createNodesDataProvider(agentContext: AgentContext) {\n\tconst getRect = createCache(node => getRoundedContextRect(agentContext.treeStore.tree, node))\n\tconst getCanvasCornerPoints = createCache(node => convertCornerPointsToCanvas(agentContext.treeStore.tree, node))\n\tconst getTextColorsArray = createCache(\n\t\t(node: RichTextNode | (CanvasNode & WithTextStyle), theme: ColorTheme) => {\n\t\t\tif (isRichTextNode(node)) {\n\t\t\t\treturn getRichTextColors(agentContext, node, theme)\n\t\t\t} else {\n\t\t\t\treturn getTextColors(agentContext, node, theme)\n\t\t\t}\n\t\t},\n\t\t(node, theme) => `${node.id}:${theme}`,\n\t)\n\tconst getFill = createCache(\n\t\t(node: CanvasNode & WithFill, theme: ColorTheme) => getFillStops(node, agentContext, theme),\n\t\t(node, theme) => `${node.id}:${theme}`,\n\t)\n\n\treturn {\n\t\t$rect(node) {\n\t\t\treturn getRect(node)\n\t\t},\n\t\t$$fillColor(node: CanvasNode & WithFill, theme: ColorTheme = \"light\") {\n\t\t\treturn getFill(node, theme)\n\t\t},\n\t\t$$textColors(node: RichTextNode | (CanvasNode & WithTextStyle), theme: ColorTheme = \"light\") {\n\t\t\treturn getTextColorsArray(node, theme)\n\t\t},\n\t\t$$componentLoader(node: CodeComponentNode) {\n\t\t\treturn {\n\t\t\t\tget componentForIdentifier() {\n\t\t\t\t\treturn agentContext.componentLoader.componentForIdentifier(node.codeComponentIdentifier)\n\t\t\t\t},\n\t\t\t\tget reactComponentForIdentifier() {\n\t\t\t\t\treturn agentContext.componentLoader.reactComponentForIdentifier(node.codeComponentIdentifier)\n\t\t\t\t},\n\t\t\t} satisfies Partial<Record<keyof ComponentLoader, unknown>>\n\t\t},\n\t\t$$entityLoader(_node: CanvasNode) {\n\t\t\treturn {\n\t\t\t\tcomponentForIdentifier: (id: string) => agentContext.componentLoader.componentForIdentifier(id),\n\t\t\t\terrorForIdentifier: (id: string) => agentContext.componentLoader.errorForIdentifier(id),\n\t\t\t}\n\t\t},\n\t\t$$canvasCornerPoints(node: CanvasNode) {\n\t\t\treturn getCanvasCornerPoints(node)\n\t\t},\n\t\t$$getResolvedControlPropValues(node: CodeComponentNode) {\n\t\t\treturn node.getResolvedControlPropValues(agentContext.componentLoader)\n\t\t},\n\t} as const satisfies Partial<NodesDataProviderConstraints>\n}\nexport type NodesDataProvider = ReturnType<typeof createNodesDataProvider>\nexport type NodesDataProviderKey = Extract<keyof NodesDataProvider, keyof NodesDataProviderConstraints>\n\nfunction createCache<T, TNode extends CanvasNode = CanvasNode>(getValue: (node: TNode) => T): (node: TNode) => T\nfunction createCache<TArgs extends [CanvasNode, ...unknown[]], T>(\n\tgetValue: (...args: TArgs) => T,\n\tgetKey: (...args: NoInfer<TArgs>) => string,\n): (...args: TArgs) => T\nfunction createCache<TArgs extends [CanvasNode, ...unknown[]], T>(\n\tgetValue: (...args: TArgs) => T,\n\tgetKey?: (...args: NoInfer<TArgs>) => string,\n): (...args: TArgs) => T {\n\tconst valuesByKey = new Map<string, { value: T }>()\n\n\tconst getKeyFn = getKey ?? ((...[node]: TArgs) => node.id)\n\n\treturn (...args: TArgs): T => {\n\t\tconst cacheKey = getKeyFn(...args)\n\t\tconst cachedEntry = valuesByKey.get(cacheKey)\n\t\tif (cachedEntry) {\n\t\t\treturn cachedEntry.value\n\t\t}\n\n\t\tconst value = getValue(...args)\n\t\tvaluesByKey.set(cacheKey, { value })\n\t\treturn value\n\t}\n}\n\n//\n// Base interface type wrangling to constrain NodesDataProvider\n//\n\ntype NodesDataProviderBaseFunction<TNode extends CanvasNode> = (node: TNode) => unknown\ntype TupleIndices<T extends readonly unknown[]> = Exclude<keyof T, keyof unknown[]>\ntype UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never\n\n// A real trait like `$rect` defines a utility which adheres to a specific node interface\ntype RealTraitsNodesDataProviderConstraints = UnionToIntersection<\n\t{\n\t\t[I in TupleIndices<SupportedNodeTraits>]: {\n\t\t\t[K in keyof SupportedNodeTraits[I] as K extends string ? `$${K}` : never]: NodesDataProviderBaseFunction<\n\t\t\t\tCanvasNode & SupportedNodeTraits[I]\n\t\t\t>\n\t\t}\n\t}[TupleIndices<SupportedNodeTraits>]\n>\n\n// An abstracted trait like `$$codeComponent` defines a utility which does adhere to any node interface\ntype AbstractedTraitsNodesDataProviderConstraints = Record<`$$${string}`, NodesDataProviderBaseFunction<CanvasNode>>\n\ntype NodesDataProviderConstraints = AbstractedTraitsNodesDataProviderConstraints &\n\tRealTraitsNodesDataProviderConstraints\n", "function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nconst dedent = createDedent({});\nexport default dedent;\nfunction createDedent(options) {\n  dedent.withOptions = newOptions => createDedent(_objectSpread(_objectSpread({}, options), newOptions));\n  return dedent;\n  function dedent(strings, ...values) {\n    const raw = typeof strings === \"string\" ? [strings] : strings.raw;\n    const {\n      alignValues = false,\n      escapeSpecialCharacters = Array.isArray(strings),\n      trimWhitespace = true\n    } = options;\n\n    // first, perform interpolation\n    let result = \"\";\n    for (let i = 0; i < raw.length; i++) {\n      let next = raw[i];\n      if (escapeSpecialCharacters) {\n        // handle escaped newlines, backticks, and interpolation characters\n        next = next.replace(/\\\\\\n[ \\t]*/g, \"\").replace(/\\\\`/g, \"`\").replace(/\\\\\\$/g, \"$\").replace(/\\\\\\{/g, \"{\");\n      }\n      result += next;\n      if (i < values.length) {\n        const value = alignValues ? alignValue(values[i], result) : values[i];\n\n        // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n        result += value;\n      }\n    }\n\n    // now strip indentation\n    const lines = result.split(\"\\n\");\n    let mindent = null;\n    for (const l of lines) {\n      const m = l.match(/^(\\s+)\\S+/);\n      if (m) {\n        const indent = m[1].length;\n        if (!mindent) {\n          // this is the first indented line\n          mindent = indent;\n        } else {\n          mindent = Math.min(mindent, indent);\n        }\n      }\n    }\n    if (mindent !== null) {\n      const m = mindent; // appease TypeScript\n      result = lines\n      // https://github.com/typescript-eslint/typescript-eslint/issues/7140\n      // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n      .map(l => l[0] === \" \" || l[0] === \"\\t\" ? l.slice(m) : l).join(\"\\n\");\n    }\n\n    // dedent eats leading and trailing whitespace too\n    if (trimWhitespace) {\n      result = result.trim();\n    }\n\n    // Unescape escapes after trimming so sequences like `\\n`, `\\t`,\n    // `\\xHH` and `\\u{...}` are preserved (fixes #24)\n    if (escapeSpecialCharacters) {\n      result = result.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\").replace(/\\\\r/g, \"\\r\").replace(/\\\\v/g, \"\\v\").replace(/\\\\b/g, \"\\b\").replace(/\\\\f/g, \"\\f\").replace(/\\\\0/g, \"\\0\").replace(/\\\\x([\\da-fA-F]{2})/g, (_, h) => String.fromCharCode(parseInt(h, 16))).replace(/\\\\u\\{([\\da-fA-F]{1,6})\\}/g, (_, h) => String.fromCodePoint(parseInt(h, 16))).replace(/\\\\u([\\da-fA-F]{4})/g, (_, h) => String.fromCharCode(parseInt(h, 16)));\n    }\n\n    // Workaround for Bun issue with Unicode characters\n    // https://github.com/oven-sh/bun/issues/8745\n    if (typeof Bun !== \"undefined\") {\n      result = result.replace(\n      // Matches e.g. \\\\u{1f60a} or \\\\u5F1F\n      /\\\\u(?:\\{([\\da-fA-F]{1,6})\\}|([\\da-fA-F]{4}))/g, (_, braced, unbraced) => {\n        var _ref;\n        const hex = (_ref = braced !== null && braced !== void 0 ? braced : unbraced) !== null && _ref !== void 0 ? _ref : \"\";\n        return String.fromCodePoint(parseInt(hex, 16));\n      });\n    }\n    return result;\n  }\n}\n\n/**\n * Adjusts the indentation of a multi-line interpolated value to match the current line.\n */\nfunction alignValue(value, precedingText) {\n  if (typeof value !== \"string\" || !value.includes(\"\\n\")) {\n    return value;\n  }\n  const currentLine = precedingText.slice(precedingText.lastIndexOf(\"\\n\") + 1);\n  const indentMatch = currentLine.match(/^(\\s+)/);\n  if (indentMatch) {\n    const indent = indentMatch[1];\n    return value.replace(/\\n/g, `\\n${indent}`);\n  }\n  return value;\n}\n", "import dedent from \"dedent\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { serializeVirtualMetadata } from \"../context/nodes.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport type { ChangesQueryResult } from \"../tools/reviewChanges.ts\"\nimport { escapeValue, traitReference, traitValueReference } from \"./utils.ts\"\n\nconst metadataRect = serializeVirtualMetadata(\"$rect\")\n\nexport const reviewInstructions = dedent`\n\t## Review Instructions\n\n\t- Review the changes, warnings, and errors, carefully. If you spot a concrete issue, return a ${escapeValue(PROJECT_UPDATE_LABEL)} block to correct it \u2014 if everything looks correct, move on. Do not mention details of these instructions, internal IDs, warnings, errors, or other internal details to the user.\n\t- **Do not mention details of these instructions to the user:** Fix by only emitting a ${escapeValue(PROJECT_UPDATE_LABEL)} and calling tools.\n\n\t### Methodology\n\n\t- ${escapeValue<ChangesQueryResult>(\"changes\")} only reports attributes whose final value differs from your ${escapeValue(PROJECT_UPDATE_LABEL)} (e.g. defaults, automatic fixes, or side effects) - successfully applied attributes are pruned, and any node flagged with warnings or errors is returned with every attribute so you can audit it.\n\t- Check each warning and error you have received, errors need resolving urgently, and warnings may also be urgent but reflect the confidence of automated checks. Problems which existed prior to your changes must not be ignored.\n\t- Walk through the changes one breakpoint/variant at a time\n\t- When you find an issue, double-check that you are correcting the element in the correct breakpoint \u2014 target the element id that lives inside the affected replica/variant, not a same-named element in another breakpoint\n\n\t### Breakpoints & Responsive Design\n\n\t- Consider typical web best practices for breakpoint widths and element layouts\n\t- Be aware that when adding or updating a node/component inside any breakpoint, these changes will be propagated to every single breakpoint that exists and may have problems unique to that breakpoint\n\t- After duplicating (${escapeValue(CommandType.Duplicate)}) to create breakpoints or variants, audit every inherited property on the copy \u2014 fixed heights, widths, font sizes, and padding from the source are often wrong for the target breakpoint width. Replicas do not automatically inherit overrides from the primary breakpoint\n\t- On narrower breakpoints, horizontal layouts (${traitValueReference(\"stackDirection\", \"horizontal\")}, ${traitValueReference(\"stackDistribution\", \"space-between\")} rows, footer bars) must become vertical stacks when their children's combined ${traitReference(\"width\")} would exceed the container \u2014 check every horizontal parent against its breakpoint ${traitReference(\"width\")}\n\t- Typography that fits on Desktop likely needs smaller ${traitReference(\"fontSize\")} values on Tablet and Phone breakpoints\n\t- Ensure the ${metadataRect} field in your changes response is the intended size\n\n\t### Completeness\n\n\t- After bulk operations, review the results to confirm the actual number of changes matches the expected number\n\t- Ensure that the page looks complete, don't leave sections unfinished unless the user requested it.\n\n\t### Navigation & Links\n\n\t- All navigation and link elements (e.g. nav bar items, CTA buttons, footer items, etc.) should have a link to a section in the same page, to another page in the project, or to an external URL.\n\t- If a navigation element doesn't yet have a corresponding page section or project page, create one and add the link afterwards. Links must always be added after the target section or page already exists.\n\t- Don't connect navigation items to sections that are unrelated to them. If you can't find a related section or page, either rename the link, or create a new section/page that fits the navigation item.\n\t- When linking from the nav bar to sections in the same page, review the nav items and the section to make sure they match and are in the same order. If not, change them.\n\n\t#### Pay special attention to navigation items and links in these common areas:\n\n\t1. Navigation bar \u2014 navigation items and buttons\n\t2. Hero section \u2014 CTA buttons\n\t3. Footer \u2014 all navigation items and links\n`\n", "import { getLogger } from \"@framerjs/shared\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isReplicaChild } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport type {\n\tAttributeChangeDecisionMetrics,\n\tAttributeChangeDecisionReason,\n\tVirtualTargetAttributeFilter,\n} from \"../context/nodeAttributeChanges.ts\"\nimport { transformCanvasNodeToAiContext, type ChangesAIContextNode } from \"../context/nodes.ts\"\nimport type { RichTextTarget } from \"../context/richtext/document.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\n\nconst log = getLogger(\"ai:agents:changes\")\n\nexport interface DeletedNodeChange {\n\tid: string\n\tdeleted: true\n\tmessage: string\n}\n\nexport interface SerializedChanges {\n\tinserted: Record<string, ChangesAIContextNode>\n\tupdated: Record<string, ChangesAIContextNode>\n\tappliedWithIssues: Record<string, ChangesAIContextNode>\n\tdeleted: Record<string, DeletedNodeChange>\n}\n\nexport interface ChangedNodes {\n\tinserted: CanvasNode[]\n\tchanged: CanvasNode[]\n\tinsertedOrChanged: CanvasNode[]\n\tdeleted: NodeID[]\n}\n\ninterface SerializeChangesOptions {\n\tattributeFilterMarkNullOnUndefined?: boolean\n}\n\ninterface SerializeNodeOptions extends SerializeChangesOptions {\n\tattributeFilter?: ReadonlySet<string>\n\tvirtualAttributeFiltersByTarget?: ReadonlyMap<RichTextTarget, VirtualTargetAttributeFilter>\n}\n\nexport function getChangedNodes(ctx: AgentContext): ChangedNodes {\n\tconst inserted: CanvasNode[] = []\n\tconst changed: CanvasNode[] = []\n\tconst deleted: NodeID[] = []\n\n\tfor (const [nodeId, operation] of ctx.treeResolver.getLastChanges()) {\n\t\tconst node = ctx.treeResolver.get(nodeId)\n\n\t\t// Realistically !node would be a bug, but we can recover entirely safely here\n\t\tif (operation === \"remove\" || !node) {\n\t\t\tdeleted.push(nodeId)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Replica children need special treatment\n\t\t// If they are merely inserted (automatically) then we can treat them as changed to avoid the cost of full serialization\n\t\t// If they are insertedAndUpdated in the same turn, then we need to treat them as inserted to ensure their fully updated state is captured\n\t\tif (isReplicaChild(node) && operation === \"insert\") {\n\t\t\tchanged.push(node)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (operation === \"insert\" || operation === \"insertAndUpdate\") {\n\t\t\tinserted.push(node)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (operation === \"update\") {\n\t\t\tchanged.push(node)\n\t\t\tcontinue\n\t\t}\n\n\t\tassertNever(operation, `Unknown tree operation: ${String(operation)}`)\n\t}\n\n\treturn {\n\t\tinserted,\n\t\tchanged,\n\t\tdeleted,\n\t\tinsertedOrChanged: inserted.concat(changed),\n\t}\n}\n\nexport async function serializeChanges(\n\tctx: AgentContext,\n\tchangedNodes: ChangedNodes,\n\tnodesWithIssues: Set<NodeID>,\n): Promise<SerializedChanges> {\n\tusing attributeChanges = ctx.nodeAttributeChanges.asDisposable()\n\n\tconst changes: SerializedChanges = { inserted: {}, updated: {}, appliedWithIssues: {}, deleted: {} }\n\tconst pruningMetrics = new ChangesPruningMetrics()\n\n\tfor (const node of changedNodes.inserted) {\n\t\tconst key = ctx.treeResolver.getLlmId(node.id) ?? node.id\n\n\t\tif (nodesWithIssues.has(node.id)) {\n\t\t\tpruningMetrics.recordNodeWithIssues(node.id)\n\t\t\tconst serialized = await serializeNode(key, node, ctx, { attributeFilterMarkNullOnUndefined: true })\n\t\t\tif (!serialized) continue\n\n\t\t\tchanges.appliedWithIssues[key] = serialized\n\t\t\tcontinue\n\t\t}\n\n\t\tconst { attributes, virtualAttributesByTarget, metrics } =\n\t\t\tawait attributeChanges.getAttributesWithSideEffectChanges(node)\n\n\t\tpruningMetrics.recordAttributePruning(node.id, metrics)\n\n\t\tconst serialized = await serializeNode(key, node, ctx, {\n\t\t\tattributeFilter: attributes,\n\t\t\tattributeFilterMarkNullOnUndefined: true,\n\t\t\tvirtualAttributeFiltersByTarget: virtualAttributesByTarget,\n\t\t})\n\t\tif (!serialized) continue\n\n\t\tchanges.inserted[key] = serialized\n\t}\n\n\tfor (const node of changedNodes.changed) {\n\t\tconst key = ctx.treeResolver.getLlmId(node.id) ?? node.id\n\n\t\tif (nodesWithIssues.has(node.id)) {\n\t\t\tpruningMetrics.recordNodeWithIssues(node.id)\n\t\t\tconst serialized = await serializeNode(key, node, ctx, { attributeFilterMarkNullOnUndefined: true })\n\t\t\tif (!serialized) continue\n\n\t\t\tchanges.appliedWithIssues[key] = serialized\n\t\t\tcontinue\n\t\t}\n\n\t\tconst { attributes, virtualAttributesByTarget, metrics } =\n\t\t\tawait attributeChanges.getAttributesWithSideEffectChanges(node)\n\t\tpruningMetrics.recordAttributePruning(node.id, metrics)\n\t\tconst serialized = await serializeNode(key, node, ctx, {\n\t\t\tattributeFilter: attributes,\n\t\t\tattributeFilterMarkNullOnUndefined: true,\n\t\t\tvirtualAttributeFiltersByTarget: virtualAttributesByTarget,\n\t\t})\n\t\tif (!serialized) continue\n\n\t\tchanges.updated[key] = serialized\n\t}\n\n\tfor (const nodeId of changedNodes.deleted) {\n\t\tconst key = ctx.treeResolver.getLlmId(nodeId) ?? nodeId\n\t\tchanges.deleted[key] = {\n\t\t\tid: key,\n\t\t\tdeleted: true,\n\t\t\tmessage: `Node ${escapeValue(key)} was deleted.`,\n\t\t}\n\t}\n\n\tlog.debug(\"Serialized changes\", { changes, changedNodes, pruningMetrics: pruningMetrics.finalise() })\n\n\treturn changes\n}\n\nasync function serializeNode(\n\tkey: string,\n\tnode: CanvasNode,\n\tctx: AgentContext,\n\toptions?: SerializeNodeOptions,\n): Promise<ChangesAIContextNode | null> {\n\tconst serialized = await transformCanvasNodeToAiContext(node, ctx, null, false, undefined, undefined, options)\n\tif (!serialized) return null\n\treturn omitMatchingNodeId(serialized, key)\n}\n\nfunction omitMatchingNodeId(node: ChangesAIContextNode, key: string): ChangesAIContextNode {\n\tif (node.id !== key) {\n\t\treturn node\n\t}\n\n\tconst { id: _id, ...nodeWithoutId } = node\n\treturn nodeWithoutId\n}\n\ninterface SerializedChangesPruningMetrics {\n\ttotal: number\n\tpruned: number\n\treasons: Map<ChangesPruningDecisionReason, number>\n\tnodes: Map<NodeID, Map<string, ChangesPruningDecisionReason>>\n}\n\ntype ChangesPruningDecisionReason = \"node_with_issues\" | \"rich_text_node\" | AttributeChangeDecisionReason\n\nclass ChangesPruningMetrics {\n\t#total = 0\n\t#pruned = 0\n\t#reasons = new Map<ChangesPruningDecisionReason, number>()\n\t#nodes = new Map<NodeID, Map<string, ChangesPruningDecisionReason>>()\n\n\trecordNodeWithIssues(nodeId: NodeID): void {\n\t\tthis.#total++\n\t\tthis.#incrementReason(\"node_with_issues\")\n\t\tthis.#recordNodePath(nodeId, \"$node\", \"node_with_issues\")\n\t}\n\n\trecordRichTextNode(nodeId: NodeID): void {\n\t\tthis.#total++\n\t\tthis.#pruned++\n\t\tthis.#incrementReason(\"rich_text_node\")\n\t\tthis.#recordNodePath(nodeId, \"$node\", \"rich_text_node\")\n\t}\n\n\trecordAttributePruning(nodeId: NodeID, metrics: AttributeChangeDecisionMetrics): void {\n\t\tlet anyPruned = false\n\t\tfor (const [path, { reason }] of metrics) {\n\t\t\tif (reason !== \"side_effect\") {\n\t\t\t\tanyPruned = true\n\t\t\t}\n\t\t\tthis.#incrementReason(reason)\n\t\t\tthis.#recordNodePath(nodeId, path, reason)\n\t\t}\n\n\t\tthis.#total++\n\t\tif (anyPruned) {\n\t\t\tthis.#pruned++\n\t\t}\n\t}\n\n\tfinalise(): SerializedChangesPruningMetrics {\n\t\treturn {\n\t\t\ttotal: this.#total,\n\t\t\tpruned: this.#pruned,\n\t\t\treasons: this.#reasons,\n\t\t\tnodes: this.#nodes,\n\t\t}\n\t}\n\n\t#incrementReason(reason: ChangesPruningDecisionReason, count = 1): void {\n\t\tthis.#reasons.set(reason, (this.#reasons.get(reason) ?? 0) + count)\n\t}\n\n\t#recordNodePath(nodeId: NodeID, path: string, reason: ChangesPruningDecisionReason): void {\n\t\tconst nodeMetrics = this.#nodes.get(nodeId) ?? new Map<string, ChangesPruningDecisionReason>()\n\t\tnodeMetrics.set(path, reason)\n\t\tthis.#nodes.set(nodeId, nodeMetrics)\n\t}\n}\n", "import { LogLevel, assert, assertNever, getLogger, isEmptyObject } from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport { getNodeIdForPossiblyVirtualId } from \"app/ai/agents/commandTargets.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isObject, isObjectWithKey } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport type { AgentContext, SystemState } from \"../context/AgentContext.ts\"\nimport type { DeferredTraitReport } from \"../context/deferred.ts\"\nimport type { ProjectUpdateErrorResult, ProjectUpdateWarningResult, UncategorizedWarning } from \"../context/issues.ts\"\nimport { formatElapsedMs } from \"../debug/utils.ts\"\nimport { getLintProblems } from \"../linting/index.ts\"\nimport { createNodesDataProvider } from \"../linting/lib/NodesDataProvider.ts\"\nimport { reviewInstructions } from \"../prompt/reviewInstructions.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport type { ChatPart, EmitChatPart } from \"../types.ts\"\nimport { CHANGES_QUERY } from \"./readProjectQueryTypes.ts\"\nimport type { SerializedChanges } from \"./serializeChanges.ts\"\nimport { getChangedNodes, serializeChanges } from \"./serializeChanges.ts\"\nimport { REVIEW_CHANGES_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nconst ReviewChangesInputSchema = z.object({})\n\ninterface BaseChangesQueryResult {\n\ttype: typeof CHANGES_QUERY\n}\n\nexport interface ChangesQueryResult extends BaseChangesQueryResult {\n\tchanges: SerializedChanges\n\terrors: ProjectUpdateErrorResult[]\n\twarnings: ProjectUpdateWarningResult\n\tdeferred: readonly DeferredTraitReport[]\n\treviewInstructions?: string\n\tredacted?: never\n}\n\nexport interface ChangesQueryRedactedResult extends BaseChangesQueryResult {\n\tredacted: true\n\treason: string\n}\n\ntype AnyChangesQueryResult = ChangesQueryResult | ChangesQueryRedactedResult\n\nconst redactedKey = \"redacted\" satisfies keyof ChangesQueryRedactedResult\n\nexport function isChangesResult(result: unknown): result is ChangesQueryResult {\n\treturn isObject(result) && result.type === CHANGES_QUERY && !(redactedKey in result && result[redactedKey] === true)\n}\n\nexport interface ReviewChangesResponse {\n\tresult: AnyChangesQueryResult\n\tsystemState?: SystemState\n}\n\nconst resultKey = \"result\" satisfies keyof ReviewChangesResponse\n\nexport function isReviewChangesToolResponseValue(value: unknown): value is ReviewChangesResponse {\n\tif (!isObjectWithKey(value, resultKey)) return false\n\tconst result = value[resultKey]\n\treturn isObject(result) && result.type === CHANGES_QUERY\n}\n\nconst description =\n\t`Review changes made by ${escapeValue(PROJECT_UPDATE_LABEL)} commands and return review instructions, changes, errors, warnings, deferred commands.` as const\n\nconst log = getLogger(\"ai:agents:changes\")\n\nfunction logReviewChanges(message: string, result: ChangesQueryResult, elapsedMs?: number) {\n\tif (log.level > LogLevel.Debug) return\n\tconst elapsedText = elapsedMs === undefined ? \"\" : ` | ${formatElapsedMs(elapsedMs)}`\n\tlog.debug(`${message}${elapsedText}`, result)\n}\n\nfunction toReviewChangesResponse(ctx: AgentContext, result: ChangesQueryResult): ReviewChangesResponse {\n\treturn {\n\t\tresult,\n\t\tsystemState: ctx.getToolResultSystemStateMessages(),\n\t}\n}\n\nexport async function reviewChanges(ctx: AgentContext): Promise<ChangesQueryResult> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required\")\n\n\tconst changedNodes = getChangedNodes(ctx)\n\n\tconst consumedWarnings = ctx.issues.consumeWarnings()\n\tconst consumedErrors = ctx.issues.consumeErrors()\n\tconst uncategorized: UncategorizedWarning[] =\n\t\t(await ctx.issues.consumeUncategorizedWarnings(changedNodes.insertedOrChanged, engine)) ?? []\n\tconst deferred = ctx.deferred.getPendingDeferredTraits(ctx)\n\tconst errors: ProjectUpdateErrorResult[] = consumedErrors.errors\n\n\tconst lintProblems = await getLintProblems({\n\t\tnodesToLint: changedNodes.insertedOrChanged,\n\t\tnodesDataProvider: createNodesDataProvider(ctx),\n\t\truleConfig: {\n\t\t\tthemes: ctx.tokens.getThemes(),\n\t\t},\n\t})\n\n\tconst nodeIdsWithProblems = new Set<NodeID>(\n\t\tuncategorized.concat(lintProblems).flatMap(problem => problem.nodeIds.map(getNodeIdForPossiblyVirtualId)),\n\t)\n\t\t.union(consumedErrors.affectedNodeIds)\n\t\t.union(consumedWarnings.affectedNodeIds)\n\n\tfor (const deferredTrait of deferred) {\n\t\tif (deferredTrait.nodeId) {\n\t\t\tnodeIdsWithProblems.add(deferredTrait.nodeId)\n\t\t}\n\t}\n\n\tfor (const lintProblem of lintProblems) {\n\t\tswitch (lintProblem.level) {\n\t\t\tcase \"warning\":\n\t\t\t\tuncategorized.push(lintProblem)\n\t\t\t\tcontinue\n\t\t\tcase \"error\":\n\t\t\t\terrors.push(lintProblem)\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\tassertNever(lintProblem.level, \"Unknown lint problem level\")\n\t\t}\n\t}\n\n\tconst changes = await serializeChanges(ctx, changedNodes, nodeIdsWithProblems)\n\n\tconst noChanges =\n\t\tisEmptyObject(changes.inserted) &&\n\t\tisEmptyObject(changes.updated) &&\n\t\tisEmptyObject(changes.appliedWithIssues) &&\n\t\tisEmptyObject(changes.deleted)\n\tconst noWarnings = isEmptyObject(consumedWarnings.warnings) && uncategorized.length === 0\n\tif (noChanges && noWarnings && errors.length === 0 && deferred.length === 0) {\n\t\terrors.push({\n\t\t\tstatement: \"\",\n\t\t\terror: `No changes to review. Only call ${escapeValue(REVIEW_CHANGES_TOOL_NAME)} after emitting ${escapeValue(PROJECT_UPDATE_LABEL)} blocks.`,\n\t\t})\n\t}\n\n\treturn {\n\t\ttype: CHANGES_QUERY,\n\t\treviewInstructions: noChanges ? undefined : reviewInstructions,\n\t\tchanges,\n\t\twarnings: uncategorized.length > 0 ? { ...consumedWarnings.warnings, uncategorized } : consumedWarnings.warnings,\n\t\terrors,\n\t\tdeferred,\n\t}\n}\n\nexport function createReviewChangesTool(ctx: AgentContext, synchronize: () => Promise<void>, onPart?: EmitChatPart) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: ReviewChangesInputSchema,\n\t\t\texecute: async (): Promise<ReviewChangesResponse> => {\n\t\t\t\tconst startedAt = performance.now()\n\t\t\t\tconst result = await reviewChanges(ctx)\n\t\t\t\tlogReviewChanges(\"Tool response: reviewChanges\", result, Math.round(performance.now() - startedAt))\n\t\t\t\treturn toReviewChangesResponse(ctx, result)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: () => ({ type: \"read\", task: \"review\" }) satisfies ChatPart,\n\t\t},\n\t)\n}\n\n/** Used by the Agent evals. */\nexport function createReviewChangesToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: ReviewChangesInputSchema,\n\t})\n}\n", "// oxlint-disable typescript/unbound-method\nimport { emptyArray } from \"@framerjs/shared\"\nimport type { TaskScheduler } from \"document/loader/TaskScheduler.ts\"\nimport { type CanvasNode, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { withVariables } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport type { Rect } from \"library/index.ts\"\nimport { isFunction } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport {\n\ttype AIContextNode,\n\ttype AIContextNodeChild,\n\ttype TransformToAiNodeOptions,\n\tgetContextChildNodes,\n\tgetRoundedContextRect,\n\tgetName,\n\thasChildren,\n\tisAIContextNode,\n\tisRedactedNode,\n\ttransformToAiNode,\n} from \"./context/nodes.ts\"\nimport { getClassDiscriminatorForContextNodeType, isSupportedDSLNodeClass, isVirtualNodeClass } from \"./dsl.ts\"\nimport type { AIContextNodeAncestorPathEntry, AIContextNodeWithSpine } from \"./tools/script/types.ts\"\n\ninterface SerializeCanvasNodeOptions {\n\tdepth?: number\n\tancestors?: number\n\tattributeFilter?: readonly string[]\n\tancestorPath?: boolean\n}\n\nexport async function serializeCanvasNodes(\n\tctx: AgentContext,\n\tnodes: readonly CanvasNode[],\n\tincludeChildren: boolean,\n\ttaskScheduler?: TaskScheduler,\n\toptions?: TransformToAiNodeOptions,\n): Promise<AIContextNode[]> {\n\tconst result: AIContextNode[] = []\n\tfor (const node of nodes) {\n\t\tawait taskScheduler?.yield()\n\t\tconst serialized = await serializeCanvasNode(ctx, node, includeChildren, undefined, taskScheduler, options)\n\t\tif (serialized) result.push(serialized)\n\t}\n\treturn result\n}\n\nasync function serializeCanvasNode(\n\tctx: AgentContext,\n\tnode: CanvasNode,\n\tincludeChildren: boolean,\n\tmaxDepth?: number,\n\ttaskScheduler?: TaskScheduler,\n\toptions?: TransformToAiNodeOptions,\n): Promise<AIContextNode | null> {\n\tif (isScopeNode(node) && withVariables(node)) ctx.dynamicValues.replaceNodeVariables(node)\n\treturn (await transformToAiNode([node], ctx, includeChildren, maxDepth, taskScheduler, options))[0] ?? null\n}\n\nexport async function serializeCanvasNodeWithOptions(\n\tctx: AgentContext,\n\tnode: CanvasNode,\n\toptions: SerializeCanvasNodeOptions,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode | AIContextNodeWithSpine | null> {\n\tconst normalizedAttributeFilter = options.attributeFilter ? new Set(options.attributeFilter) : undefined\n\tconst serializedNode = await serializeCanvasNode(ctx, node, true, options.depth, taskScheduler, {\n\t\tattributeFilter: normalizedAttributeFilter,\n\t})\n\tif (!serializedNode) return null\n\n\tconst nodeWithAncestorContext = await serializeAncestorContext(ctx, node, serializedNode, options, taskScheduler)\n\n\tif (!options.ancestorPath) return nodeWithAncestorContext\n\n\treturn {\n\t\tancestorPath: await serializeCanvasNodeAncestorPath(\n\t\t\tctx,\n\t\t\tctx.treeResolver.get(nodeWithAncestorContext.id) ?? node,\n\t\t\ttaskScheduler,\n\t\t),\n\t\tnode: nodeWithAncestorContext,\n\t}\n}\n\n/** Builds an ancestor-rooted fragment where siblings are shallow and the target path keeps its requested depth. */\nasync function serializeAncestorContext(\n\tctx: AgentContext,\n\tnode: CanvasNode,\n\tserializedNode: AIContextNode,\n\toptions: SerializeCanvasNodeOptions,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode> {\n\tconst maxAncestors = options.ancestors\n\tif (!maxAncestors) return serializedNode\n\n\tconst contextAncestors: CanvasNode[] = []\n\tconst normalizedAttributeFilter = options.attributeFilter ? new Set(options.attributeFilter) : undefined\n\n\tfor (const ancestor of ctx.treeResolver.getAncestorsFor(node.id)) {\n\t\tawait taskScheduler?.yield()\n\t\tif (contextAncestors.length >= maxAncestors) break\n\t\tif (ancestor.id === ctx.treeStore.tree.root.id) continue\n\t\tcontextAncestors.push(ancestor)\n\t}\n\n\tlet child = serializedNode\n\tfor (const ancestor of contextAncestors) {\n\t\tconst serializedAncestor = await serializeCanvasNode(ctx, ancestor, false, undefined, taskScheduler, {\n\t\t\tattributeFilter: normalizedAttributeFilter,\n\t\t})\n\t\tif (!serializedAncestor || isRedactedNode(serializedAncestor)) break\n\n\t\tchild = withContextChildren(\n\t\t\tserializedAncestor,\n\t\t\tawait serializeContextChildren(ctx, ancestor, child, normalizedAttributeFilter, taskScheduler),\n\t\t)\n\t}\n\n\treturn child\n}\n\nfunction withContextChildren(node: AIContextNode, children: AIContextNodeChild[]): AIContextNode {\n\treturn Object.assign({}, node, { children })\n}\n\nasync function serializeContextChildren(\n\tctx: AgentContext,\n\tancestor: CanvasNode,\n\tpathChild: AIContextNode,\n\tattributeFilter: TransformToAiNodeOptions[\"attributeFilter\"],\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNodeChild[]> {\n\tconst children: AIContextNodeChild[] = []\n\n\tfor (const child of getContextChildNodes(ancestor)) {\n\t\tawait taskScheduler?.yield()\n\t\tif (child.id === pathChild.id) {\n\t\t\tchildren.push(pathChild)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst sibling = await serializeCanvasNode(ctx, child, true, 0, taskScheduler, {\n\t\t\tattributeFilter,\n\t\t})\n\t\tif (sibling) children.push(sibling)\n\t}\n\n\treturn children\n}\n\nasync function serializeCanvasNodeAncestorPath(\n\tctx: AgentContext,\n\tnode: CanvasNode,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNodeAncestorPathEntry[]> {\n\tconst ancestors = ctx.treeResolver.getAncestorsFor(node.id)\n\tconst ancestorPath: AIContextNodeAncestorPathEntry[] = []\n\n\tfor (let index = ancestors.length - 1; index >= 0; index--) {\n\t\tawait taskScheduler?.yield()\n\t\tconst ancestor = ancestors[index]\n\t\tif (!ancestor || ancestor.id === ctx.treeStore.tree.root.id) continue\n\n\t\tconst serialized = await serializeCanvasNode(ctx, ancestor, false, undefined, taskScheduler)\n\t\tif (!serialized || isRedactedNode(serialized)) continue\n\n\t\tancestorPath.push({\n\t\t\tid: serialized.id,\n\t\t\ttype: serialized.type,\n\t\t\tname: getName(serialized),\n\t\t})\n\t}\n\n\treturn ancestorPath\n}\n\n/**\n * api.tree.* traversal apis skip expensive metadata collection.\n * Model uses api.serialize to get the full node with metadata.\n */\nconst traversalSerializationOptions: TransformToAiNodeOptions = {\n\tincludeMediaQueryRange: false,\n\tincludeRect: false,\n}\n\nexport async function getNode(\n\tctx: AgentContext,\n\tid: string,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode | null> {\n\tconst node = ctx.treeResolver.get(id)\n\tif (!node) return null\n\treturn (await serializeCanvasNodes(ctx, [node], true, taskScheduler, traversalSerializationOptions))[0] ?? null\n}\n\nexport async function getNodes(\n\tctx: AgentContext,\n\tids: readonly string[],\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode[]> {\n\treturn serializeCanvasNodes(ctx, collectCanvasNodes(ctx, ids), true, taskScheduler, traversalSerializationOptions)\n}\n\nexport function getRect(ctx: AgentContext, id: string): Rect | null {\n\tconst node = ctx.treeResolver.get(id)\n\tif (!node) return null\n\treturn getRoundedContextRect(ctx.treeResolver.getLookupTree(), node)\n}\n\nexport async function getNodesOfTypes(\n\tctx: AgentContext,\n\ttypes: AIContextNode[\"type\"][],\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode[]> {\n\tconst requestedTypes = new Set(types)\n\tconst requestedVirtualTypes = getRequestedVirtualTypes(requestedTypes)\n\tconst matchingNodes = await getNodesForTypes(ctx, requestedTypes, taskScheduler)\n\n\tconst matchingSerializedNodes = await serializeCanvasNodes(\n\t\tctx,\n\t\tmatchingNodes,\n\t\tfalse,\n\t\ttaskScheduler,\n\t\ttraversalSerializationOptions,\n\t)\n\tconst matchingConcreteTypes = matchingSerializedNodes.filter(node => requestedTypes.has(node.type))\n\tif (requestedVirtualTypes.size === 0) return matchingConcreteTypes\n\n\tconst richTextNodes = await getNodesByClassNames(ctx, [ClassDiscriminator.RichTextNode], taskScheduler)\n\tconst serializedRichTextNodes = await serializeCanvasNodes(\n\t\tctx,\n\t\trichTextNodes,\n\t\tfalse,\n\t\ttaskScheduler,\n\t\ttraversalSerializationOptions,\n\t)\n\n\tconst matchingVirtualNodes: AIContextNode[] = []\n\tfor (const node of serializedRichTextNodes) {\n\t\tawait taskScheduler?.yield()\n\t\tcollectMatchingVirtualNodes(node, requestedVirtualTypes, matchingVirtualNodes)\n\t}\n\n\treturn [...matchingConcreteTypes, ...matchingVirtualNodes]\n}\n\nexport async function getScopeNodeFor(\n\tctx: AgentContext,\n\tid: string,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode | null> {\n\tconst node = ctx.treeResolver.getScopeNodeFor(id)\n\tif (!node) return null\n\treturn (await serializeCanvasNodes(ctx, [node], false, taskScheduler, traversalSerializationOptions))[0] ?? null\n}\n\nexport async function getGroundNodeFor(\n\tctx: AgentContext,\n\tid: string,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode | null> {\n\tconst node = ctx.treeResolver.getGroundNodeFor(id)\n\tif (!node) return null\n\treturn (await serializeCanvasNodes(ctx, [node], false, taskScheduler, traversalSerializationOptions))[0] ?? null\n}\n\nexport async function getParentNodeFor(\n\tctx: AgentContext,\n\tid: string,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode | null> {\n\tconst node = ctx.treeResolver.get(id)\n\tif (!node) return null\n\tconst parent = ctx.treeResolver.getParentNode(node)\n\tif (!parent) return null\n\treturn (await serializeCanvasNodes(ctx, [parent], false, taskScheduler, traversalSerializationOptions))[0] ?? null\n}\n\nexport async function getAncestorsFor(\n\tctx: AgentContext,\n\tid: string,\n\ttaskScheduler?: TaskScheduler,\n): Promise<AIContextNode[]> {\n\tconst ancestors = ctx.treeResolver.getAncestorsFor(id)\n\tif (ancestors.length === 0) return []\n\treturn serializeCanvasNodes(ctx, ancestors, false, taskScheduler, traversalSerializationOptions)\n}\n\nexport function collectCanvasNodes(ctx: AgentContext, ids: readonly string[]): CanvasNode[] {\n\tconst nodes: CanvasNode[] = []\n\tfor (const id of ids) {\n\t\tconst node = ctx.treeResolver.get(id)\n\t\tif (node) nodes.push(node)\n\t}\n\treturn nodes\n}\n\nfunction getRequestedVirtualTypes(requestedTypes: ReadonlySet<AIContextNode[\"type\"]>): Set<AIContextNode[\"type\"]> {\n\tconst requestedVirtualTypes = new Set<AIContextNode[\"type\"]>()\n\tfor (const type of requestedTypes) {\n\t\tif (isVirtualNodeClass(type)) {\n\t\t\trequestedVirtualTypes.add(type)\n\t\t}\n\t}\n\treturn requestedVirtualTypes\n}\n\nasync function getNodesForTypes(\n\tctx: AgentContext,\n\trequestedTypes: ReadonlySet<AIContextNode[\"type\"]>,\n\ttaskScheduler?: TaskScheduler,\n): Promise<readonly CanvasNode[]> {\n\tconst classNames: ClassDiscriminator[] = []\n\tfor (const type of requestedTypes) {\n\t\tif (isVirtualNodeClass(type) || !isSupportedDSLNodeClass(type)) continue\n\t\tconst concreteType = getClassDiscriminatorForContextNodeType(type)\n\t\tif (concreteType) classNames.push(concreteType)\n\t}\n\n\treturn getNodesByClassNames(ctx, classNames, taskScheduler)\n}\n\nasync function getNodesByClassNames(\n\tctx: AgentContext,\n\tclassNames: readonly ClassDiscriminator[],\n\ttaskScheduler?: TaskScheduler,\n): Promise<readonly CanvasNode[]> {\n\tif (classNames.length === 0) return emptyArray()\n\n\tawait taskScheduler?.yield()\n\n\tif (isFunction(ctx.treeStore.query)) {\n\t\tconst query = ctx.treeStore.query().partial(true)\n\t\tfor (const className of classNames) {\n\t\t\tquery.whereClassName(className)\n\t\t}\n\t\tconst result = query.asArray()\n\t\tawait taskScheduler?.yield()\n\t\treturn result\n\t}\n\n\tconst tree = isFunction(ctx.treeStore.getDataTreeOrPartialTree)\n\t\t? ctx.treeStore.getDataTreeOrPartialTree()\n\t\t: ctx.treeStore.tree\n\n\tconst classNameSet = new Set(classNames)\n\tconst result: CanvasNode[] = []\n\n\ttree.beginAllowPartialScopeAccess?.()\n\n\ttry {\n\t\tfor (const node of tree.root.walk()) {\n\t\t\tif (classNameSet.has(node.__class)) result.push(node)\n\t\t}\n\t} finally {\n\t\ttree.endAllowPartialScopeAccess?.()\n\t}\n\n\treturn result\n}\n\nfunction collectMatchingVirtualNodes(\n\tnode: AIContextNode,\n\trequestedVirtualTypes: ReadonlySet<AIContextNode[\"type\"]>,\n\tmatchingVirtualNodes: AIContextNode[],\n): void {\n\tconst children = hasChildren(node) ? node.children : emptyArray()\n\tif (children.length === 0) return\n\n\tfor (const child of children) {\n\t\tif (!isAIContextNode(child)) continue\n\t\tif (requestedVirtualTypes.has(child.type)) {\n\t\t\tmatchingVirtualNodes.push(child)\n\t\t}\n\t\tcollectMatchingVirtualNodes(child, requestedVirtualTypes, matchingVirtualNodes)\n\t}\n}\n", "import type { CmsMetadataColumn, CmsVariableId } from \"app/agent/editor/agentInputSchema.ts\"\nimport type { AgentSkillDirectiveId } from \"app/agent/skillDirectives.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\n\nconst AgentReferences = {\n\tselection: \"selection\",\n\tpage: \"page\",\n\tdesignPage: \"design-page\",\n\tcomponent: \"component\",\n\ttextStyle: \"text-style\",\n\tlinkStyle: \"link-style\",\n\tcolorStyle: \"color-style\",\n\tlayoutTemplate: \"layout-template\",\n\tcmsSelection: \"cms-selection\",\n\tcmsCollection: \"cms-collection\",\n} as const\n\ninterface SelectionReference {\n\treadonly reference: typeof AgentReferences.selection\n\treadonly ids: readonly NodeID[]\n}\n\ninterface PageReference {\n\treadonly reference: typeof AgentReferences.page\n\treadonly id: NodeID\n\treadonly path: string\n\treadonly name: string\n}\n\ninterface DesignPageReference {\n\treadonly reference: typeof AgentReferences.designPage\n\treadonly id: NodeID\n\treadonly name: string\n}\n\ninterface ComponentReference {\n\treadonly reference: typeof AgentReferences.component\n\treadonly id: NodeID\n\treadonly name: string\n}\n\ninterface TextStyleReference {\n\treadonly reference: typeof AgentReferences.textStyle\n\treadonly id: NodeID\n\treadonly name: string\n}\n\ninterface LinkStyleReference {\n\treadonly reference: typeof AgentReferences.linkStyle\n\treadonly id: NodeID\n\treadonly name: string\n}\n\ninterface ColorStyleReference {\n\treadonly reference: typeof AgentReferences.colorStyle\n\treadonly id: NodeID\n\treadonly name: string\n\treadonly color: string\n}\n\ninterface LayoutTemplateReference {\n\treadonly reference: typeof AgentReferences.layoutTemplate\n\treadonly id: NodeID\n\treadonly name: string\n}\n\ninterface CmsCollectionReference {\n\treadonly reference: typeof AgentReferences.cmsCollection\n\treadonly collectionId: NodeID\n\treadonly collectionName: string\n}\n\ninterface CmsSelectionReference {\n\treadonly reference: typeof AgentReferences.cmsSelection\n\treadonly collectionId: NodeID\n\treadonly collectionName: string\n\treadonly collectionItemIds: readonly NodeID[]\n\treadonly variableColumnIds: readonly CmsVariableId[]\n\treadonly metadataColumnIds: readonly CmsMetadataColumn[]\n}\n\ntype AgentPromptReference =\n\t| SelectionReference\n\t| PageReference\n\t| DesignPageReference\n\t| ComponentReference\n\t| TextStyleReference\n\t| LinkStyleReference\n\t| ColorStyleReference\n\t| LayoutTemplateReference\n\t| CmsCollectionReference\n\t| CmsSelectionReference\n\ninterface AgentPromptDirective {\n\treadonly directive: AgentSkillDirectiveId\n\treadonly instruction: string\n}\n\nexport type AgentPromptContextBlock = AgentPromptReference | AgentPromptDirective\n\nexport function createSelectionReference(ids: readonly NodeID[]): SelectionReference {\n\treturn { reference: AgentReferences.selection, ids }\n}\n\nexport function createPageReference(id: NodeID, path: string, name: string): PageReference {\n\treturn { reference: AgentReferences.page, id, path, name }\n}\n\nexport function createDesignPageReference(id: NodeID, name: string): DesignPageReference {\n\treturn { reference: AgentReferences.designPage, id, name }\n}\n\nexport function createComponentReference(id: NodeID, name: string): ComponentReference {\n\treturn { reference: AgentReferences.component, id, name }\n}\n\nexport function createTextStyleReference(id: NodeID, name: string): TextStyleReference {\n\treturn { reference: AgentReferences.textStyle, id, name }\n}\n\nexport function createLinkStyleReference(id: NodeID, name: string): LinkStyleReference {\n\treturn { reference: AgentReferences.linkStyle, id, name }\n}\n\nexport function createColorStyleReference(id: NodeID, name: string, color: string): ColorStyleReference {\n\treturn { reference: AgentReferences.colorStyle, id, name, color }\n}\n\nexport function createLayoutTemplateReference(id: NodeID, name: string): LayoutTemplateReference {\n\treturn { reference: AgentReferences.layoutTemplate, id, name }\n}\n\nexport function createCmsCollectionReference(collectionId: NodeID, collectionName: string): CmsCollectionReference {\n\treturn { reference: AgentReferences.cmsCollection, collectionId, collectionName }\n}\n\nexport function createCmsSelectionReference(\n\tcollectionId: NodeID,\n\tcollectionName: string,\n\tcollectionItemIds: readonly NodeID[],\n\tvariableColumnIds: readonly CmsVariableId[],\n\tmetadataColumnIds: readonly CmsMetadataColumn[],\n): CmsSelectionReference {\n\treturn {\n\t\treference: AgentReferences.cmsSelection,\n\t\tcollectionId,\n\t\tcollectionName,\n\t\tcollectionItemIds,\n\t\tvariableColumnIds,\n\t\tmetadataColumnIds,\n\t}\n}\n\nexport function createDirectiveBlock(directive: AgentSkillDirectiveId, instruction: string): AgentPromptDirective {\n\treturn { directive, instruction }\n}\n\nexport function serializeAgentPromptContextBlock(block: AgentPromptContextBlock): string {\n\treturn `@${JSON.stringify(block)}`\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport {\n\tcreateCmsCollectionReference,\n\tcreateCmsSelectionReference,\n\tcreateColorStyleReference,\n\tcreateComponentReference,\n\tcreateDesignPageReference,\n\tcreateDirectiveBlock,\n\tcreateLinkStyleReference,\n\tcreateLayoutTemplateReference,\n\tcreatePageReference,\n\tcreateSelectionReference,\n\tcreateTextStyleReference,\n\ttype AgentPromptContextBlock,\n\tserializeAgentPromptContextBlock,\n} from \"app/agent/references.ts\"\nimport { getAgentSkillDirective } from \"app/agent/skillDirectives.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/CanvasTree.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isCollectionNode, isLayoutTemplateNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { Node as ProseMirrorNode } from \"prosemirror-model\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport {\n\ttype AgentInputSegment,\n\ttype AgentInputTag,\n\ttype CmsTagSegment,\n\tcmsTagAttrsToSegment,\n\tgetCmsTagAttrs,\n\tgetColorStyleTagAttrs,\n\tgetComponentTagAttrs,\n\tgetDesignPageTagAttrs,\n\tgetFileAttachmentTagAttrs,\n\tgetLayerTagAttrs,\n\tgetLayerTagReferenceIds,\n\tgetLayoutTemplateTagAttrs,\n\tgetPageTagAttrs,\n\tgetSkillTagAttrs,\n\tgetStyleTagAttrs,\n\tisCmsTagSegment,\n\tisLineBreakNode,\n} from \"../agentInputSchema.ts\"\n\nconst agentTagNodeNames = [\n\t\"layer\",\n\t\"cms\",\n\t\"page\",\n\t\"designPage\",\n\t\"component\",\n\t\"textStyle\",\n\t\"linkStyle\",\n\t\"colorStyle\",\n\t\"layoutTemplate\",\n\t\"skill\",\n] as const\ntype AgentTagNodeName = (typeof agentTagNodeNames)[number]\n\n/**\n * Serializes a ProseMirror document to segments.\n */\nexport function serializeToSegments(doc: ProseMirrorNode): AgentInputSegment[] {\n\tconst segments: AgentInputSegment[] = []\n\tlet currentText = \"\"\n\n\tconst flushText = () => {\n\t\tif (currentText) {\n\t\t\tsegments.push(currentText)\n\t\t\tcurrentText = \"\"\n\t\t}\n\t}\n\n\tdoc.forEach((paragraph, _offset, index) => {\n\t\tif (index > 0) currentText += \"\\n\"\n\n\t\tparagraph.forEach(node => {\n\t\t\tif (node.isText && node.text) {\n\t\t\t\tcurrentText += node.text\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (isLineBreakNode(node)) {\n\t\t\t\tcurrentText += \"\\n\"\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst segment = nodeToSegment(node)\n\t\t\tif (segment) {\n\t\t\t\tflushText()\n\t\t\t\tsegments.push(segment)\n\t\t\t}\n\t\t})\n\t})\n\n\tflushText()\n\treturn segments\n}\n\nconst agentTagNodeNameSet: ReadonlySet<string> = new Set(agentTagNodeNames)\nfunction isAgentTagNodeName(name: string): name is AgentTagNodeName {\n\treturn agentTagNodeNameSet.has(name)\n}\n\nfunction isAgentTagNode(node: ProseMirrorNode): node is ProseMirrorNode & { type: { name: AgentTagNodeName } } {\n\treturn isAgentTagNodeName(node.type.name)\n}\n\nfunction nodeToSegment(node: ProseMirrorNode): AgentInputSegment | null {\n\tif (node.type.name === \"fileAttachment\") {\n\t\tconst attrs = getFileAttachmentTagAttrs(node)\n\t\treturn attrs ? { type: \"fileAttachment\", fileName: attrs.fileName } : null\n\t}\n\tif (!isAgentTagNode(node)) return null\n\treturn nodeToTag(node)\n}\n\nfunction nodeToTag(node: ProseMirrorNode & { type: { name: AgentTagNodeName } }): AgentInputTag | null {\n\tswitch (node.type.name) {\n\t\tcase \"layer\": {\n\t\t\tconst { nodes } = getLayerTagAttrs(node)\n\t\t\treturn nodes.length > 0 ? { type: \"layer\", nodes } : null\n\t\t}\n\t\tcase \"cms\": {\n\t\t\tconst attrs = getCmsTagAttrs(node)\n\t\t\treturn cmsTagAttrsToSegment(attrs)\n\t\t}\n\t\tcase \"page\": {\n\t\t\tconst attrs = getPageTagAttrs(node)\n\t\t\treturn attrs ? { type: \"page\", pageId: attrs.pageId, path: attrs.path, name: attrs.name } : null\n\t\t}\n\t\tcase \"designPage\": {\n\t\t\tconst attrs = getDesignPageTagAttrs(node)\n\t\t\treturn attrs ? { type: \"designPage\", pageId: attrs.pageId, name: attrs.name } : null\n\t\t}\n\t\tcase \"component\": {\n\t\t\tconst attrs = getComponentTagAttrs(node)\n\t\t\treturn attrs ? { type: \"component\", componentId: attrs.componentId, name: attrs.name } : null\n\t\t}\n\t\tcase \"textStyle\": {\n\t\t\tconst attrs = getStyleTagAttrs(node)\n\t\t\treturn attrs ? { type: \"textStyle\", styleId: attrs.styleId, name: attrs.name } : null\n\t\t}\n\t\tcase \"linkStyle\": {\n\t\t\tconst attrs = getStyleTagAttrs(node)\n\t\t\treturn attrs ? { type: \"linkStyle\", styleId: attrs.styleId, name: attrs.name } : null\n\t\t}\n\t\tcase \"colorStyle\": {\n\t\t\tconst attrs = getColorStyleTagAttrs(node)\n\t\t\treturn attrs ? { type: \"colorStyle\", styleId: attrs.styleId, name: attrs.name, color: attrs.color } : null\n\t\t}\n\t\tcase \"layoutTemplate\": {\n\t\t\tconst attrs = getLayoutTemplateTagAttrs(node)\n\t\t\treturn attrs ? { type: \"layoutTemplate\", pageId: attrs.pageId, name: attrs.name } : null\n\t\t}\n\t\tcase \"skill\": {\n\t\t\tconst attrs = getSkillTagAttrs(node)\n\t\t\treturn attrs\n\t\t\t\t? { type: \"skill\", skillId: attrs.skillId, label: attrs.label, instruction: attrs.instruction }\n\t\t\t\t: null\n\t\t}\n\t\tdefault:\n\t\t\treturn assertNever(node.type.name)\n\t}\n}\n\n/**\n * Converts segments to plain text content for the LLM.\n * Preserve explicit prompt references exactly as the user wrote them.\n */\nexport function segmentsToTextContent(tree: CanvasTree, segments: readonly AgentInputSegment[]): string {\n\tlet result = \"\"\n\tfor (const segment of segments) {\n\t\tif (isString(segment)) {\n\t\t\tresult += segment\n\t\t} else if (segment.type !== \"fileAttachment\") {\n\t\t\t// File content is sent separately via AgentRequest.files \u2014 skip the inline pill\n\t\t\tconst block = tagToPromptContextBlock(tree, segment)\n\t\t\tif (block) result += serializeAgentPromptContextBlock(block)\n\t\t}\n\t}\n\treturn result\n}\n\nfunction tagToPromptContextBlock(tree: CanvasTree, tag: AgentInputTag): AgentPromptContextBlock | null {\n\tswitch (tag.type) {\n\t\tcase \"layer\": {\n\t\t\tconst validIds = getLayerTagReferenceIds(tag).filter(id => tree.has(id))\n\t\t\treturn validIds.length > 0 ? createSelectionReference(validIds) : null\n\t\t}\n\t\tcase \"page\":\n\t\t\treturn tree.has(tag.pageId) ? createPageReference(tag.pageId, tag.path, tag.name) : null\n\t\tcase \"designPage\":\n\t\t\treturn tree.has(tag.pageId) ? createDesignPageReference(tag.pageId, tag.name) : null\n\t\tcase \"component\":\n\t\t\treturn tree.has(tag.componentId) ? createComponentReference(tag.componentId, tag.name) : null\n\t\tcase \"textStyle\":\n\t\t\treturn tree.has(tag.styleId) ? createTextStyleReference(tag.styleId, tag.name) : null\n\t\tcase \"linkStyle\":\n\t\t\treturn tree.has(tag.styleId) ? createLinkStyleReference(tag.styleId, tag.name) : null\n\t\tcase \"colorStyle\":\n\t\t\treturn tree.has(tag.styleId) ? createColorStyleReference(tag.styleId, tag.name, tag.color) : null\n\t\tcase \"layoutTemplate\":\n\t\t\treturn tree.getNodeWithTrait(tag.pageId, isLayoutTemplateNode)\n\t\t\t\t? createLayoutTemplateReference(tag.pageId, tag.name)\n\t\t\t\t: null\n\t\tcase \"cmsCollection\":\n\t\t\treturn tree.getNodeWithTrait(tag.collectionId, isCollectionNode)\n\t\t\t\t? createCmsCollectionReference(tag.collectionId, tag.collectionName)\n\t\t\t\t: null\n\t\tcase \"cmsSelection\":\n\t\t\treturn tree.getNodeWithTrait(tag.collectionId, isCollectionNode)\n\t\t\t\t? createCmsSelectionReference(\n\t\t\t\t\t\ttag.collectionId,\n\t\t\t\t\t\ttag.collectionName,\n\t\t\t\t\t\ttag.collectionItemIds,\n\t\t\t\t\t\ttag.variableColumnIds,\n\t\t\t\t\t\ttag.metadataColumnIds,\n\t\t\t\t\t)\n\t\t\t\t: null\n\t\tcase \"skill\": {\n\t\t\tconst directive = getAgentSkillDirective(tag.skillId)\n\t\t\treturn directive ? createDirectiveBlock(directive.id, directive.instruction) : null\n\t\t}\n\t\tdefault:\n\t\t\treturn assertNever(tag)\n\t}\n}\n\n/**\n * Extract the explicit canvas-backed node-id views we need from a single pass over the input\n * segments.\n */\nexport function extractSelectionNodeIds(segments: readonly AgentInputSegment[]): NodeID[] {\n\tconst result: Set<NodeID> = new Set()\n\tfor (const segment of segments) {\n\t\tif (isString(segment)) continue\n\t\tswitch (segment.type) {\n\t\t\tcase \"layer\":\n\t\t\t\tfor (const id of getLayerTagReferenceIds(segment)) {\n\t\t\t\t\tresult.add(id)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase \"page\": {\n\t\t\t\tresult.add(segment.pageId)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"designPage\": {\n\t\t\t\tresult.add(segment.pageId)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"component\": {\n\t\t\t\tresult.add(segment.componentId)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"textStyle\":\n\t\t\tcase \"linkStyle\":\n\t\t\tcase \"colorStyle\": {\n\t\t\t\tresult.add(segment.styleId)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"layoutTemplate\": {\n\t\t\t\tresult.add(segment.pageId)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Array.from(result)\n}\n\n/**\n * Extracts CMS tag segments from the input.\n */\nexport function extractCmsTagSegments(segments: readonly AgentInputSegment[]): readonly CmsTagSegment[] {\n\treturn segments.flatMap(segment => (isCmsTagSegment(segment) ? [segment] : []))\n}\n\n/**\n * Checks if a ProseMirror document is empty (for placeholder display).\n */\nexport function isAgentInputEmpty(doc: ProseMirrorNode): boolean {\n\treturn doc.childCount === 1 && Boolean(doc.firstChild?.isTextblock) && doc.firstChild?.content.size === 0\n}\n\n/**\n * Checks if a ProseMirror document has meaningful editor content (text, tags, or file attachments).\n */\nexport function hasEditorContent(doc: ProseMirrorNode | undefined): boolean {\n\tif (!doc) return false\n\treturn serializeToSegments(doc).some(segment => !isString(segment) || segment.trim().length > 0)\n}\n\n/**\n * Checks if agent input has valid content for submission (text, tags, or images).\n */\nexport function isValidAgentInput(doc: ProseMirrorNode, hasImages: boolean, isUploadingImages: boolean): boolean {\n\treturn !isUploadingImages && (hasEditorContent(doc) || hasImages)\n}\n", "import { assert, assertNever, emptyArray, isEmptyObject, isModuleExportIdentifier } from \"@framerjs/shared\"\nimport { getNameOfReferencedCollection } from \"app/ai/agents/tools/collectionSchema.ts\"\nimport { difference } from \"code-generation/jsx/difference.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport type { MaybeCanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport {\n\tisCodeComponentNode,\n\tisCollectionNode,\n\tisColorStyleTokenNode,\n\tisComponentPresetNode,\n\tisRichTextNode,\n\tisRootNode,\n\tisShaderNode,\n\tisTextStylePresetNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { hasItemsOrderOverride } from \"document/models/CanvasTree/traits/WithItemsOrder.ts\"\nimport { isRichTextTag } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport {\n\tisDateVariableDefinition,\n\tisRichTextVariableDefinition,\n\tisVariableDefinition,\n\ttype VariableDefinition,\n\ttype WithVariables,\n\twithVariables,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { isImageControlProp } from \"document/models/controlProps/ControlProp.ts\"\nimport { isRichTextTableCellType } from \"document/models/richText/RichTextDocument.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { entries } from \"utils/entries.ts\"\nimport { isArray, isObject, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { flatten } from \"../utils/flatten.ts\"\nimport { AgentContext } from \"./context/AgentContext.ts\"\nimport { getSpecialCaseDSLNodeClass } from \"./context/dslNodeClass.ts\"\nimport {\n\tisSerializedVirtualText,\n\tserializeVirtualText as serializeBlocks,\n\ttype SerializedVirtualTextNode,\n\ttype SerializedVirtualTextRootNode,\n\ttype TextBlockNode,\n} from \"./context/richtext/serialize.ts\"\nimport { createRichTextTarget, resolveRichTextTargetHandleFromNode } from \"./context/richtext/targets.ts\"\nimport { getSerializedIconVariableAttributes } from \"./context/serializeVariable.ts\"\nimport {\n\ttype AddCommandAttributes,\n\tCollectionReferenceVariableAliasNodeClass,\n\ttype Command,\n\tCOMMAND_SEPARATOR,\n\tCommandType,\n\tComponentInstanceNodeClass,\n\tDateVariableAliasNodeClass,\n\tEventHandlerVariableAliasNodeClass,\n\tFileVariableAliasNodeClass,\n\tFixedOverlayNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tIconNodeClass,\n\tIconVariableAliasNodeClass,\n\tIconVariableType,\n\ttype InsertableVirtualNodeClass,\n\tisInsertableVirtualNodeClass,\n\tisSupportedDSLNodeClass,\n\tLinkVariableAliasNodeClass,\n\tOptionVariableAliasNodeClass,\n\tRelativeOverlayNodeClass,\n\trootNodeId,\n\tserializeVariableType,\n\ttype SupportedDSLNodeClass,\n\tTextBlockquoteClass,\n\tTextComponentInstanceClass,\n\tTextTableCellClass,\n\tTextTableClass,\n\tTextTableRowClass,\n\tVariableNodeClass,\n} from \"./dsl.ts\"\nimport { toAttributes } from \"./traits/attributes.ts\"\nimport { assetReferenceToURL } from \"./traits/helpers.ts\"\n\nfunction escapeAttributeValue(value: string) {\n\treturn value\n\t\t.replace(/\\\\/gu, \"\\\\\\\\\")\n\t\t.replace(/\"/gu, '\\\\\"')\n\t\t.replace(/\\n/gu, \"\\\\n\")\n\t\t.replace(/\\r/gu, \"\\\\r\")\n\t\t.replace(/\\t/gu, \"\\\\t\")\n}\n\nfunction formatAttributes(attributes: Record<string, unknown>) {\n\tconst items: string[] = []\n\tfor (const key in attributes) {\n\t\tconst value = attributes[key]\n\t\tif (isUndefined(value)) continue\n\t\tif (isArray(value) || isObject(value)) {\n\t\t\tconst flattenedArrayOrObject = flatten(value, key)\n\t\t\tfor (const [flattenedKey, flattenedValue] of entries(flattenedArrayOrObject)) {\n\t\t\t\tif (isUndefined(flattenedValue)) continue\n\n\t\t\t\titems.push(`${flattenedKey}=\"${escapeAttributeValue(flattenedValue)}\"`)\n\t\t\t}\n\t\t} else {\n\t\t\titems.push(`${key}=\"${escapeAttributeValue(String(value))}\"`)\n\t\t}\n\t}\n\n\treturn items.length === 0 ? \"\" : \" \" + items.join(\" \")\n}\n\nexport function commandToDSL(command: Command, separator: string = COMMAND_SEPARATOR) {\n\tswitch (command.type) {\n\t\tcase CommandType.Add: {\n\t\t\tconst { node, id, ...rest } = command.attributes\n\t\t\treturn `${CommandType.Add}${node} ${id}${formatAttributes(rest)}${separator}`\n\t\t}\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Duplicate:\n\t\tcase CommandType.CreateVariant:\n\t\tcase CommandType.Move: {\n\t\t\tconst { id, ...rest } = command.attributes\n\t\t\treturn `${command.type} ${id}${formatAttributes(rest)}${separator}`\n\t\t}\n\t\tcase CommandType.Remove: {\n\t\t\tconst { id } = command.attributes\n\t\t\treturn `${CommandType.Remove} ${id}${separator}`\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(command)\n\t}\n}\n\ntype SerializedRichTextChildNode = TextBlockNode[\"children\"][number]\n\nfunction emitRichTextDSLCommands<T>(\n\tnodes: readonly T[],\n\tgetCommands: (node: T, index: number) => readonly string[],\n): string[] {\n\tconst commands: string[] = []\n\n\tfor (const [index, node] of nodes.entries()) {\n\t\tcommands.push(...getCommands(node, index))\n\t}\n\n\treturn commands\n}\n\nfunction extractRichTextControlBlocks(\n\tattributes: Record<string, unknown>,\n): Map<string, SerializedVirtualTextRootNode[]> {\n\tconst richTextControlBlocks = new Map<string, SerializedVirtualTextRootNode[]>()\n\tfor (const [key, value] of Object.entries(attributes)) {\n\t\tif (!isSerializedVirtualText(value)) continue\n\t\trichTextControlBlocks.set(key, value)\n\t\tdelete attributes[key]\n\t}\n\treturn richTextControlBlocks\n}\n\nfunction getRichTextControlDSLCommands(\n\tnodeId: string,\n\trichTextControlBlocks: Map<string, SerializedVirtualTextRootNode[]>,\n\toptions: SerializeOptions,\n): string[] {\n\tconst richTextCommands: string[] = []\n\tfor (const [controlTitleKey, blocks] of richTextControlBlocks) {\n\t\trichTextCommands.push(\n\t\t\t...emitRichTextDSLCommands(blocks, (block, blockIndex) =>\n\t\t\t\tgetRichTextDSLCommand(block, createRichTextTarget(nodeId, controlTitleKey), blockIndex, options),\n\t\t\t),\n\t\t)\n\t}\n\treturn richTextCommands\n}\n\nfunction getRichTextChildDSLCommand(\n\tchild: SerializedRichTextChildNode,\n\tparent: string,\n\tblockIndex: number,\n\tchildIndex: number,\n\toptions: SerializeOptions,\n): readonly string[] {\n\tswitch (child.type) {\n\t\tcase \"TextLineBreak\":\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextLineBreak\",\n\t\t\t\t\t\t\tid: `break-${blockIndex}-${childIndex}`,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\tcase \"TextRun\": {\n\t\t\tconst runId = `run-${blockIndex}-${childIndex}`\n\t\t\tconst runAttributes = flatten(child.attributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextRun\",\n\t\t\t\t\t\t\tid: runId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(runAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL({ type: CommandType.Update, attributes: { id: runId, ...runAttributes } }, options.separator),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn commands\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(child)\n\t}\n}\n\nfunction getRecursiveRichTextId(\n\tnode: SerializedVirtualTextNode | SerializedRichTextChildNode,\n\tpath: readonly number[],\n): string {\n\tconst suffix = path.join(\"-\")\n\treturn `${node.type.toLocaleLowerCase()}-${suffix}`\n}\n\nfunction getTextComponentInstanceDSLCommand(\n\tnode: Extract<SerializedVirtualTextNode, { type: typeof TextComponentInstanceClass }>,\n\tparent: string,\n\tnodeId: string,\n\toptions: SerializeOptions,\n): readonly string[] {\n\tconst { component, ...restAttributes } = node.attributes ?? {}\n\tconst richTextControlBlocks = extractRichTextControlBlocks(restAttributes)\n\tconst commands = [\n\t\tcommandToDSL(\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextComponentInstanceClass,\n\t\t\t\t\tid: nodeId,\n\t\t\t\t\tparent,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tcomponent: isString(component) ? component : undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\toptions.separator,\n\t\t),\n\t]\n\n\tconst flattenedAttributes = flatten(restAttributes)\n\tif (!isEmptyObject(flattenedAttributes)) {\n\t\tcommands.push(\n\t\t\tcommandToDSL({ type: CommandType.Update, attributes: { id: nodeId, ...flattenedAttributes } }, options.separator),\n\t\t)\n\t}\n\n\tcommands.push(...getRichTextControlDSLCommands(nodeId, richTextControlBlocks, options))\n\n\treturn commands\n}\n\nfunction getRecursiveRichTextChildDSLCommand(\n\tchild: SerializedRichTextChildNode,\n\tparent: string,\n\tpath: readonly number[],\n\toptions: SerializeOptions,\n): readonly string[] {\n\tswitch (child.type) {\n\t\tcase \"TextLineBreak\":\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextLineBreak\",\n\t\t\t\t\t\t\tid: getRecursiveRichTextId(child, path),\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\tcase \"TextRun\": {\n\t\t\tconst runId = getRecursiveRichTextId(child, path)\n\t\t\tconst runAttributes = flatten(child.attributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextRun\",\n\t\t\t\t\t\t\tid: runId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(runAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL({ type: CommandType.Update, attributes: { id: runId, ...runAttributes } }, options.separator),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn commands\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(child)\n\t}\n}\n\nfunction getRecursiveRichTextDSLCommand(\n\tnode: SerializedVirtualTextNode,\n\tparent: string,\n\tpath: readonly number[],\n\toptions: SerializeOptions,\n): readonly string[] {\n\tswitch (node.type) {\n\t\tcase \"TextUnsupportedBlock\":\n\t\t\treturn emptyArray()\n\n\t\tcase TextBlockquoteClass:\n\t\tcase \"TextBulletList\":\n\t\tcase \"TextListItem\":\n\t\tcase \"TextNumberedList\":\n\t\tcase TextTableClass:\n\t\tcase TextTableRowClass: {\n\t\t\tconst nodeId = getRecursiveRichTextId(node, path)\n\t\t\tconst nodeAttributes = flatten(node.attributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.type,\n\t\t\t\t\t\t\tid: nodeId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(nodeAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL({ type: CommandType.Update, attributes: { id: nodeId, ...nodeAttributes } }, options.separator),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst children: readonly SerializedVirtualTextNode[] = node.children\n\t\t\tcommands.push(\n\t\t\t\t...emitRichTextDSLCommands(children, (child, childIndex) =>\n\t\t\t\t\tgetRecursiveRichTextDSLCommand(child, nodeId, [...path, childIndex], options),\n\t\t\t\t),\n\t\t\t)\n\n\t\t\treturn commands\n\t\t}\n\n\t\tcase TextTableCellClass: {\n\t\t\tconst nodeId = getRecursiveRichTextId(node, path)\n\t\t\tconst { cellType, ...restCellAttributes } = node.attributes ?? {}\n\t\t\tconst nodeAttributes = flatten(restCellAttributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.type,\n\t\t\t\t\t\t\tid: nodeId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tcellType: isRichTextTableCellType(cellType) ? cellType : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(nodeAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL({ type: CommandType.Update, attributes: { id: nodeId, ...nodeAttributes } }, options.separator),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst children: readonly SerializedVirtualTextNode[] = node.children\n\t\t\tcommands.push(\n\t\t\t\t...emitRichTextDSLCommands(children, (child, childIndex) =>\n\t\t\t\t\tgetRecursiveRichTextDSLCommand(child, nodeId, [...path, childIndex], options),\n\t\t\t\t),\n\t\t\t)\n\n\t\t\treturn commands\n\t\t}\n\n\t\tcase TextComponentInstanceClass:\n\t\t\treturn getTextComponentInstanceDSLCommand(node, parent, getRecursiveRichTextId(node, path), options)\n\n\t\tcase \"TextMediaBlock\": {\n\t\t\tconst blockId = getRecursiveRichTextId(node, path)\n\t\t\tconst blockAttributes = flatten(node.attributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextMediaBlock\",\n\t\t\t\t\t\t\tid: blockId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(blockAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{ type: CommandType.Update, attributes: { id: blockId, ...blockAttributes } },\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn commands\n\t\t}\n\n\t\tcase \"TextBlock\": {\n\t\t\tconst { tag, ...restBlockAttrs } = node.attributes ?? {}\n\t\t\tconst blockId = getRecursiveRichTextId(node, path)\n\t\t\tconst blockAttributes = flatten(restBlockAttrs)\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextBlock\",\n\t\t\t\t\t\t\tid: blockId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\ttag: isRichTextTag(tag) ? tag : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(blockAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{ type: CommandType.Update, attributes: { id: blockId, ...blockAttributes } },\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tcommands.push(\n\t\t\t\t...emitRichTextDSLCommands(node.children, (child, childIndex) =>\n\t\t\t\t\tgetRecursiveRichTextChildDSLCommand(child, blockId, [...path, childIndex], options),\n\t\t\t\t),\n\t\t\t)\n\n\t\t\treturn commands\n\t\t}\n\n\t\tdefault:\n\t\t\tassertNever(node)\n\t}\n}\n\nfunction getRichTextDSLCommand(\n\tblock: SerializedVirtualTextRootNode,\n\tparent: string,\n\tblockIndex: number,\n\toptions: SerializeOptions,\n): readonly string[] {\n\tswitch (block.type) {\n\t\tcase \"TextUnsupportedBlock\":\n\t\t\treturn emptyArray()\n\t\tcase TextBlockquoteClass:\n\t\tcase \"TextBulletList\":\n\t\tcase \"TextNumberedList\":\n\t\tcase TextTableClass:\n\t\t\treturn getRecursiveRichTextDSLCommand(block, parent, [blockIndex], options)\n\t\tcase TextComponentInstanceClass:\n\t\t\treturn getTextComponentInstanceDSLCommand(block, parent, `textcomponentinstance-${blockIndex}`, options)\n\t\tcase \"TextMediaBlock\": {\n\t\t\tconst blockId = `textmediablock-${blockIndex}`\n\t\t\tconst blockAttributes = flatten(block.attributes ?? {})\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextMediaBlock\",\n\t\t\t\t\t\t\tid: blockId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(blockAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{ type: CommandType.Update, attributes: { id: blockId, ...blockAttributes } },\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn commands\n\t\t}\n\t\tcase \"TextBlock\": {\n\t\t\tconst { tag, ...restBlockAttrs } = block.attributes ?? {}\n\t\t\tconst blockId = `textblock-${blockIndex}`\n\t\t\tconst childBlockIndex = blockIndex + 1\n\t\t\tconst blockAttributes = flatten(restBlockAttrs)\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: \"TextBlock\",\n\t\t\t\t\t\t\tid: blockId,\n\t\t\t\t\t\t\tparent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\ttag: isRichTextTag(tag) ? tag : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(blockAttributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{ type: CommandType.Update, attributes: { id: blockId, ...blockAttributes } },\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tcommands.push(\n\t\t\t\t...emitRichTextDSLCommands(block.children, (child, childIndex) =>\n\t\t\t\t\tgetRichTextChildDSLCommand(child, blockId, childBlockIndex, childIndex, options),\n\t\t\t\t),\n\t\t\t)\n\n\t\t\treturn commands\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(block)\n\t}\n}\n\ntype InsertableNodeClass = Exclude<\n\tSupportedDSLNodeClass,\n\ttypeof ClassDiscriminator.RootNode | InsertableVirtualNodeClass\n>\n\nfunction getNodeClass(node: CanvasNode, ctx?: AgentContext, parent?: MaybeCanvasNode): InsertableNodeClass {\n\tconst specialCaseClass = getSpecialCaseDSLNodeClass(node, ctx, parent)\n\tif (specialCaseClass) return specialCaseClass\n\n\tassert(isInsertableNodeClass(node.__class), `Cannot serialize ${node.__class} as an ADD node`)\n\treturn node.__class\n}\n\nfunction isInsertableNodeClass(nodeClass: string): nodeClass is InsertableNodeClass {\n\treturn (\n\t\tisSupportedDSLNodeClass(nodeClass) &&\n\t\tnodeClass !== ClassDiscriminator.RootNode &&\n\t\t!isInsertableVirtualNodeClass(nodeClass)\n\t)\n}\n\nfunction isOverlayLikeNode(node: CanvasNode, ctx?: AgentContext, parent?: MaybeCanvasNode): boolean {\n\tconst nodeClass = getSpecialCaseDSLNodeClass(node, ctx, parent)\n\treturn nodeClass === FixedOverlayNodeClass || nodeClass === RelativeOverlayNodeClass\n}\n\nfunction createAddCommandAttributes(\n\tnode: CanvasNode,\n\tnodeClass: InsertableNodeClass,\n\tname: string | undefined,\n): AddCommandAttributes {\n\tif (nodeClass === FixedOverlayNodeClass || nodeClass === RelativeOverlayNodeClass) {\n\t\tassert(isString(node.parentid), \"Overlay nodes must have a parent\")\n\t\treturn {\n\t\t\tnode: nodeClass,\n\t\t\tid: node.id,\n\t\t\tparent: node.parentid,\n\t\t\tposition: undefined,\n\t\t\tname,\n\t\t}\n\t}\n\n\treturn {\n\t\tnode: nodeClass,\n\t\tid: node.id,\n\t\tparent: node.parentid ?? undefined,\n\t\tposition: undefined,\n\t\tname,\n\t}\n}\n\nfunction getSerializedInitialValue(variable: VariableDefinition, ctx: AgentContext): unknown {\n\tif (variable.type === ControlType.MultiCollectionReference && isArray(variable.initialValue)) {\n\t\treturn JSON.stringify(variable.initialValue)\n\t}\n\n\tif (variable.type !== ControlType.Image) return variable.initialValue\n\tconst { initialValue } = variable\n\tconst assetReference = !isString(initialValue) && isImageControlProp(initialValue) ? initialValue.value : initialValue\n\tif (!isString(assetReference)) return assetReference\n\treturn assetReferenceToURL(assetReference)\n}\n\nasync function getSerializedVariableAttributes(\n\tvariable: VariableDefinition,\n\tctx: AgentContext,\n): Promise<\n\t| { initialValue?: string; set: string; type: typeof IconVariableType }\n\t| { initialValue?: unknown; type: ControlType.Image }\n\t| { cases: string[]; initialValue?: string; type: ControlType.Enum }\n\t| { allowedFileTypes: string[]; type: ControlType.File }\n\t| {\n\t\t\tinitialValue: unknown\n\t\t\ttype:\n\t\t\t\t| ControlType.Boolean\n\t\t\t\t| ControlType.Number\n\t\t\t\t| ControlType.String\n\t\t\t\t| ControlType.RichText\n\t\t\t\t| ControlType.Color\n\t\t\t\t| ControlType.EventHandler\n\t\t\t\t| ControlType.Date\n\t  }\n\t| undefined\n> {\n\tconst type = serializeVariableType(variable.type)\n\tif (!type) return undefined\n\n\tif (type === IconVariableType) {\n\t\tassert(variable.type === ControlType.VectorSetItem, `Expected icon variable type for \"${variable.name}\".`)\n\t\tconst iconAttributes = await getSerializedIconVariableAttributes(variable, ctx)\n\t\treturn {\n\t\t\ttype,\n\t\t\tset: iconAttributes.set,\n\t\t\tinitialValue: iconAttributes.initialValue,\n\t\t}\n\t}\n\n\tif (\n\t\ttype === ControlType.CollectionReference ||\n\t\ttype === ControlType.MultiCollectionReference ||\n\t\ttype === ControlType.Array ||\n\t\ttype === ControlType.Link\n\t) {\n\t\treturn undefined\n\t}\n\n\tif (type === ControlType.Enum) {\n\t\tassert(variable.type === ControlType.Enum, `Expected option variable type for \"${variable.name}\".`)\n\t\treturn {\n\t\t\ttype,\n\t\t\tcases: variable.cases.map(enumCase => enumCase.name),\n\t\t\tinitialValue: variable.cases.find(enumCase => enumCase.id === variable.initialValue)?.name,\n\t\t}\n\t}\n\n\tif (type === ControlType.File) {\n\t\tassert(variable.type === ControlType.File, `Expected file variable type for \"${variable.name}\".`)\n\t\treturn {\n\t\t\ttype,\n\t\t\tallowedFileTypes: variable.allowedFileTypes.map(fileType => fileType.extension),\n\t\t}\n\t}\n\n\tconst initialValue = isRichTextVariableDefinition(variable) ? undefined : getSerializedInitialValue(variable, ctx)\n\n\treturn {\n\t\ttype,\n\t\tinitialValue,\n\t}\n}\n\nasync function createVariableAddCommand(\n\tvariable: VariableDefinition,\n\tscopeId: string,\n\tctx: AgentContext,\n): Promise<Command | undefined> {\n\tswitch (variable.type) {\n\t\tcase ControlType.CollectionReference:\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tconst collection = getNameOfReferencedCollection(ctx.treeStore.tree, variable)\n\t\t\tassert(isString(collection), \"Referenced collection must have a name\")\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: CollectionReferenceVariableAliasNodeClass,\n\t\t\t\t\ttype: variable.type === ControlType.CollectionReference ? \"single\" : \"multi\",\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tinitialValue: isRichTextVariableDefinition(variable) ? \"\" : getSerializedInitialValue(variable, ctx),\n\t\t\t\t\tcollection,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase ControlType.VectorSetItem: {\n\t\t\tconst serializedAttributes = await getSerializedVariableAttributes(variable, ctx)\n\t\t\tif (!serializedAttributes) return undefined\n\t\t\tassert(serializedAttributes.type === IconVariableType, `Expected icon variable type for \"${variable.name}\".`)\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: IconVariableAliasNodeClass,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tinitialValue: serializedAttributes.initialValue,\n\t\t\t\t\tset: serializedAttributes.set,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase ControlType.Date: {\n\t\t\tassert(isDateVariableDefinition(variable), `Expected date variable definition for \"${variable.name}\".`)\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: DateVariableAliasNodeClass,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tinitialValue: variable.initialValue,\n\t\t\t\t\tdisplayTime: variable.options?.displayTime === true ? \"true\" : \"false\",\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase ControlType.EventHandler:\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: EventHandlerVariableAliasNodeClass,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\tcase ControlType.Link:\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: LinkVariableAliasNodeClass,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\tcase ControlType.Array:\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: GalleryVariableAliasNodeClass,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tinitialValue: [],\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tminCount: variable.minCount,\n\t\t\t\t\tmaxCount: variable.maxCount,\n\t\t\t\t},\n\t\t\t}\n\t\tdefault: {\n\t\t\tconst serializedAttributes = await getSerializedVariableAttributes(variable, ctx)\n\t\t\tif (!serializedAttributes) return undefined\n\t\t\tassert(serializedAttributes.type !== IconVariableType, `Unexpected icon variable type for \"${variable.name}\".`)\n\n\t\t\tif (serializedAttributes.type === ControlType.Image) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: variable.id,\n\t\t\t\t\t\tnode: VariableNodeClass,\n\t\t\t\t\t\ttype: serializedAttributes.type,\n\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\tscope: scopeId,\n\t\t\t\t\t\tinitialValue: serializedAttributes.initialValue,\n\t\t\t\t\t\tparent: undefined,\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (serializedAttributes.type === ControlType.Enum) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: variable.id,\n\t\t\t\t\t\tnode: OptionVariableAliasNodeClass,\n\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\tscope: scopeId,\n\t\t\t\t\t\tinitialValue: serializedAttributes.initialValue,\n\t\t\t\t\t\tcases: serializedAttributes.cases,\n\t\t\t\t\t\tparent: undefined,\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (serializedAttributes.type === ControlType.File) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: variable.id,\n\t\t\t\t\t\tnode: FileVariableAliasNodeClass,\n\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\tscope: scopeId,\n\t\t\t\t\t\tallowedFileTypes: serializedAttributes.allowedFileTypes,\n\t\t\t\t\t\tparent: undefined,\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst displayTextArea =\n\t\t\t\tvariable.type === ControlType.String && variable.options?.displayTextArea === true ? true : undefined\n\t\t\treturn {\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: variable.id,\n\t\t\t\t\tnode: VariableNodeClass,\n\t\t\t\t\ttype: serializedAttributes.type,\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tscope: scopeId,\n\t\t\t\t\tinitialValue: serializedAttributes.initialValue,\n\t\t\t\t\tdisplayTextArea,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction supportsRichTextVariableInitialValue(node: CanvasNode & WithVariables) {\n\tif (isCollectionNode(node)) return false\n\n\treturn true\n}\n\nasync function createVariableCommands(\n\tnode: CanvasNode & WithVariables,\n\tseparator: string,\n\tctx: AgentContext,\n\toptions: SerializeOptions,\n): Promise<readonly string[]> {\n\tconst commands: string[] = []\n\tfor (const variable of node.variables) {\n\t\tif (!isVariableDefinition(variable)) continue\n\n\t\tconst command = await createVariableAddCommand(variable, node.id, ctx)\n\t\tif (command) commands.push(commandToDSL(command, separator))\n\t\tconst isRichText = isRichTextVariableDefinition(variable)\n\n\t\tif (isRichText && supportsRichTextVariableInitialValue(node)) {\n\t\t\tconst handle = resolveRichTextTargetHandleFromNode(node, createRichTextTarget(node.id, variable.id), ctx)\n\t\t\tif (!handle) continue\n\n\t\t\tconst document = ctx.virtualText.hydrate(handle)\n\t\t\tif (!document) continue\n\n\t\t\tconst serialized = await serializeBlocks(document.children, ctx, undefined)\n\t\t\tcommands.push(\n\t\t\t\t...emitRichTextDSLCommands(serialized, (block, blockIndex) =>\n\t\t\t\t\tgetRichTextDSLCommand(block, handle.target, blockIndex, options),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\treturn commands\n}\n\nfunction getCommonSiblingIds(siblings: CanvasNode[], tree: CanvasTree): NodeID[] {\n\tconst commonIds: NodeID[] = []\n\tfor (const sibling of siblings) {\n\t\tif (!tree.has(sibling.id)) continue\n\t\tcommonIds.push(sibling.id)\n\t}\n\treturn commonIds\n}\n\nasync function createAddAndInitialUpdateCommands(\n\tnode: CanvasNode,\n\ttoTree: CanvasTree,\n\tctx: AgentContext,\n): Promise<readonly string[]> {\n\tconst toPosition = toTree.getIndex(node)\n\tconst parent = toTree.getParent(node.id)\n\tconst { name, $control__icon, ...attributes } = flatten(await toAttributes(node, parent, ctx))\n\n\tconst toCtx = AgentContext.override(ctx, { tree: toTree })\n\tconst nodeClass = getNodeClass(node, toCtx, parent)\n\n\tlet addAttributes: AddCommandAttributes | undefined\n\tswitch (nodeClass) {\n\t\tcase IconNodeClass:\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\tset:\n\t\t\t\t\tisCodeComponentNode(node) && isModuleExportIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t? ctx.vectorSets.forInstanceIdentifier(node.codeComponentIdentifier)?.name\n\t\t\t\t\t\t: undefined,\n\t\t\t\t$control__icon,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t\tcase ComponentInstanceNodeClass:\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\tcomponent:\n\t\t\t\t\tisCodeComponentNode(node) && isModuleExportIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t? ctx.components.getIdForModuleIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t\tcase ClassDiscriminator.ShaderNode:\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\tshader: isShaderNode(node) ? ctx.shaders.getNameForIdentifier(node.shaderModuleIdentifier) : undefined,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t\tcase ClassDiscriminator.TextStylePresetNode:\n\t\t\tassert(isTextStylePresetNode(node), \"Node is not a text style preset node\")\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\ttag: node.tag,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t\tcase ClassDiscriminator.ComponentPresetNode: {\n\t\t\tassert(isComponentPresetNode(node), \"Node is not a component preset node\")\n\t\t\tconst component = ctx.components.getIdForModuleIdentifier(node.componentIdentifier)\n\t\t\tif (!component) return emptyArray()\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\tcomponent,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\taddAttributes = {\n\t\t\t\tnode: nodeClass,\n\t\t\t\tid: node.id,\n\t\t\t\tparent: node.parentid ?? \"root\",\n\t\t\t\tposition: toPosition,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tbreak\n\t}\n\n\tassert(addAttributes, \"Add attributes are required\")\n\n\treturn [\n\t\tcommandToDSL({\n\t\t\ttype: CommandType.Add,\n\t\t\tattributes: addAttributes,\n\t\t}),\n\t\tcommandToDSL({\n\t\t\ttype: CommandType.Update,\n\t\t\tattributes: {\n\t\t\t\tid: node.id,\n\t\t\t\t$control__icon: nodeClass === \"ComponentInstanceNode\" ? $control__icon : undefined,\n\t\t\t\t...attributes,\n\t\t\t},\n\t\t}),\n\t]\n}\n\nasync function serializeAddedSubtree(\n\tnode: CanvasNode,\n\ttoTree: CanvasTree,\n\tctx: AgentContext,\n\tprocessedIds: Set<string>,\n): Promise<readonly string[]> {\n\tconst commands: string[] = []\n\n\tfor (const addedNode of node.walk()) {\n\t\tprocessedIds.add(addedNode.id)\n\t\tcommands.push(...(await createAddAndInitialUpdateCommands(addedNode, toTree, ctx)))\n\t}\n\n\treturn commands\n}\n\nexport async function transformNodesToCommands(from: CanvasNode, to: CanvasNode, ctx: AgentContext): Promise<string[]> {\n\tconst commands: string[] = []\n\n\tconst fromTree = CanvasTree.createByCloningRoot(from)\n\tconst toTree = CanvasTree.createByCloningRoot(to)\n\n\tconst processedIds = new Set<string>()\n\tassert(fromTree.root || toTree.root, \"One tree must have a root node.\")\n\n\t// Walk the to tree, and compare it to the from tree.\n\tfor (const node of toTree.root.walk()) {\n\t\tif (processedIds.has(node.id)) continue\n\n\t\tconst fromNode = fromTree.get(node.id)\n\n\t\t// Add & Update the node.\n\t\tif (!fromNode) {\n\t\t\tcommands.push(...(await serializeAddedSubtree(node, toTree, ctx, processedIds)))\n\t\t\tcontinue\n\t\t}\n\n\t\tprocessedIds.add(node.id)\n\t\tconst toPosition = toTree.getIndex(node)\n\t\tconst parent = toTree.getParent(node.id)\n\n\t\t// Move the node.\n\t\tconst fromPosition = fromTree.getIndex(fromNode)\n\t\tconst parentChanged = fromNode.parentid !== node.parentid\n\t\tconst indexChanged = fromPosition !== toPosition\n\n\t\tif (parentChanged) {\n\t\t\t// If parent changed, definitely need a MOVE\n\t\t\tcommands.push(\n\t\t\t\tcommandToDSL({\n\t\t\t\t\ttype: CommandType.Move,\n\t\t\t\t\tattributes: { id: node.id, parent: node.parentid ?? \"root\", position: toPosition },\n\t\t\t\t}),\n\t\t\t)\n\t\t} else if (indexChanged) {\n\t\t\t// Parent is the same, but index changed. Use minimal moves algorithm: Find the longest\n\t\t\t// subsequence that's already in the correct order, and only move nodes that are not\n\t\t\t// part of this subsequence.\n\t\t\tconst fromSiblings = fromTree.getSiblingsIncludingSelf(fromNode)\n\t\t\tconst toSiblings = toTree.getSiblingsIncludingSelf(node)\n\n\t\t\t// Get the ordered list of common sibling IDs (nodes present in both trees)\n\t\t\tconst fromCommonSiblings = getCommonSiblingIds(fromSiblings, toTree)\n\t\t\tconst toCommonSiblings = getCommonSiblingIds(toSiblings, fromTree)\n\n\t\t\t// Find the longest subsequence of fromCommonSiblings that appears in the same order in\n\t\t\t// toCommonSiblings. Nodes not in this subsequence need to be moved. We use a simple\n\t\t\t// greedy algorithm: for each node in toCommonSiblings, mark it as \"stable\" if it\n\t\t\t// appears after all previously marked stable nodes in fromCommonSiblings.\n\t\t\tconst stableNodes = new Set<string>()\n\t\t\tlet lastFromIndex = -1\n\t\t\tfor (const nodeId of toCommonSiblings) {\n\t\t\t\tconst fromIndex = fromCommonSiblings.indexOf(nodeId)\n\t\t\t\tif (fromIndex > lastFromIndex) {\n\t\t\t\t\tstableNodes.add(nodeId)\n\t\t\t\t\tlastFromIndex = fromIndex\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this node is not in the stable set, it needs to be moved\n\t\t\tif (!stableNodes.has(node.id)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL({\n\t\t\t\t\t\ttype: CommandType.Move,\n\t\t\t\t\t\tattributes: { id: node.id, parent: node.parentid ?? \"root\", position: toPosition },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst toCtx = AgentContext.override(ctx, { tree: toTree })\n\t\tconst newOverlayChildren =\n\t\t\tgetChildrenForSerialization(node)?.filter(\n\t\t\t\tchild => isOverlayLikeNode(child, toCtx, node) && !fromTree.has(child.id),\n\t\t\t) ?? []\n\t\tfor (const overlayChild of newOverlayChildren) {\n\t\t\tcommands.push(...(await serializeAddedSubtree(overlayChild, toTree, ctx, processedIds)))\n\t\t}\n\n\t\t// Update the node.\n\t\tconst fromA = flatten(await toAttributes(fromNode, fromTree.getParent(fromNode.id), ctx))\n\t\tconst toA = flatten(await toAttributes(node, parent, ctx))\n\t\tconst diff = difference(toA, fromA)\n\t\tif (!diff || isEmptyObject(diff)) continue\n\n\t\tcommands.push(commandToDSL({ type: CommandType.Update, attributes: { id: node.id, ...diff } }))\n\t}\n\n\t// Walk the from tree, any nodes we haven't encountered in the to tree, have been removed.\n\tfor (const node of fromTree.root.walk()) {\n\t\tif (processedIds.has(node.id)) continue\n\t\tcommands.push(commandToDSL({ type: CommandType.Remove, attributes: { id: node.id } }))\n\t}\n\n\treturn commands\n}\n\ninterface SerializeOptions {\n\tseparator: string\n}\n\nfunction getChildrenForSerialization(node: CanvasNode): readonly CanvasNode[] | undefined {\n\tif (!node.children) return undefined\n\treturn hasItemsOrderOverride(node) ? node.getChildrenInVisualOrder() : node.children.toArray()\n}\n\n/**\n * Process children sequentially so that promises can be resolved in order and subsequent references\n * to the same entities can use cached values.\n */\nasync function processChildrenSequentially(\n\tchildren: readonly CanvasNode[] | undefined,\n\tparent: CanvasNode,\n\tctx: AgentContext,\n\toptions: SerializeOptions,\n): Promise<readonly string[]> {\n\tconst orderedChildren = children ?? getChildrenForSerialization(parent)\n\tif (!orderedChildren) return emptyArray()\n\tconst childCommands: string[] = []\n\n\tfor (const child of orderedChildren) {\n\t\tconst result = await nodeToDSLCommands(child, parent, ctx, options)\n\t\tchildCommands.push(result)\n\t}\n\n\treturn childCommands\n}\n\nasync function processChildrenWithOverlayOrdering(\n\tchildren: readonly CanvasNode[] | undefined,\n\tparent: CanvasNode,\n\tctx: AgentContext,\n\toptions: SerializeOptions,\n): Promise<{ overlayChildCommands: readonly string[]; childCommands: readonly string[] }> {\n\tconst orderedChildren = children ?? getChildrenForSerialization(parent)\n\tif (!orderedChildren) {\n\t\treturn {\n\t\t\toverlayChildCommands: emptyArray(),\n\t\t\tchildCommands: emptyArray(),\n\t\t}\n\t}\n\n\tconst overlayChildCommands: string[] = []\n\tconst childCommands: string[] = []\n\n\tfor (const child of orderedChildren) {\n\t\tconst result = await nodeToDSLCommands(child, parent, ctx, options)\n\t\t// Overlay children need to land after the parent's ADD (so the trigger exists) but before the\n\t\t// parent's SET (so SHOW_OVERLAY handlers can immediately reference the child id).\n\t\tif (isOverlayLikeNode(child, ctx, parent)) {\n\t\t\toverlayChildCommands.push(result)\n\t\t\tcontinue\n\t\t}\n\n\t\tchildCommands.push(result)\n\t}\n\n\treturn { overlayChildCommands, childCommands }\n}\n\nexport async function nodeToDSLCommands(\n\tnode: CanvasNode,\n\tparent: MaybeCanvasNode,\n\tctx: AgentContext,\n\toptions: SerializeOptions = { separator: COMMAND_SEPARATOR },\n): Promise<string> {\n\tif (isRichTextNode(node)) {\n\t\tctx.virtualText.maybeHydrateDocument(node)\n\t}\n\n\tconst rawAttributes = await toAttributes(node, parent, ctx)\n\n\t// Extract serialized virtual text values before flattening \u2014 controls.toAttributes emits these for\n\t// RichText control props, and flatten() would otherwise expand them into invalid\n\t// $control__key.0.type= keys that don't correspond to any real control.\n\tconst richTextControlBlocks = extractRichTextControlBlocks(rawAttributes)\n\n\tconst { name, ...attributes } = flatten(rawAttributes)\n\n\tswitch (node.__class) {\n\t\tcase ClassDiscriminator.WebPageNode:\n\t\tcase ClassDiscriminator.DesignPageNode:\n\t\tcase ClassDiscriminator.LayoutTemplateNode:\n\t\tcase ClassDiscriminator.FormBooleanInputNode:\n\t\tcase ClassDiscriminator.FormPlainTextInputNode:\n\t\tcase ClassDiscriminator.FormSelectNode:\n\t\tcase ClassDiscriminator.FrameNode:\n\t\tcase ClassDiscriminator.RedirectRouteNode:\n\t\tcase ClassDiscriminator.SmartComponentNode:\n\t\tcase ClassDiscriminator.OverlayNode: {\n\t\t\tconst nodeClass = getNodeClass(node, ctx, parent)\n\t\t\t// Overlay children must be added before the parent update because parent interactions may\n\t\t\t// immediately reference those overlay ids (for example SHOW_OVERLAY handlers). We still\n\t\t\t// serialize children in a single sequential pass so shared context caches warm in order.\n\t\t\tconst { overlayChildCommands, childCommands } = await processChildrenWithOverlayOrdering(\n\t\t\t\tgetChildrenForSerialization(node),\n\t\t\t\tnode,\n\t\t\t\tctx,\n\t\t\t\toptions,\n\t\t\t)\n\t\t\tconst variableCommands = withVariables(node)\n\t\t\t\t? await createVariableCommands(node, options.separator, ctx, options)\n\t\t\t\t: emptyArray()\n\t\t\tconst addAttributes = createAddCommandAttributes(node, nodeClass, name)\n\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: addAttributes,\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tconst updateCommands = !isEmptyObject(attributes)\n\t\t\t\t? [\n\t\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t: emptyArray()\n\n\t\t\treturn [...commands, ...overlayChildCommands, ...variableCommands, ...updateCommands, ...childCommands]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.RichTextNode: {\n\t\t\tassert(isRichTextNode(node), \"Node is not a rich text node\")\n\n\t\t\tconst textBlockCommands: string[] = []\n\t\t\tconst blocks = ctx.virtualText.getDocument(node.id)?.children\n\n\t\t\tconst hasVariableContent = !isUndefined(node.htmlContent) || !isUndefined(node.textContent)\n\t\t\tif (blocks && !hasVariableContent) {\n\t\t\t\tconst serialized = await serializeBlocks(blocks, ctx, undefined)\n\t\t\t\ttextBlockCommands.push(\n\t\t\t\t\t...emitRichTextDSLCommands(serialized, (block, blockIndex) =>\n\t\t\t\t\t\tgetRichTextDSLCommand(block, node.id, blockIndex, options),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tparent: node.parentid ?? undefined,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\t...textBlockCommands,\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.ColorStyleTokenNode: {\n\t\t\tassert(isColorStyleTokenNode(node), \"Node is not a color style token node\")\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.CodeComponentNode: {\n\t\t\tassert(isCodeComponentNode(node), \"Node is not a code component node\")\n\t\t\t// Code Components can have children in the form of Overlays or FloatingPosition nodes.\n\t\t\tconst { overlayChildCommands, childCommands } = await processChildrenWithOverlayOrdering(\n\t\t\t\tgetChildrenForSerialization(node),\n\t\t\t\tnode,\n\t\t\t\tctx,\n\t\t\t\toptions,\n\t\t\t)\n\n\t\t\tconst nodeClass =\n\t\t\t\tgetSpecialCaseDSLNodeClass(node, ctx) === IconNodeClass ? IconNodeClass : ComponentInstanceNodeClass\n\t\t\tconst { $control__icon, ...restAttributes } = attributes\n\n\t\t\t// Emit +TextBlock/+TextRun commands for each RichText control prop, using a composite\n\t\t\t// parent \"nodeId/$control__controlTitle\" that processCommand.ts already understands.\n\t\t\tconst richTextCommands = getRichTextControlDSLCommands(node.id, richTextControlBlocks, options)\n\n\t\t\tlet addAttributes: AddCommandAttributes | undefined\n\t\t\tswitch (nodeClass) {\n\t\t\t\tcase IconNodeClass:\n\t\t\t\t\taddAttributes = {\n\t\t\t\t\t\tnode: nodeClass,\n\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\tparent: node.parentid ?? undefined,\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\tset: isModuleExportIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t\t? ctx.vectorSets.forInstanceIdentifier(node.codeComponentIdentifier)?.name\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t$control__icon,\n\t\t\t\t\t\tname,\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase ComponentInstanceNodeClass:\n\t\t\t\t\taddAttributes = {\n\t\t\t\t\t\tnode: nodeClass,\n\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\tparent: node.parentid ?? undefined,\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\tcomponent: isModuleExportIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t\t? ctx.components.getIdForModuleIdentifier(node.codeComponentIdentifier)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tname,\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(nodeClass)\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: addAttributes,\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\t...overlayChildCommands,\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\t$control__icon: nodeClass === \"ComponentInstanceNode\" ? $control__icon : undefined,\n\t\t\t\t\t\t\t...restAttributes,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\t...richTextCommands,\n\t\t\t\t...childCommands,\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.TextStylePresetNode: {\n\t\t\tassert(isTextStylePresetNode(node), \"Node is not a text style preset node\")\n\t\t\t// TODO: Why is this not used consistently?\n\t\t\tconst { tag: _tag, ...restAttributes } = attributes ?? {}\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\ttag: node.tag,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: node.id, ...restAttributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.LinkStylePresetNode:\n\t\tcase ClassDiscriminator.InlineCodeStylePresetNode:\n\t\tcase ClassDiscriminator.BlockquoteStylePresetNode:\n\t\tcase ClassDiscriminator.TableStylePresetNode:\n\t\tcase ClassDiscriminator.ImageStylePresetNode: {\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.ComponentPresetNode: {\n\t\t\tassert(isComponentPresetNode(node), \"Node is not a component preset node\")\n\t\t\tconst component = ctx?.components.getIdForModuleIdentifier(node.componentIdentifier)\n\t\t\t// Returning empty string here as other components are not supported so we handle those in the same way\n\t\t\t// as we handle unsupported nodes.\n\t\t\tif (!component) return \"\"\n\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: ClassDiscriminator.ComponentPresetNode,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tcomponent,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(attributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn commands.join(\"\").trim()\n\t\t}\n\t\tcase ClassDiscriminator.CollectionNode: {\n\t\t\tconst childCommands = await processChildrenSequentially(getChildrenForSerialization(node), node, ctx, options)\n\t\t\tconst variableCommands = withVariables(node)\n\t\t\t\t? await createVariableCommands(node, options.separator, ctx, options)\n\t\t\t\t: emptyArray()\n\n\t\t\tconst commands = [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tparent: node.parentid ?? undefined,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\n\t\t\tif (!isEmptyObject(attributes)) {\n\t\t\t\tcommands.push(\n\t\t\t\t\tcommandToDSL(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions.separator,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn [...commands, ...variableCommands, ...childCommands].join(\"\").trim()\n\t\t}\n\t\tcase ClassDiscriminator.ShaderNode: {\n\t\t\tassert(isShaderNode(node), \"Node is not a shader node\")\n\n\t\t\tconst shaderName = ctx.shaders.getNameForIdentifier(node.shaderModuleIdentifier)\n\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tnode: node.__class,\n\t\t\t\t\t\t\tid: node.id,\n\t\t\t\t\t\t\tparent: node.parentid ?? undefined,\n\t\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t\t\tshader: shaderName,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: node.id, ...attributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.RootNode: {\n\t\t\tassert(isRootNode(node), \"Node is not a root node\")\n\t\t\treturn [\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: rootNodeId, ...attributes },\n\t\t\t\t\t},\n\t\t\t\t\toptions.separator,\n\t\t\t\t),\n\t\t\t]\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim()\n\t\t}\n\t\tcase ClassDiscriminator.AbTestsEntityTypeRootNode:\n\t\tcase ClassDiscriminator.AgentPanelTool:\n\t\tcase ClassDiscriminator.AgentDragSelectTool:\n\t\tcase ClassDiscriminator.AgentSelectTool:\n\t\tcase ClassDiscriminator.AnalyticsScopeNode:\n\t\tcase ClassDiscriminator.BlockquoteEntityTypeRootNode:\n\t\tcase ClassDiscriminator.BooleanShapeNode:\n\t\tcase ClassDiscriminator.BoxShadow:\n\t\tcase ClassDiscriminator.BranchNode:\n\t\tcase ClassDiscriminator.BranchesNode:\n\t\tcase ClassDiscriminator.CanvasNode:\n\t\tcase ClassDiscriminator.CanvasPageNode:\n\t\tcase ClassDiscriminator.CanvasScopeNode:\n\t\tcase ClassDiscriminator.ChatTool:\n\t\tcase ClassDiscriminator.CMSEntityTypeRootNode:\n\t\tcase ClassDiscriminator.CodeFileEntityTypeRootNode:\n\t\tcase ClassDiscriminator.CollectionItemNode:\n\t\tcase ClassDiscriminator.CollectionReferenceVariableEditTool:\n\t\tcase ClassDiscriminator.Color:\n\t\tcase ClassDiscriminator.ColorEntityTypeRootNode:\n\t\tcase ClassDiscriminator.ColorStyleTokenListNode:\n\t\tcase ClassDiscriminator.ComponentEntityTypeRootNode:\n\t\tcase ClassDiscriminator.ConicGradient:\n\t\tcase ClassDiscriminator.ContentManagementNode:\n\t\tcase ClassDiscriminator.CreateCodeComponentBaseTool:\n\t\tcase ClassDiscriminator.CreateFrameBaseTool:\n\t\tcase ClassDiscriminator.CreateShapeBaseTool:\n\t\tcase ClassDiscriminator.CreateTextTool:\n\t\tcase ClassDiscriminator.CustomCodeNode:\n\t\tcase ClassDiscriminator.CustomCodeScopeNode:\n\t\tcase ClassDiscriminator.DateVariableEditTool:\n\t\tcase ClassDiscriminator.EntityFolderNode:\n\t\tcase ClassDiscriminator.EntityReferenceNode:\n\t\tcase ClassDiscriminator.EntityRootNode:\n\t\tcase ClassDiscriminator.EnumVariableEditTool:\n\t\tcase ClassDiscriminator.ErrorListNode:\n\t\tcase ClassDiscriminator.ErrorNode:\n\t\tcase ClassDiscriminator.ExportOptions:\n\t\tcase ClassDiscriminator.ExternalModuleNode:\n\t\tcase ClassDiscriminator.ExternalModulesListNode:\n\t\tcase ClassDiscriminator.FeedbackTool:\n\t\tcase ClassDiscriminator.FunnelNode:\n\t\tcase ClassDiscriminator.FunnelsEntityTypeRootNode:\n\t\tcase ClassDiscriminator.FunnelStepActionNode:\n\t\tcase ClassDiscriminator.FunnelStepNode:\n\t\tcase ClassDiscriminator.GapTool:\n\t\tcase ClassDiscriminator.GradientColorStop:\n\t\tcase ClassDiscriminator.GradientToolManagerTool:\n\t\tcase ClassDiscriminator.GuideMoveTool:\n\t\tcase ClassDiscriminator.HeaderRouteNode:\n\t\tcase ClassDiscriminator.HighlightStackItemTool:\n\t\tcase ClassDiscriminator.HighlightTool:\n\t\tcase ClassDiscriminator.InitialTool:\n\t\tcase ClassDiscriminator.InlineCodeEntityTypeRootNode:\n\t\tcase ClassDiscriminator.LayoutTemplateEntityTypeRootNode:\n\t\tcase ClassDiscriminator.LineAnchorMoveTool:\n\t\tcase ClassDiscriminator.LinearGradient:\n\t\tcase ClassDiscriminator.LinkEntityTypeRootNode:\n\t\tcase ClassDiscriminator.LinkTool:\n\t\tcase ClassDiscriminator.LoadingShieldTool:\n\t\tcase ClassDiscriminator.LocalizationGlossaryItemNode:\n\t\tcase ClassDiscriminator.LocalizationGlossaryNode:\n\t\tcase ClassDiscriminator.LocalModuleNode:\n\t\tcase ClassDiscriminator.LocalModulesListNode:\n\t\tcase ClassDiscriminator.MoveTool:\n\t\tcase ClassDiscriminator.MutableNode:\n\t\tcase ClassDiscriminator.OvalShapeNode:\n\t\tcase ClassDiscriminator.PaddingTool:\n\t\tcase ClassDiscriminator.PageLinkTool:\n\t\tcase ClassDiscriminator.PanTool:\n\t\tcase ClassDiscriminator.PathCurveBendTool:\n\t\tcase ClassDiscriminator.PathDefaultTool:\n\t\tcase ClassDiscriminator.PathNode:\n\t\tcase ClassDiscriminator.PathSegment:\n\t\tcase ClassDiscriminator.PathSegmentAdditionTool:\n\t\tcase ClassDiscriminator.PathSegmentHandleMoveTool:\n\t\tcase ClassDiscriminator.PathSegmentMoveTool:\n\t\tcase ClassDiscriminator.PathSegmentSelectTool:\n\t\tcase ClassDiscriminator.PolygonShapeNode:\n\t\tcase ClassDiscriminator.PresetsListNode:\n\t\tcase ClassDiscriminator.PreviewSettings:\n\t\tcase ClassDiscriminator.ProxyRouteNode:\n\t\tcase ClassDiscriminator.RadialGradient:\n\t\tcase ClassDiscriminator.RadiusTool:\n\t\tcase ClassDiscriminator.RecoveryTool:\n\t\tcase ClassDiscriminator.RectangleShapeNode:\n\t\tcase ClassDiscriminator.ResizeTool:\n\t\tcase ClassDiscriminator.RewriteRouteNode:\n\t\tcase ClassDiscriminator.RichTextEditTool:\n\t\tcase ClassDiscriminator.RichTextVariableEditTool:\n\t\tcase ClassDiscriminator.RotateTool:\n\t\tcase ClassDiscriminator.RouteLocaleNode:\n\t\tcase ClassDiscriminator.RouteNode:\n\t\tcase ClassDiscriminator.RouteSegmentNode:\n\t\tcase ClassDiscriminator.RouteSegmentRootNode:\n\t\tcase ClassDiscriminator.RoutesNode:\n\t\tcase ClassDiscriminator.SampleColorTool:\n\t\tcase ClassDiscriminator.ScaleTool:\n\t\tcase ClassDiscriminator.ScopeNode:\n\t\tcase ClassDiscriminator.SelectTool:\n\t\tcase ClassDiscriminator.Shadow:\n\t\tcase ClassDiscriminator.ShapeContainerNode:\n\t\tcase ClassDiscriminator.ShapeGroupNode:\n\t\tcase ClassDiscriminator.SlotConnectTool:\n\t\tcase ClassDiscriminator.SlotNode:\n\t\tcase ClassDiscriminator.SlotPropertyNode:\n\t\tcase ClassDiscriminator.StarShapeNode:\n\t\tcase ClassDiscriminator.StringVariableEditTool:\n\t\tcase ClassDiscriminator.StyledTextDraft:\n\t\tcase ClassDiscriminator.SVGNode:\n\t\tcase ClassDiscriminator.TestTool:\n\t\tcase ClassDiscriminator.TextEditTool:\n\t\tcase ClassDiscriminator.TextEntityTypeRootNode:\n\t\tcase ClassDiscriminator.TextNode:\n\t\tcase ClassDiscriminator.VectorSetEntityTypeRootNode:\n\t\tcase ClassDiscriminator.VectorSetNode:\n\t\tcase ClassDiscriminator.VekterGradientTool:\n\t\tcase ClassDiscriminator.VekterPathEngine:\n\t\tcase ClassDiscriminator.VekterTool:\n\t\tcase ClassDiscriminator.ViewportResizeTool:\n\t\tcase ClassDiscriminator.ZoomSelectTool:\n\t\tcase ClassDiscriminator.ZoomTool:\n\t\tcase ClassDiscriminator.ContentManagementEntityTypeRootNode:\n\t\t\treturn \"\"\n\t\tdefault:\n\t\t\tassertNever(node.__class)\n\t}\n}\n\nexport const testing = {\n\tgetTextComponentInstanceDSLCommand,\n}\n", "import { tool } from \"ai\"\nimport { applyTypography } from \"app/ai/utils/typography.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { ChatPart, EmitChatPart } from \"../types.ts\"\nimport { ASK_CLARIFICATION_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nexport const SKIPPED_ANSWER = \"[skipped]\"\n\ninterface DescribedSuggestedAnswer {\n\tanswer: string\n\tdescription: string\n}\n\nexport type SuggestedAnswer = string | DescribedSuggestedAnswer\n\n// Answers must be either all strings or all described suggested answers.\ntype SuggestedAnswers = string[] | DescribedSuggestedAnswer[]\n\nexport interface ClarificationQuestion {\n\tquestion: string\n\tsuggestedAnswers: SuggestedAnswers\n}\n\nexport interface ClarificationAnswer {\n\tquestionIndex: number\n\tanswer: SuggestedAnswer\n}\n\nexport type ClarificationAnswerProvider = (\n\tquestions: readonly ClarificationQuestion[],\n) => Promise<readonly ClarificationAnswer[]>\n\ninterface AskClarificationInput {\n\tdecisionContext?: string\n\tquestions: ClarificationQuestion[]\n}\n\nconst describedSuggestedAnswerSchema: z.ZodType<DescribedSuggestedAnswer> = z.object({\n\tanswer: z.string(),\n\tdescription: z.string(),\n})\n\nexport const MIN_ANSWER_WORD_COUNT = 3\nexport const MAX_ANSWER_WORD_COUNT = 8\n\nconst MIN_SUGGESTED_ANSWERS = 2\nconst MAX_SUGGESTED_ANSWERS = 4\n\nconst clarificationQuestionSchema: z.ZodType<ClarificationQuestion> = z.object({\n\tquestion: z.string().describe(\"Short, conversational question. One line.\"),\n\tsuggestedAnswers: z\n\t\t.union([\n\t\t\tz.array(z.string()),\n\t\t\tz\n\t\t\t\t.array(describedSuggestedAnswerSchema)\n\t\t\t\t.describe(\"Use described answers only when labels need brief context. Keep descriptions clear and concise.\"),\n\t\t])\n\t\t.describe(\n\t\t\t`${MIN_SUGGESTED_ANSWERS}-${MAX_SUGGESTED_ANSWERS} short suggested answers (${MIN_ANSWER_WORD_COUNT}-${MAX_ANSWER_WORD_COUNT} words each). The UI provides a free-text path, so do not include future-answer labels.`,\n\t\t),\n})\n\nexport const MAX_QUESTIONS = 4\nexport const MIN_QUESTIONS = 1\n\nconst AskClarificationInputSchema: z.ZodType<AskClarificationInput> = z.object({\n\tdecisionContext: z\n\t\t.string()\n\t\t.trim()\n\t\t.min(1)\n\t\t.describe(\n\t\t\t\"Optional brief internal summary of the active design decision branch, why it is unresolved, and what these questions will resolve. Do not include step-by-step reasoning.\",\n\t\t)\n\t\t.optional(),\n\tquestions: z\n\t\t.array(clarificationQuestionSchema)\n\t\t.min(MIN_QUESTIONS)\n\t\t.max(MAX_QUESTIONS)\n\t\t.describe(\n\t\t\t`${MIN_QUESTIONS}-${MAX_QUESTIONS} focused questions. Ask as many as needed to resolve the active decision branch; avoid extra questions only when they would not materially change the result.`,\n\t\t),\n})\n\nconst description =\n\t\"Ask the user focused questions to resolve unresolved intent or narrow an active decision branch.\" as const\n\nfunction waitWithAbort(\n\twaitForUserAnswers: ClarificationAnswerProvider,\n\tquestions: readonly ClarificationQuestion[],\n\tabortSignal?: AbortSignal,\n): Promise<readonly ClarificationAnswer[]> {\n\tif (abortSignal?.aborted) throw new Error(\"Aborted\")\n\tif (abortSignal === undefined) return waitForUserAnswers(questions)\n\n\tlet onAbort: (() => void) | undefined\n\tconst abortPromise = new Promise<never>((_, reject) => {\n\t\tonAbort = () => reject(new Error(\"Aborted\"))\n\t\tif (abortSignal.aborted) {\n\t\t\tonAbort()\n\t\t\treturn\n\t\t}\n\t\tabortSignal.addEventListener(\"abort\", onAbort, { once: true })\n\t})\n\n\treturn Promise.race<readonly ClarificationAnswer[]>([waitForUserAnswers(questions), abortPromise]).finally(() => {\n\t\tif (onAbort !== undefined) abortSignal.removeEventListener(\"abort\", onAbort)\n\t})\n}\n\nexport function createAskClarificationTool(\n\twaitForUserAnswers: ClarificationAnswerProvider,\n\tsynchronize: () => Promise<void>,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t\tabortSignal,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t\tabortSignal?: AbortSignal\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: AskClarificationInputSchema,\n\t\t\texecute: async input => waitWithAbort(waitForUserAnswers, input.questions, abortSignal),\n\t\t},\n\t\t{\n\t\t\ttoolName: ASK_CLARIFICATION_TOOL_NAME,\n\t\t\tonFirstInputDelta: () => ({ type: \"clarification\" }),\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: input => createClarificationChatPart(input.questions),\n\t\t\tonComplete: (part, answers) => ({\n\t\t\t\t...part,\n\t\t\t\tanswers: answers.map(({ answer }) => (isString(answer) ? answer : answer.answer)),\n\t\t\t}),\n\t\t},\n\t)\n}\n\n/** Used by the Agent evals. */\nexport function createAskClarificationToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: AskClarificationInputSchema,\n\t})\n}\n\nfunction createClarificationChatPart(questions: ClarificationQuestion[]): Extract<ChatPart, { type: \"clarification\" }> {\n\treturn { type: \"clarification\", questions: normalizeQuestions(questions) }\n}\n\nfunction normalizeQuestions(questions: ClarificationQuestion[]): ClarificationQuestion[] {\n\treturn questions.map(({ question, suggestedAnswers }) => ({\n\t\tquestion: applyTypography(question),\n\t\tsuggestedAnswers: normalizeSuggestedAnswers(suggestedAnswers),\n\t}))\n}\n\nfunction normalizeSuggestedAnswers(suggestedAnswers: SuggestedAnswers): SuggestedAnswers {\n\tif (suggestedAnswers.every(isString)) {\n\t\treturn suggestedAnswers.map(answer => applyTypography(answer))\n\t}\n\n\treturn suggestedAnswers.map(answer => ({ answer: applyTypography(answer.answer), description: answer.description }))\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { ContextAction } from \"document/components/utils/contextActions.ts\"\nimport { createSmartComponent } from \"document/components/utils/createSmartComponent.ts\"\nimport type { CanvasNode, CodeComponentNode, SmartComponentNode } from \"document/models/CanvasTree/index.ts\"\nimport { prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport { isObject, isString } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport { type AIContextNode, transformToAiNode } from \"../context/nodes.ts\"\nimport { ComponentInstanceNodeClass, ComponentNodeClass } from \"../dsl.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { CREATE_COMPONENT_FROM_FRAME_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nexport const SUCCESS_STATUS = \"success\" as const\nexport const ERROR_STATUS = \"error\" as const\n\nconst toolDescription =\n\t`A one-step macro to create a ${ComponentNodeClass} from an existing ${ClassDiscriminator.FrameNode}, automatically turning any Replicas into additional Variants, and automatically replacing the source with a ${ComponentInstanceNodeClass} with matching Variant $control__variant values\". Use **every time** you need to add ${ComponentNodeClass} functionality to - or \"create a component\" from - existing layers.` as const\nconst variantControlAttribute = prefixControlPropKey(\"variant\")\n\nconst CreateComponentFromFrameInputSchema = z.object({\n\tid: z.string().describe(`The id of the ${ClassDiscriminator.FrameNode} to convert into a ${ComponentNodeClass}.`),\n\tname: z.string().describe(`The name for the new ${ComponentNodeClass}.`),\n})\n\ntype CreateComponentFromFrameInput = z.infer<typeof CreateComponentFromFrameInputSchema>\n\ninterface CreateComponentFromFrameSuccessResult {\n\tstatus: typeof SUCCESS_STATUS\n\tcomponent: AIContextNode\n\tinstances: readonly AIContextNode[]\n}\n\ninterface CreateComponentFromFrameErrorResult {\n\tstatus: typeof ERROR_STATUS\n\tmessage: string\n}\n\ntype CreateComponentFromFrameResult = CreateComponentFromFrameSuccessResult | CreateComponentFromFrameErrorResult\n\nfunction error(message: string): CreateComponentFromFrameErrorResult {\n\treturn { status: ERROR_STATUS, message }\n}\n\nfunction formatErrorReason(error: unknown): string {\n\tif (error instanceof Error && error.message) return error.message\n\tif (isObject(error) && isString(error.message) && error.message) return error.message\n\tif (isString(error) && error) return error\n\treturn \"Unknown error\"\n}\n\nasync function buildSuccessResult(\n\tctx: AgentContext,\n\tcomponent: SmartComponentNode,\n\tinstances: readonly CodeComponentNode[],\n): Promise<CreateComponentFromFrameSuccessResult> {\n\tconst [serializedComponent] = await transformToAiNode([component], ctx, true, 2)\n\tassert(serializedComponent, \"Created component must serialize\")\n\n\treturn {\n\t\tstatus: SUCCESS_STATUS,\n\t\tcomponent: serializedComponent,\n\t\tinstances: await transformToAiNode(instances, ctx, false, undefined, undefined, {\n\t\t\tattributeFilter: new Set([variantControlAttribute]),\n\t\t}),\n\t}\n}\n\nasync function scheduleComponentCreation(\n\tctx: AgentContext,\n\tengine: VekterEngine,\n\tsourceNode: CanvasNode,\n\tname: string,\n\tsynchronize: () => Promise<void>,\n): Promise<{ component: SmartComponentNode; instances: CodeComponentNode[]; moduleCreation?: Promise<unknown> }> {\n\tconst result: {\n\t\tvalue?: { component: SmartComponentNode; instances: CodeComponentNode[]; moduleCreation?: Promise<unknown> }\n\t} = {}\n\n\tawait engine.scheduler.scheduleAgentChanges(() => {\n\t\tconst changeset = ctx.turnChangeset.getTurnChangeset()\n\t\tassert(changeset, \"Changeset is required\")\n\n\t\tchangeset.append(() => {\n\t\t\tconst current = ctx.treeResolver.current(sourceNode)\n\t\t\tassert(current, \"Source frame must be present in the tree\")\n\n\t\t\tconst {\n\t\t\t\tnode: component,\n\t\t\t\tinstances = [],\n\t\t\t\tmoduleCreation,\n\t\t\t} = createSmartComponent({\n\t\t\t\tengine,\n\t\t\t\tname,\n\t\t\t\tselectedNode: current,\n\t\t\t\theadless: true,\n\t\t\t})\n\n\t\t\tctx.treeResolver.recordChangedNode(component.id, \"insert\")\n\n\t\t\tfor (const variant of component.getVariants()) {\n\t\t\t\tctx.treeResolver.recordChangedNode(variant.id, \"insert\")\n\t\t\t}\n\n\t\t\tfor (const instance of instances) {\n\t\t\t\tctx.treeResolver.recordChangedNode(instance.id, \"insert\")\n\t\t\t}\n\n\t\t\tresult.value = { component, instances, moduleCreation }\n\t\t})\n\t})\n\n\t// Wait for the component to be created before serializing instances.\n\tawait result.value?.moduleCreation\n\n\tawait synchronize()\n\n\tassert(result.value, \"Component creation did not complete\")\n\treturn result.value\n}\n\nexport async function executeCreateComponentFromFrame(\n\tinput: CreateComponentFromFrameInput,\n\tctx: AgentContext,\n\tsynchronize: () => Promise<void>,\n): Promise<CreateComponentFromFrameResult> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required for createComponentFromFrame\")\n\n\tconst sourceNode = ctx.treeResolver.get(input.id)\n\tif (!sourceNode) return error(`Cannot convert unknown frame ${escapeValue(input.id)}.`)\n\n\tif (!ContextAction.canConvertNodeToSmartComponentPrimaryVariant(ctx.treeStore.tree, sourceNode)) {\n\t\treturn error(`Frame ${escapeValue(input.id)} cannot be converted to a ${escapeValue(ComponentNodeClass)}.`)\n\t}\n\n\ttry {\n\t\tconst { component, instances } = await scheduleComponentCreation(ctx, engine, sourceNode, input.name, synchronize)\n\t\treturn await buildSuccessResult(\n\t\t\tctx,\n\t\t\tcomponent,\n\t\t\tinstances.map(instance => ctx.treeResolver.current(instance) ?? instance),\n\t\t)\n\t} catch (caughtError) {\n\t\treturn error(\n\t\t\t`Failed to create a ${escapeValue(ComponentNodeClass)} from frame ${escapeValue(input.id)}: ${formatErrorReason(caughtError)}`,\n\t\t)\n\t}\n}\n\nexport function createCreateComponentFromFrameTool(\n\tctx: AgentContext,\n\tsynchronize: () => Promise<void>,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription: toolDescription,\n\t\t\tinputSchema: CreateComponentFromFrameInputSchema,\n\t\t\texecute: async input => executeCreateComponentFromFrame(input, ctx, synchronize),\n\t\t},\n\t\t{\n\t\t\ttoolName: CREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tsynchronize,\n\t\t\tonPart,\n\t\t\tonStart: () => ({ type: \"create-component\", text: `Creating component` }),\n\t\t\tonComplete: (part, result) => ({\n\t\t\t\t...part,\n\t\t\t\ttext: result.status === SUCCESS_STATUS ? `Created component` : `Failed to create component`,\n\t\t\t\tcomplete: true,\n\t\t\t}),\n\t\t},\n\t)\n}\n\nexport function createCreateComponentFromFrameToolDefinition() {\n\treturn tool({\n\t\tdescription: toolDescription,\n\t\tinputSchema: CreateComponentFromFrameInputSchema,\n\t})\n}\n", "const stripTags = new Set([\"script\", \"noscript\", \"iframe\", \"object\", \"embed\", \"template\"])\nconst headingPattern = /^h[1-6]$/\n\nconst inlineTags = new Set(\n\t\"a abbr b bdi bdo br cite code data em i kbd mark q s samp small span strong sub sup time u var\".split(\" \"),\n)\n\nconst colorPropertyAllowList = new Set(\n\t\"color background-color background background-image border-color fill stroke\".split(\" \"),\n)\n\nconst colorValuePattern =\n\t/#[0-9a-f]{3,8}\\b|rgba?\\s*\\(|hsla?\\s*\\(|oklch\\s*\\(|oklab\\s*\\(|color\\s*\\(|linear-gradient\\s*\\(|radial-gradient\\s*\\(|conic-gradient\\s*\\(|\\btransparent\\b|\\bcurrentcolor\\b|\\binherit\\b/i\n\nconst namedColors = new Set(\n\t(\n\t\t\"black white red green blue orange yellow purple pink gray grey navy teal aqua maroon olive silver fuchsia lime cyan \" +\n\t\t\"indigo violet coral salmon tomato gold khaki ivory beige linen wheat sienna tan plum orchid peru chocolate crimson \" +\n\t\t\"darkblue darkgreen darkred darkgray darkgrey lightblue lightgreen lightgray lightgrey lightcoral lightyellow \" +\n\t\t\"aliceblue antiquewhite azure bisque blanchedalmond burlywood cadetblue chartreuse cornflowerblue cornsilk \" +\n\t\t\"darkgoldenrod darkorange darksalmon darkseagreen darkslategray darkturquoise darkviolet deeppink deepskyblue \" +\n\t\t\"dodgerblue firebrick floralwhite forestgreen gainsboro ghostwhite goldenrod greenyellow honeydew hotpink indianred \" +\n\t\t\"lavender lavenderblush lawngreen lemonchiffon lightcyan lightpink lightsalmon lightseagreen lightskyblue \" +\n\t\t\"lightsteelblue limegreen mediumpurple mediumseagreen mediumslateblue mediumspringgreen midnightblue mintcream \" +\n\t\t\"mistyrose moccasin navajowhite oldlace olivedrab orangered palegoldenrod palegreen paleturquoise palevioletred \" +\n\t\t\"papayawhip peachpuff powderblue rebeccapurple rosybrown royalblue saddlebrown sandybrown seagreen seashell skyblue \" +\n\t\t\"slateblue slategray snow springgreen steelblue thistle turquoise whitesmoke yellowgreen\"\n\t).split(\" \"),\n)\n\nfunction looksLikeColor(value: string): boolean {\n\treturn colorValuePattern.test(value) || namedColors.has(value.trim().toLowerCase())\n}\n\nfunction isColorDeclaration(prop: string, value: string): boolean {\n\tif (colorPropertyAllowList.has(prop)) return true\n\tif (prop.startsWith(\"--\")) return looksLikeColor(value)\n\treturn false\n}\n\nfunction filterCssForDesign(css: string): string {\n\tconst sheet = new CSSStyleSheet()\n\tsheet.replaceSync(css)\n\n\tconst kept: string[] = []\n\tfor (const rule of sheet.cssRules) {\n\t\tif (rule.type !== CSSRule.STYLE_RULE) continue\n\t\tconst styleRule = rule as CSSStyleRule\n\t\tconst declarations: string[] = []\n\n\t\tfor (let i = 0; i < styleRule.style.length; i++) {\n\t\t\tconst prop = styleRule.style.item(i)\n\t\t\tconst value = styleRule.style.getPropertyValue(prop).trim()\n\t\t\tif (isColorDeclaration(prop, value)) {\n\t\t\t\tdeclarations.push(`${prop}: ${value}`)\n\t\t\t}\n\t\t}\n\n\t\tif (declarations.length > 0) {\n\t\t\tkept.push(`${styleRule.selectorText} { ${declarations.join(\"; \")} }`)\n\t\t}\n\t}\n\n\treturn kept.join(\"\\n\")\n}\n\nfunction extractRelevantInlineStyles(el: Element): string | null {\n\tif (!(el instanceof HTMLElement)) return null\n\tconst { style } = el\n\tconst kept: string[] = []\n\n\tfor (let i = 0; i < style.length; i++) {\n\t\tconst prop = style.item(i)\n\t\tconst value = style.getPropertyValue(prop).trim()\n\t\tif (isColorDeclaration(prop, value)) {\n\t\t\tkept.push(`${prop}: ${value}`)\n\t\t}\n\t}\n\n\treturn kept.length > 0 ? kept.join(\"; \") : null\n}\n\nfunction resolveUrl(value: string | null, baseUrl: string): string | null {\n\tif (!value) return null\n\ttry {\n\t\treturn new URL(value, baseUrl).href\n\t} catch {\n\t\treturn value\n\t}\n}\n\nfunction extractStyleSheets(doc: Document): string | null {\n\tconst styleEls = doc.querySelectorAll(\"style\")\n\tif (styleEls.length === 0) return null\n\n\tconst cssTexts: string[] = []\n\tfor (const styleEl of styleEls) {\n\t\tconst text = styleEl.textContent?.trim()\n\t\tif (text) cssTexts.push(text)\n\t}\n\n\tif (cssTexts.length === 0) return null\n\n\tconst combined = cssTexts.join(\"\\n\")\n\tconst filtered = filterCssForDesign(combined)\n\treturn filtered || null\n}\n\nexport function cleanHtml(html: string, baseUrl: string): string {\n\tconst doc = new DOMParser().parseFromString(html, \"text/html\")\n\n\tconst title = doc.title?.trim()\n\tconst metaDesc = doc.querySelector('meta[name=\"description\"]')?.getAttribute(\"content\")?.trim()\n\tconst canonical = doc.querySelector('link[rel=\"canonical\"]')?.getAttribute(\"href\")\n\tconst ogImage = doc.querySelector('meta[property=\"og:image\"]')?.getAttribute(\"content\")\n\tconst themeColor = doc.querySelector('meta[name=\"theme-color\"]')?.getAttribute(\"content\")?.trim()\n\n\tconst header: string[] = []\n\tif (title) header.push(`title: ${title}`)\n\tif (metaDesc) header.push(`description: ${metaDesc}`)\n\tif (canonical) header.push(`canonical: ${resolveUrl(canonical, baseUrl)}`)\n\tif (ogImage) header.push(`og:image: ${resolveUrl(ogImage, baseUrl)}`)\n\tif (themeColor) header.push(`theme-color: ${themeColor}`)\n\n\tconst styleSection = extractStyleSheets(doc)\n\n\tconst lines: string[] = []\n\tlet prefix = \"\"\n\n\tfunction emit(text: string): void {\n\t\tif (prefix) {\n\t\t\tlines.push(prefix + text)\n\t\t\tprefix = \"\"\n\t\t} else {\n\t\t\tlines.push(text)\n\t\t}\n\t}\n\n\tfunction flushPrefix(): void {\n\t\tif (prefix) {\n\t\t\tlines.push(prefix.trimEnd())\n\t\t\tprefix = \"\"\n\t\t}\n\t}\n\n\tfunction walk(node: Node): void {\n\t\tif (node.nodeType === Node.COMMENT_NODE) return\n\n\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\tconst text = node.textContent?.replace(/\\s+/g, \" \") ?? \"\"\n\t\t\tif (text.trim()) emit(text)\n\t\t\treturn\n\t\t}\n\n\t\tif (node.nodeType !== Node.ELEMENT_NODE) return\n\n\t\tconst el = node as Element\n\t\tconst tag = el.tagName.toLowerCase()\n\n\t\tif (stripTags.has(tag)) return\n\t\tif (tag === \"style\") return\n\n\t\tif (tag === \"svg\") {\n\t\t\temit(`[svg: ${el.outerHTML}]`)\n\t\t\treturn\n\t\t}\n\t\tif (el.getAttribute(\"aria-hidden\") === \"true\") return\n\t\tif (el instanceof HTMLElement && el.hidden) return\n\n\t\tif (tag === \"img\") {\n\t\t\tconst src = resolveUrl(el.getAttribute(\"src\"), baseUrl)\n\t\t\tconst alt = el.getAttribute(\"alt\")?.trim()\n\t\t\tconst srcset = el.getAttribute(\"srcset\")\n\t\t\tif (src) {\n\t\t\t\tconst parts = [`[image: ${src}`]\n\t\t\t\tif (alt) parts.push(`alt=\"${alt}\"`)\n\t\t\t\tif (srcset) parts.push(`srcset=\"${srcset}\"`)\n\t\t\t\temit(parts.join(\" \") + \"]\")\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif (tag === \"video\" || tag === \"audio\" || tag === \"source\") {\n\t\t\tconst src = resolveUrl(el.getAttribute(\"src\"), baseUrl)\n\t\t\tif (src) emit(`[${tag}: ${src}]`)\n\t\t\tfor (const source of el.querySelectorAll(\"source\")) {\n\t\t\t\tconst sourceSrc = resolveUrl(source.getAttribute(\"src\"), baseUrl)\n\t\t\t\tif (sourceSrc) emit(`[source: ${sourceSrc}]`)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst isLink = tag === \"a\"\n\t\tconst href = isLink ? resolveUrl(el.getAttribute(\"href\"), baseUrl) : null\n\t\tconst isBlock = !inlineTags.has(tag)\n\t\tconst inlineStyle = extractRelevantInlineStyles(el)\n\n\t\tif (isBlock && lines.length > 0) {\n\t\t\tflushPrefix()\n\t\t\tconst lastLine = lines[lines.length - 1]\n\t\t\tif (lastLine && lastLine.trim() !== \"\") lines.push(\"\")\n\t\t}\n\n\t\tconst isHeading = headingPattern.test(tag)\n\t\tif (isHeading) prefix += `${\"#\".repeat(Number(tag[1]))} `\n\n\t\tif (tag === \"li\") prefix += \"- \"\n\n\t\tif (inlineStyle) prefix += `[style: ${inlineStyle}] `\n\n\t\tconst beforeLen = lines.length\n\t\tfor (const child of node.childNodes) walk(child)\n\n\t\tflushPrefix()\n\n\t\tif (isLink && href) {\n\t\t\tconst linkText = lines.slice(beforeLen).join(\"\").trim()\n\t\t\tif (linkText && href !== linkText) {\n\t\t\t\tlines.push(` (${href})`)\n\t\t\t} else if (!linkText) {\n\t\t\t\temit(`[link: ${href}]`)\n\t\t\t}\n\t\t}\n\n\t\tif (isBlock && lines.length > 0) {\n\t\t\tconst lastLine = lines[lines.length - 1]\n\t\t\tif (lastLine && lastLine.trim() !== \"\") lines.push(\"\")\n\t\t}\n\t}\n\n\tconst body = doc.body\n\tif (body) walk(body)\n\n\tconst sections: string[] = []\n\n\tif (header.length > 0) {\n\t\tsections.push(`---\\n${header.join(\"\\n\")}\\n---`)\n\t}\n\n\tif (styleSection) {\n\t\tsections.push(`<styles>\\n${styleSection}\\n</styles>`)\n\t}\n\n\tconst content = lines\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trim()\n\n\tif (content) sections.push(content)\n\n\treturn sections.join(\"\\n\\n\")\n}\n", "import { emptyArray, getLogger } from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { Files } from \"../context/files.ts\"\nimport { extractTrustedUrlsFromText } from \"../context/files.ts\"\nimport { getBlockingTaskCompletedMessage, getBlockingTaskStartMessage } from \"../statusMessages.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { cleanHtml } from \"./cleanHtml.ts\"\nimport type { ScriptFetchContent } from \"./script/fetch/types.ts\"\nimport { FETCH_EXTERNAL_URL_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nexport const MAX_FETCH_EXTERNAL_URL_BODY_CHARS = 40_000\n\nconst log = getLogger(\"ai:agents:fetch\")\n\nconst FetchExternalUrlInputSchema = z.object({\n\turl: z.url().describe(\"The URL to fetch. Must use http or https protocol.\"),\n})\n\ntype FetchExternalUrlInput = z.infer<typeof FetchExternalUrlInputSchema>\n\ninterface FetchExternalUrlSuccessResponse {\n\tbodyText: string\n}\n\ninterface FetchExternalUrlErrorResponse {\n\terror: string\n}\n\ntype FetchExternalUrlResponse = FetchExternalUrlSuccessResponse | FetchExternalUrlErrorResponse\n\nexport function getFetchUrlStepMessage(url?: string): string {\n\treturn getBlockingTaskStartMessage(\"fetch\", url)\n}\n\nexport function getFetchUrlCompletedMessage(): string {\n\treturn getBlockingTaskCompletedMessage(\"fetch\")\n}\n\nexport function getTrustedUrlsFromFetchExternalUrlResponse(\n\tinputUrl: string,\n\tresponse: FetchExternalUrlResponse,\n): readonly string[] {\n\tif (\"error\" in response) return emptyArray()\n\treturn [inputUrl, ...extractTrustedUrlsFromText(response.bodyText)]\n}\n\nexport interface AIServiceFetchResponse {\n\tmimeType: string\n\tcontent: string\n}\n\nexport interface FetchExternalUrlResourceSuccess extends ScriptFetchContent {\n\tok: true\n\tbodyText: string\n\tbodyTextTruncated: boolean\n\ttrustedUrls: readonly string[]\n}\n\nexport interface FetchExternalUrlResourceError {\n\tok: false\n\turl: string\n\terror: string\n}\n\nexport type FetchExternalUrlResourceResponse = FetchExternalUrlResourceSuccess | FetchExternalUrlResourceError\n\nexport function isHtmlContentType(mimeType: string | null): boolean {\n\tif (!mimeType) return false\n\tconst lower = mimeType.toLowerCase()\n\treturn lower.includes(\"text/html\") || lower.includes(\"application/xhtml+xml\")\n}\n\nexport async function fetchExternalUrlResource(\n\tinput: FetchExternalUrlInput,\n): Promise<FetchExternalUrlResourceResponse> {\n\ttry {\n\t\tconst result: AIServiceFetchResponse = await apiFetcher.post(\"/ai/v3/fetch/\", { url: input.url })\n\n\t\tlet text: string\n\t\tif (isHtmlContentType(result.mimeType)) {\n\t\t\ttext = cleanHtml(result.content, input.url)\n\t\t} else {\n\t\t\ttext = result.content\n\t\t}\n\n\t\tconst textTotalChars = text.length\n\t\tconst bodyTextTruncated = textTotalChars > MAX_FETCH_EXTERNAL_URL_BODY_CHARS\n\t\tconst bodyText = bodyTextTruncated ? text.slice(0, MAX_FETCH_EXTERNAL_URL_BODY_CHARS) : text\n\n\t\treturn {\n\t\t\tok: true,\n\t\t\turl: input.url,\n\t\t\tcontentType: result.mimeType,\n\t\t\tcontent: result.content,\n\t\t\ttext,\n\t\t\ttextTotalChars,\n\t\t\ttextTruncated: false,\n\t\t\tbodyText,\n\t\t\tbodyTextTruncated,\n\t\t\t// Trust only URLs returned to the script or tool.\n\t\t\t// The full text may include tail content hidden by truncation.\n\t\t\ttrustedUrls: extractTrustedUrlsFromText(bodyText),\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown fetch error.\"\n\t\tlog.warn(\"fetch_url failed\", { url: input.url, error: message })\n\t\treturn { ok: false, url: input.url, error: message }\n\t}\n}\n\nasync function fetchExternalUrl(input: FetchExternalUrlInput): Promise<FetchExternalUrlResponse> {\n\tconst response = await fetchExternalUrlResource(input)\n\tif (!response.ok) return { error: response.error }\n\treturn { bodyText: response.bodyText }\n}\n\nconst description = \"Fetch an external URL and return its content. Only public http/https URLs are allowed.\" as const\n\nexport function createFetchExternalUrlTool(\n\tsynchronize: () => Promise<void>,\n\tfiles: Pick<Files, \"registerTrustedUrls\">,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: FetchExternalUrlInputSchema,\n\t\t\texecute: async input => {\n\t\t\t\tlog.debug(\"Tool called: fetch_url\", { url: input.url })\n\t\t\t\tconst startedAt = performance.now()\n\t\t\t\tconst response = await fetchExternalUrl(input)\n\t\t\t\tfiles.registerTrustedUrls(getTrustedUrlsFromFetchExternalUrlResponse(input.url, response))\n\t\t\t\tconst elapsedMs = Math.round(performance.now() - startedAt)\n\t\t\t\tlog.debug(\"Tool response: fetch_url\", { elapsedMs, response })\n\t\t\t\treturn response\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttoolName: FETCH_EXTERNAL_URL_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: input => ({\n\t\t\t\ttype: \"blocking-task\",\n\t\t\t\ttask: \"fetch\",\n\t\t\t\tmessage: input.url,\n\t\t\t}),\n\t\t},\n\t)\n}\n\nexport function createFetchExternalUrlToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: FetchExternalUrlInputSchema,\n\t})\n}\n\nexport { FetchExternalUrlInputSchema }\n", "import {\n\tassert,\n\tgetLogger,\n\tisExternalModuleIdentifier,\n\tisLocalModuleIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { ContextAction } from \"document/components/utils/contextActions.ts\"\nimport type { CodeComponentNode, FrameNode } from \"document/models/CanvasTree/index.ts\"\nimport { isCodeComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getSmartComponentOrWebPageForCodeComponent } from \"document/models/CanvasTree/nodes/utils/smartComponentInstanceHelpers.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport { ComponentInstanceNodeClass, ComponentNodeClass } from \"../dsl.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { FLATTEN_COMPONENT_INSTANCE_TOOL_NAME, MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nconst log = getLogger(\"ai:agents\")\n\nexport const REPLACEMENT_ID_FIELD = \"replacementId\" as const\nexport const SUCCESS_STATUS = \"success\" as const\nexport const BLOCKED_STATUS = \"blocked\" as const\n\nconst toolDescription = \"Flatten a local component instance into raw editable layers.\"\n\nconst FlattenComponentInstanceInputSchema = z.object({\n\tid: z.string().describe(\"The id of the component instance to flatten.\"),\n})\n\ntype FlattenComponentInstanceInput = z.infer<typeof FlattenComponentInstanceInputSchema>\n\ninterface FlattenSuccessResult {\n\tstatus: typeof SUCCESS_STATUS\n\treplacementId: string\n}\n\ninterface FlattenBlockedResult {\n\tstatus: typeof BLOCKED_STATUS\n\tmessage: string\n}\n\ntype FlattenComponentInstanceResult = FlattenSuccessResult | FlattenBlockedResult\n\nfunction blocked(message: string): FlattenBlockedResult {\n\treturn { status: BLOCKED_STATUS, message }\n}\n\nasync function executeFlatten(\n\tctx: AgentContext,\n\tengine: VekterEngine,\n\tinstance: CodeComponentNode,\n): Promise<FlattenComponentInstanceResult> {\n\tconst identifier = parseModuleIdentifier(instance.codeComponentIdentifier)\n\tif (isExternalModuleIdentifier(identifier)) {\n\t\treturn blocked(\n\t\t\t`Cannot flatten an external ${escapeValue(ComponentInstanceNodeClass)}. Use ${escapeValue(MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME)} first to convert it to a local ${escapeValue(ComponentInstanceNodeClass)}, then flatten.`,\n\t\t)\n\t}\n\n\tif (!isLocalModuleIdentifier(identifier)) {\n\t\treturn blocked(`Cannot flatten this node because it is not a ${escapeValue(ComponentInstanceNodeClass)}.`)\n\t}\n\n\tif (!ContextAction.canDetachVariantInstance(engine, instance)) {\n\t\treturn blocked(\n\t\t\t`Cannot flatten this ${escapeValue(ComponentInstanceNodeClass)}. It may be inside a non-primary variant or not a valid ${escapeValue(ComponentNodeClass)}.`,\n\t\t)\n\t}\n\n\tconst smartComponentOrWebPage = getSmartComponentOrWebPageForCodeComponent(engine.tree, instance)\n\tif (!smartComponentOrWebPage) {\n\t\treturn blocked(`Could not find the component for this ${escapeValue(ComponentInstanceNodeClass)}.`)\n\t}\n\n\ttry {\n\t\tconst [loadedScope] = await engine.loadScopesThenProcess([smartComponentOrWebPage])\n\t\tif (!loadedScope) {\n\t\t\treturn blocked(`Failed to load the children of the ${escapeValue(ComponentNodeClass)}.`)\n\t\t}\n\n\t\tconst result: { detachedNode: FrameNode | null } = { detachedNode: null }\n\t\tconst scheduler = ctx.hooks.getEngine()?.scheduler\n\t\tassert(scheduler, \"Scheduler is required\")\n\n\t\tawait scheduler.scheduleAgentChanges(() => {\n\t\t\tconst changeset = ctx.turnChangeset.getTurnChangeset()\n\t\t\tassert(changeset, \"Changeset is required\")\n\n\t\t\tchangeset.append(() => {\n\t\t\t\tresult.detachedNode = ContextAction.detachSmartComponentOrWebPageInstance(\n\t\t\t\t\tengine,\n\t\t\t\t\tinstance.draftOrCurrent(),\n\t\t\t\t\tloadedScope,\n\t\t\t\t\tundefined,\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\n\t\tif (!result.detachedNode) {\n\t\t\tthrow new Error(\"Failed to detach the component instance\")\n\t\t}\n\n\t\tconst llmId = ctx.treeResolver.getLlmId(instance.id) ?? instance.id\n\t\tctx.treeResolver.registerExternalNode(llmId, result.detachedNode)\n\n\t\treturn {\n\t\t\tstatus: SUCCESS_STATUS,\n\t\t\treplacementId: result.detachedNode.id,\n\t\t}\n\t} catch {\n\t\treturn blocked(`Flatten failed, the ${escapeValue(ComponentInstanceNodeClass)} could not be replaced.`)\n\t}\n}\n\nexport async function executeFlattenComponentInstance(\n\tinput: FlattenComponentInstanceInput,\n\tctx: AgentContext,\n): Promise<FlattenComponentInstanceResult> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required for flatten_component_instance\")\n\n\tconst { id } = input\n\n\tconst instance = ctx.treeResolver.get(id)\n\tif (!isCodeComponentNode(instance)) {\n\t\treturn blocked(`Node ${escapeValue(id)} is not a ${escapeValue(ComponentInstanceNodeClass)} node.`)\n\t}\n\n\tlog.debug(`Executing ${FLATTEN_COMPONENT_INSTANCE_TOOL_NAME} tool`, { id })\n\n\treturn executeFlatten(ctx, engine, instance)\n}\n\nexport function createFlattenComponentInstanceTool(\n\tctx: AgentContext,\n\tsynchronize: () => Promise<void>,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription: toolDescription,\n\t\t\tinputSchema: FlattenComponentInstanceInputSchema,\n\t\t\texecute: async input => executeFlattenComponentInstance(input, ctx),\n\t\t},\n\t\t{\n\t\t\ttoolName: FLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tsynchronize,\n\t\t\tonPart,\n\t\t},\n\t)\n}\n\nexport function createFlattenComponentInstanceToolDefinition() {\n\treturn tool({\n\t\tdescription: toolDescription,\n\t\tinputSchema: FlattenComponentInstanceInputSchema,\n\t})\n}\n", "import type { ChatPart, EmitChatPart } from \"../../types.ts\"\nimport { addCompletedAt, supportsCompletedAt } from \"../transformers/createUIConnectedTool.ts\"\n\nexport async function wrapExecutionInChatPartUpdater<T, C extends ChatPart>(\n\tonPart: EmitChatPart | undefined,\n\tpart: C,\n\texecution: Promise<T>,\n\taddExecutionResultToPart?: (result: T) => Partial<C>,\n): Promise<T> {\n\tconst updater = onPart?.(part)?.ui\n\tconst result = await execution\n\tupdater?.((current, timestamp) => {\n\t\tconst updatedPart = { ...current, ...addExecutionResultToPart?.(result) }\n\t\tif (supportsCompletedAt(updatedPart)) {\n\t\t\treturn addCompletedAt(updatedPart, timestamp)\n\t\t}\n\t\treturn updatedPart\n\t})\n\treturn result\n}\n", "import type { ExternalModuleExportIdentifier, ModuleType } from \"@framerjs/shared\"\nimport {\n\tassert,\n\tgetLogger,\n\tisExternalModuleIdentifier,\n\tisModuleExportIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { EditBehavior } from \"document/components/chrome/insertSidebar/types.ts\"\nimport {\n\tisImportableComponentModuleType,\n\tunlinkAndReplaceAll,\n\tunlinkComponent,\n\ttype ImportExternalComponentOptions,\n} from \"document/components/unlinking/index.ts\"\nimport { isFramerModule } from \"document/components/utils/defaultComponents.ts\"\nimport { checkEditBehaviorBlocked } from \"document/components/utils/editActionForCodeComponent.ts\"\nimport type { CodeComponentNode } from \"document/models/CanvasTree/index.ts\"\nimport type { ExternalModuleNode } from \"document/models/CanvasTree/nodes/ExternalModuleNode.ts\"\nimport { isCodeComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport { ComponentInstanceNodeClass } from \"../dsl.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport type { ChatPart, EmitChatPart } from \"../types.ts\"\nimport {\n\tASK_CLARIFICATION_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n} from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\nimport { wrapExecutionInChatPartUpdater } from \"./utils/wrapExecutionInUpdater.ts\"\n\nconst log = getLogger(\"ai:agents\")\n\nexport const NEEDS_CONFIRMATION_STATUS = \"needs_confirmation\" as const\nexport const REPLACE_ALL_FIELD = \"replaceAll\" as const\nexport const SUCCESS_STATUS = \"success\" as const\nexport const BLOCKED_STATUS = \"blocked\" as const\n\nconst toolDescription = \"Convert an external (library) component into a local project component.\"\n\nconst MakeExternalComponentLocalInputSchema = z.object({\n\tid: z.string().describe(\"The id of the external component instance to make local.\"),\n\treplaceAll: z\n\t\t.boolean()\n\t\t.optional()\n\t\t.describe(\n\t\t\t`When true, replace all instances of this component. When false, replace only this instance. Required when the tool returns ${NEEDS_CONFIRMATION_STATUS}.`,\n\t\t),\n})\n\ntype MakeExternalComponentLocalInput = z.infer<typeof MakeExternalComponentLocalInputSchema>\n\ninterface UnlinkSuccessResult {\n\tstatus: typeof SUCCESS_STATUS\n\tmessage: string\n\tcomponent: {\n\t\tid: string\n\t\tdisplayName: string\n\t}\n}\n\ninterface NeedsConfirmationResult {\n\tstatus: typeof NEEDS_CONFIRMATION_STATUS\n\tmessage: string\n}\n\ninterface UnlinkBlockedResult {\n\tstatus: typeof BLOCKED_STATUS\n\tmessage: string\n}\n\ntype MakeExternalComponentLocalResult = UnlinkSuccessResult | NeedsConfirmationResult | UnlinkBlockedResult\n\nfunction blocked(message: string): UnlinkBlockedResult {\n\treturn { status: BLOCKED_STATUS, message }\n}\n\nfunction getExternalIdentifier(\n\tengine: VekterEngine,\n\tinstance: CodeComponentNode,\n): { identifier: ExternalModuleExportIdentifier; moduleType: ModuleType | string } | null {\n\tconst parsed = parseModuleIdentifier(instance.codeComponentIdentifier)\n\tif (!isExternalModuleIdentifier(parsed) || !isModuleExportIdentifier(parsed)) return null\n\n\tconst externalModuleNode = engine.tree.getNode<ExternalModuleNode>(parsed.moduleId)\n\tconst moduleType = externalModuleNode?.type\n\tif (!moduleType) return null\n\n\treturn { identifier: parsed, moduleType }\n}\n\ninterface ValidatedInput {\n\tengine: VekterEngine\n\tinstance: CodeComponentNode\n\tidentifier: ExternalModuleExportIdentifier\n\tmoduleType: ModuleType | string\n\teditBehavior: EditBehavior | undefined\n}\n\n/**\n * Validates the input and returns early with needs_confirmation or blocked\n * before any UI is shown. Returns the validated input if the unlink can proceed.\n */\nfunction preCheck(\n\tinput: MakeExternalComponentLocalInput,\n\tctx: AgentContext,\n): MakeExternalComponentLocalResult | ValidatedInput {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required for make_external_component_local\")\n\n\tconst { id, replaceAll } = input\n\n\tconst instance = ctx.treeResolver.get(id)\n\tif (!isCodeComponentNode(instance)) {\n\t\treturn blocked(`Node ${escapeValue(id)} is not a component instance.`)\n\t}\n\n\tconst external = getExternalIdentifier(engine, instance)\n\tif (!external) {\n\t\treturn blocked(`This ${escapeValue(ComponentInstanceNodeClass)} is not an external component.`)\n\t}\n\n\tconst { identifier, moduleType } = external\n\tif (!isImportableComponentModuleType(moduleType)) {\n\t\treturn blocked(`Components of type ${escapeValue(moduleType)} cannot be made local.`)\n\t}\n\n\tif (checkEditBehaviorBlocked(engine, identifier)) {\n\t\treturn blocked(\"This component cannot be made local.\")\n\t}\n\n\tconst editBehavior = engine.stores.insertSidebarStore.getEditBehavior(identifier.moduleId)\n\n\t// AutoUnlink / AutoDetach indicate the user has already configured the default\n\t// behavior for this module, so skip the confirmation prompt.\n\tif (\n\t\teditBehavior !== EditBehavior.AutoUnlink &&\n\t\teditBehavior !== EditBehavior.AutoDetach &&\n\t\t!isFramerModule(engine.stores.treeStore.tree, identifier) &&\n\t\treplaceAll === undefined\n\t) {\n\t\treturn {\n\t\t\tstatus: NEEDS_CONFIRMATION_STATUS,\n\t\t\tmessage: `This component may have multiple instances. Use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} to ask the user whether to replace only this instance or all instances, then retry with ${escapeValue(REPLACE_ALL_FIELD)} set to true or false.`,\n\t\t}\n\t}\n\n\treturn { engine, instance, identifier, moduleType, editBehavior }\n}\n\nconst statusKey: keyof MakeExternalComponentLocalResult = \"status\"\n\nfunction isEarlyResult(\n\tresult: MakeExternalComponentLocalResult | ValidatedInput,\n): result is MakeExternalComponentLocalResult {\n\treturn statusKey in result\n}\n\nasync function scheduleAgentTreeUpdate<T>(ctx: AgentContext, task: () => T): Promise<T> {\n\tlet result: { value: T } | undefined\n\tconst scheduler = ctx.hooks.getEngine()?.scheduler\n\tassert(scheduler, \"Scheduler is required\")\n\n\tawait scheduler.scheduleAgentChanges(() => {\n\t\tconst changeset = ctx.turnChangeset.getTurnChangeset()\n\t\tassert(changeset, \"Changeset is required\")\n\n\t\tchangeset.append(() => {\n\t\t\tresult = { value: task() }\n\t\t})\n\t})\n\n\tassert(result, \"Scheduled agent tree update did not run\")\n\treturn result.value\n}\n\nasync function performUnlink(\n\tctx: AgentContext,\n\tvalidated: ValidatedInput,\n\treplaceAll: boolean | undefined,\n): Promise<UnlinkSuccessResult | UnlinkBlockedResult> {\n\tconst { engine, instance, identifier, moduleType, editBehavior } = validated\n\n\tconst commonOptions: ImportExternalComponentOptions = {\n\t\tidentifier,\n\t\tmoduleType,\n\t\tinstance,\n\t\tenterIsolation: false,\n\t\tscheduleTreeUpdate: task => scheduleAgentTreeUpdate(ctx, task),\n\t\tskipUndoGroup: true,\n\t}\n\n\ttry {\n\t\tif (replaceAll) {\n\t\t\tawait unlinkAndReplaceAll(engine, commonOptions)\n\t\t} else {\n\t\t\tawait unlinkComponent(engine, { ...commonOptions, withUnlinkModal: false })\n\t\t}\n\n\t\tconst updatedInstance = engine.tree.getNode<CodeComponentNode>(instance.id)\n\t\tconst lookupId = updatedInstance?.codeComponentIdentifier ?? instance.codeComponentIdentifier\n\n\t\tconst lookupIdentifier = parseModuleIdentifier(lookupId)\n\t\tif (isExternalModuleIdentifier(lookupIdentifier) || !isModuleExportIdentifier(lookupIdentifier)) {\n\t\t\tthrow new Error(\"Instance was not converted to a local component\")\n\t\t}\n\n\t\tconst flattenHint =\n\t\t\teditBehavior === EditBehavior.AutoDetach\n\t\t\t\t? ` This component's edit behavior suggests flattening the instance. Consider calling ${escapeValue(FLATTEN_COMPONENT_INSTANCE_TOOL_NAME)}.`\n\t\t\t\t: \"\"\n\n\t\tconst id = ctx.components.getIdForModuleIdentifier(lookupIdentifier.value)\n\t\tif (!id) throw new Error(\"Instance was not converted to a local component\")\n\n\t\treturn {\n\t\t\tstatus: SUCCESS_STATUS,\n\t\t\tmessage: `Made external component local.${replaceAll ? \" All instances have been replaced.\" : \"\"}${flattenHint}`,\n\t\t\tcomponent: {\n\t\t\t\tid,\n\t\t\t\tdisplayName: ctx.components.getDisplayName(lookupIdentifier.value),\n\t\t\t},\n\t\t}\n\t} catch {\n\t\treturn blocked(\"Failed to make the component local. The unlink operation did not complete.\")\n\t}\n}\n\nexport function createMakeExternalComponentLocalTool(\n\tctx: AgentContext,\n\tsynchronize: () => Promise<void>,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription: toolDescription,\n\t\t\tinputSchema: MakeExternalComponentLocalInputSchema,\n\t\t\texecute: async input => {\n\t\t\t\tlog.debug(`Executing ${MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME} tool`, input)\n\n\t\t\t\tconst preCheckResult = preCheck(input, ctx)\n\t\t\t\tif (isEarlyResult(preCheckResult)) return preCheckResult\n\n\t\t\t\treturn wrapExecutionInChatPartUpdater<\n\t\t\t\t\tUnlinkSuccessResult | UnlinkBlockedResult,\n\t\t\t\t\tExtract<ChatPart, { type: \"blocking-task\" }>\n\t\t\t\t>(\n\t\t\t\t\tonPart,\n\t\t\t\t\t{ type: \"blocking-task\", task: \"make-external-component-local\" },\n\t\t\t\t\tperformUnlink(ctx, preCheckResult, input.replaceAll),\n\t\t\t\t\tresult => (result.status === SUCCESS_STATUS ? {} : { message: \"Unlink component failed\" }),\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttoolName: MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tsynchronize,\n\t\t\tonPart,\n\t\t},\n\t)\n}\n\nexport function createMakeExternalComponentLocalToolDefinition() {\n\treturn tool({\n\t\tdescription: toolDescription,\n\t\tinputSchema: MakeExternalComponentLocalInputSchema,\n\t})\n}\n", "import type { AnyComponentLoader } from \"@framerjs/framer-runtime\"\nimport {\n\tassert,\n\tassertNever,\n\tisLocalModuleIdentifier,\n\tisModuleExportIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { getDefaultWebPageTitle } from \"code-generation/components/generateMetadataModule.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { ErrorNodeReason } from \"document/models/CanvasTree/nodes/ErrorNode.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport {\n\tisCustomCodeScopeNode,\n\tisExternalModuleNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport {\n\ttype PublishError,\n\ttype PublishErrorUIType,\n\tSTALE_MODULE_ERROR_REASON,\n\tisUnverifiedEmailFormError,\n} from \"./PublishStore.ts\"\n\ninterface ErrorTitleData {\n\ttype: PublishErrorUIType\n\treason: string | ErrorNodeReason | typeof STALE_MODULE_ERROR_REASON | undefined\n\tnodeId: NodeID\n\tscopeId: NodeID\n\tmoduleIdentifier: string | undefined\n\texportName?: string\n}\n\n/**\n * Try to determine a valuable name for the error.\n */\nfunction nameForNodeError(\n\t{ moduleIdentifier, scopeId, nodeId }: Pick<ErrorTitleData, \"moduleIdentifier\" | \"scopeId\" | \"nodeId\">,\n\t{\n\t\ttree,\n\t\tcomponentLoader,\n\t}: {\n\t\ttree: CanvasTree\n\t\tcomponentLoader: AnyComponentLoader\n\t},\n): string | null | undefined {\n\tif (isModuleExportIdentifier(moduleIdentifier)) {\n\t\t// If the component is in the loader, use the name.\n\t\tconst name = componentLoader.componentForIdentifier(moduleIdentifier)?.name\n\t\tif (name) return name\n\t\tconst parsed = parseModuleIdentifier(moduleIdentifier)\n\t\tif (isLocalModuleIdentifier(parsed)) {\n\t\t\t// If the component is not in the loader, but it's a local component\n\t\t\t// generated from the tree, use the name of the source node..\n\t\t\tconst sourceNode = tree.get(parsed.localIdName)\n\t\t\tif (isWebPageNode(sourceNode)) {\n\t\t\t\treturn getDefaultWebPageTitle(tree, componentLoader, sourceNode)\n\t\t\t}\n\t\t\tconst sourceName = sourceNode?.resolveValue(\"name\")\n\t\t\tif (isString(sourceName)) return sourceName\n\t\t} else {\n\t\t\t// If the component is not in the loader, and it's tracked in the\n\t\t\t// external modules list, use the title we last recorded for it.\n\t\t\tconst external = tree.get(parsed.moduleId)\n\t\t\tif (isExternalModuleNode(external) && external.title) return external.title\n\t\t}\n\t}\n\n\t// Otherwise try to use the name of the node if it was provided by a designer.\n\tconst node = tree.get(nodeId)\n\tassert(node, \"Publish Errors: An error node should correspond to a node in the tree.\")\n\tconst nodeName = node.resolveValue(\"name\")\n\tif (isString(nodeName)) return nodeName\n\n\t// Finally try to fallback to the scope node name.\n\tconst scope = tree.get(scopeId)\n\tif (isWebPageNode(scope)) return getDefaultWebPageTitle(tree, componentLoader, scope)\n\tif (isCustomCodeScopeNode(scope)) return Dictionary.CustomCode\n\treturn scope?.resolveValue(\"name\")\n}\n\nexport function getPublishErrorTitle(\n\terror: PublishError,\n\t{ tree, componentLoader }: { tree: CanvasTree; componentLoader: AnyComponentLoader },\n): string {\n\tconst { type, reason, nodeId, scopeId, moduleIdentifier, exportName } = error\n\tconst context = { tree, componentLoader }\n\n\tswitch (type) {\n\t\tcase \"unknown\":\n\t\tcase \"code-generation\":\n\t\tcase \"component\": {\n\t\t\tconst name = nameForNodeError({ moduleIdentifier, scopeId, nodeId }, context) ?? Dictionary.Component\n\t\t\tif (reason === ErrorNodeReason.FileTooLarge) return `${name} Too Large`\n\t\t\tif (reason === ErrorNodeReason.MissingModule) {\n\t\t\t\tif (isString(exportName)) return `${exportName} Missing`\n\t\t\t\treturn `${name} Missing`\n\t\t\t}\n\t\t\tif (reason === STALE_MODULE_ERROR_REASON) return `${name} Out of Date`\n\t\t\tconst scope = tree.get(scopeId)\n\t\t\tif (isCustomCodeScopeNode(scope)) return name\n\t\t\tconst scopeName = isWebPageNode(scope) ? getDefaultWebPageTitle(tree, componentLoader, scope) : scope?.name\n\t\t\tif (name !== scopeName) return isWebPageNode(scope) ? `${name} on ${scopeName}` : `${name} in ${scopeName}`\n\t\t\treturn name\n\t\t}\n\t\tcase \"code-override\":\n\t\t\tif (reason === ErrorNodeReason.MissingModule) return \"Code Override Missing\"\n\t\t\treturn \"Invalid Code Override\"\n\t\tcase \"cms\":\n\t\t\treturn \"Cannot Load Collection\"\n\t\tcase \"form\":\n\t\t\tif (isUnverifiedEmailFormError(reason)) return \"Unverified Form Recipient\"\n\t\t\treturn \"Form Not Configured\"\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n", "import { DeploymentStrategy, type VersionDeployment } from \"@framerjs/app-shared\"\nimport { assert, assertNever, emptyArray, getLogger, murmurHash, stableStringify } from \"@framerjs/shared\"\nimport {\n\tisPublishError,\n\tisUnverifiedEmailFormError,\n\ttype PublishError,\n\ttype PublishStore,\n} from \"document/stores/PublishStore.ts\"\nimport { getPublishErrorTitle } from \"document/stores/publishErrorTitle.ts\"\nimport pluralize from \"pluralize\"\nimport { ChangeStatus, type ProjectChange } from \"web/pages/project/projectChanges.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { PUBLISH_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\nimport { getPublishUrlsFromPublishStore } from \"./utils/getPublishUrls.ts\"\n\nexport const PREVIEW_ACTION = \"preview\" as const\nexport const CONFIRM_PUBLISH_ACTION = \"confirm_publish\" as const\nexport const DEPLOY_TO_PRODUCTION_ACTION = \"deploy_to_production\" as const\n\nconst log = getLogger(\"ai:agents:publish\")\nconst MAX_PUBLISH_VERSIONS = 50\n\n/**\n * Tool input is intentionally action-discriminated:\n * - preview -> inspect readiness/changes and return confirmation hash\n * - confirm_publish -> perform publish after preview confirmation\n * - deploy_to_production -> deploy a specific staging version\n *\n * TODO: Restore the union, not supported by Azure GPT models.\n */\nexport const PublishInputSchema = z.object({\n\taction: z\n\t\t.enum([PREVIEW_ACTION, CONFIRM_PUBLISH_ACTION, DEPLOY_TO_PRODUCTION_ACTION])\n\t\t.describe(\n\t\t\t`Required for all calls. Use ${PREVIEW_ACTION} to inspect changes, ${CONFIRM_PUBLISH_ACTION} to execute publish, or ${DEPLOY_TO_PRODUCTION_ACTION} to deploy a staging version to production.`,\n\t\t),\n\tconfirmationHash: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t`Required when action is ${CONFIRM_PUBLISH_ACTION}. Must be omitted for ${PREVIEW_ACTION} and ${DEPLOY_TO_PRODUCTION_ACTION}.`,\n\t\t),\n\tversion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t`Required when action is ${DEPLOY_TO_PRODUCTION_ACTION}. Must be omitted for ${PREVIEW_ACTION} and ${CONFIRM_PUBLISH_ACTION}.`,\n\t\t),\n})\n\nconst PublishConfirmRuntimeInputSchema = z.object({\n\taction: z.literal(CONFIRM_PUBLISH_ACTION),\n\tconfirmationHash: z.string(),\n})\n\nconst PublishDeployRuntimeInputSchema = z.object({\n\taction: z.literal(DEPLOY_TO_PRODUCTION_ACTION),\n\tversion: z.string(),\n})\n\ntype PublishInput = z.infer<typeof PublishInputSchema>\n\ninterface PublishToolIssue {\n\ttitle: string\n\tblocking: boolean\n\terror: PublishError\n}\n\ninterface PublishToolProductionUrls {\n\tproduction: string\n\tpublished?: string\n}\n\ninterface PublishToolStagingAndProductionUrls extends PublishToolProductionUrls {\n\tstaging: string\n}\n\ntype PublishToolUrls = PublishToolProductionUrls | PublishToolStagingAndProductionUrls\n\ninterface PublishToolVersion {\n\tid: string\n\ttimestamp: number\n\tpublishedBy?: string\n}\n\ntype PublishToolChangeStatus = \"updated\" | \"added\" | \"removed\"\n\ninterface PublishToolChange {\n\ttype: string\n\tnodeId: string\n\tname: string\n\tstatus: PublishToolChangeStatus\n}\n\ninterface PublishToolSelectedVersion {\n\tid: string\n}\n\ninterface PublishToolConfirmPublishNextAction {\n\ttype: typeof CONFIRM_PUBLISH_ACTION\n\tconfirmationHash: string\n}\n\ninterface PublishToolDeployToProductionNextAction {\n\ttype: typeof DEPLOY_TO_PRODUCTION_ACTION\n\tversion: string\n}\n\ninterface PublishToolPreviewResultBase {\n\taction: typeof PREVIEW_ACTION\n\tmessage: string\n\tstagingEnabled: boolean\n\terrors: readonly PublishToolIssue[]\n\twarnings: readonly PublishToolIssue[]\n\tchanges: readonly PublishToolChange[]\n\tchangesCount: number | null\n\turls: PublishToolUrls\n}\n\ninterface PublishToolReadyResult extends PublishToolPreviewResultBase {\n\tstatus: \"ready\"\n\tconfirmationHash: string\n\tversion?: PublishToolSelectedVersion\n\tversions?: PublishToolVersion[]\n\tnextAction: PublishToolConfirmPublishNextAction\n}\n\ninterface PublishToolBlockedResult extends PublishToolPreviewResultBase {\n\tstatus: \"blocked\"\n}\n\ninterface PublishToolPreviewFailedResult extends PublishToolPreviewResultBase {\n\tstatus: \"failed\"\n}\n\ninterface PublishToolConfirmPublishResultBase {\n\taction: typeof CONFIRM_PUBLISH_ACTION\n\tmessage: string\n\tstagingEnabled: boolean\n\turls: PublishToolUrls\n}\n\ninterface PublishToolConfirmPublishPublishedResult extends PublishToolConfirmPublishResultBase {\n\tstatus: \"published\"\n\tversion: PublishToolSelectedVersion\n\tversions: PublishToolVersion[]\n\tnextAction?: PublishToolDeployToProductionNextAction\n}\n\ninterface PublishToolConfirmPublishFailedResult extends PublishToolConfirmPublishResultBase {\n\tstatus: \"failed\"\n\tconfirmationHash?: string\n\tnextAction?: PublishToolConfirmPublishNextAction\n}\n\ninterface PublishToolDeployToProductionResultBase {\n\taction: typeof DEPLOY_TO_PRODUCTION_ACTION\n\tmessage: string\n\tstagingEnabled: boolean\n\turls: PublishToolUrls\n}\n\ninterface PublishToolDeployToProductionPublishedResult extends PublishToolDeployToProductionResultBase {\n\tstatus: \"published\"\n\tversion: PublishToolSelectedVersion\n\tversions: PublishToolVersion[]\n}\n\ninterface PublishToolDeployToProductionFailedResult extends PublishToolDeployToProductionResultBase {\n\tstatus: \"failed\"\n}\n\ntype PublishToolResult =\n\t| PublishToolReadyResult\n\t| PublishToolBlockedResult\n\t| PublishToolPreviewFailedResult\n\t| PublishToolConfirmPublishPublishedResult\n\t| PublishToolConfirmPublishFailedResult\n\t| PublishToolDeployToProductionPublishedResult\n\t| PublishToolDeployToProductionFailedResult\n\ninterface PreparedPublishState {\n\tstagingEnabled: boolean\n\terrors: PublishToolIssue[]\n\twarnings: PublishToolIssue[]\n\tchanges: PublishToolChange[]\n\tchangesCount: number | null\n\turls: PublishToolUrls\n}\n\ntype PublishConfirmationHashState = Pick<\n\tPreparedPublishState,\n\t\"stagingEnabled\" | \"errors\" | \"warnings\" | \"changes\" | \"changesCount\" | \"urls\"\n>\n\ninterface PreparedActionExecution {\n\tprepared: PreparedPublishState\n\texpectedConfirmationHash: string\n}\n\nconst description =\n\t\"Preview and publish the site. First call returns changelog/warnings and a confirmation hash, then confirm to publish to staging or deploy a version to production.\" as const\n\nconst confirmationHashPattern = /^[a-z0-9]+$/u\n\nfunction toUnixTimestampSeconds(isoTimestamp: string | undefined): number {\n\tconst parsed = isoTimestamp ? Date.parse(isoTimestamp) : Number.NaN\n\treturn Number.isNaN(parsed) ? 0 : Math.floor(parsed / 1000)\n}\n\nfunction getPublishedByName(version: Pick<VersionDeployment, \"deployedBy\"> | undefined): string | undefined {\n\treturn version?.deployedBy?.name?.trim()\n}\n\nfunction isValidConfirmationHash(value: string): boolean {\n\treturn confirmationHashPattern.test(value)\n}\n\nfunction isValidVersion(value: string): boolean {\n\treturn value.trim().length > 0 && !/\\s/u.test(value)\n}\n\nfunction getStagingEnabled(publishStore: PublishStore): boolean {\n\tconst hasCustomDomain = Boolean(publishStore.customHostname && publishStore.customHostnameDeployment)\n\treturn publishStore.deploymentStrategy === DeploymentStrategy.Manual && hasCustomDomain\n}\n\nfunction getPublishUrls(publishStore: PublishStore): PublishToolUrls {\n\tconst { protectedStaging, ...urls } = getPublishUrlsFromPublishStore(publishStore)\n\treturn urls\n}\n\nfunction createPublishIssue(\n\terror: PublishError,\n\tcontext: Parameters<typeof getPublishErrorTitle>[1],\n): PublishToolIssue {\n\tconst title = getPublishErrorTitle(error, context)\n\n\treturn { title, blocking: !(error.type === \"form\" && isUnverifiedEmailFormError(error.reason)), error }\n}\n\nfunction splitIssues(issues: PublishToolIssue[]): { errors: PublishToolIssue[]; warnings: PublishToolIssue[] } {\n\tconst errors: PublishToolIssue[] = []\n\tconst warnings: PublishToolIssue[] = []\n\n\tfor (const issue of issues) {\n\t\tif (issue.blocking) {\n\t\t\terrors.push(issue)\n\t\t} else {\n\t\t\twarnings.push(issue)\n\t\t}\n\t}\n\n\treturn { errors, warnings }\n}\n\nfunction serializeChangeStatus(status: ChangeStatus): PublishToolChangeStatus {\n\tswitch (status) {\n\t\tcase ChangeStatus.Updated:\n\t\t\treturn \"updated\"\n\t\tcase ChangeStatus.Added:\n\t\t\treturn \"added\"\n\t\tcase ChangeStatus.Removed:\n\t\t\treturn \"removed\"\n\t\tdefault:\n\t\t\tassertNever(status, \"Invalid change status\")\n\t}\n}\n\nfunction serializePublishChanges(changes: readonly ProjectChange[]): PublishToolChange[] {\n\treturn changes.map(change => ({\n\t\ttype: change.type,\n\t\tnodeId: change.nodeId,\n\t\tname: change.name,\n\t\tstatus: serializeChangeStatus(change.status),\n\t}))\n}\n\n/** Returns versions as `{ id, timestamp }`, optionally pinning one version first. */\nfunction serializePublishVersions(\n\tpublishStore: PublishStore,\n\tprioritizedVersion?: Pick<VersionDeployment, \"id\" | \"createdAt\" | \"deployedBy\">,\n): PublishToolVersion[] {\n\tconst ids = new Set<string>()\n\tconst versions: PublishToolVersion[] = []\n\n\tif (prioritizedVersion) {\n\t\tids.add(prioritizedVersion.id)\n\t\tconst publishedBy = getPublishedByName(prioritizedVersion)\n\t\tversions.push({\n\t\t\tid: prioritizedVersion.id,\n\t\t\ttimestamp: toUnixTimestampSeconds(prioritizedVersion.createdAt),\n\t\t\t...(publishedBy ? { publishedBy } : {}),\n\t\t})\n\t}\n\n\t// Preserve store order while skipping ids already emitted above.\n\tfor (const version of publishStore.versions) {\n\t\tif (versions.length >= MAX_PUBLISH_VERSIONS) break\n\t\tif (ids.has(version.id)) continue\n\t\tids.add(version.id)\n\t\tconst publishedBy = getPublishedByName(version)\n\t\tversions.push({\n\t\t\tid: version.id,\n\t\t\ttimestamp: toUnixTimestampSeconds(version.createdAt),\n\t\t\t...(publishedBy ? { publishedBy } : {}),\n\t\t})\n\t}\n\n\treturn versions\n}\n\nasync function findVersionDeploymentById(\n\tpublishStore: PublishStore,\n\tversionId: string,\n): Promise<VersionDeployment | undefined> {\n\tif (!publishStore.didLoadInitialVersionDeployments) {\n\t\tawait publishStore.loadVersions()\n\t}\n\n\tlet version = publishStore.versions.find(v => v.id === versionId)\n\twhile (!version && publishStore.canLoadMoreVersionDeployments) {\n\t\tawait publishStore.loadVersions()\n\t\tversion = publishStore.versions.find(v => v.id === versionId)\n\t}\n\n\treturn version\n}\n\nasync function deployVersionToProduction(\n\tpublishStore: PublishStore,\n\tdeployment: VersionDeployment,\n\tcontext: Pick<PreparedPublishState, \"stagingEnabled\" | \"urls\">,\n): Promise<PublishToolDeployToProductionPublishedResult | PublishToolDeployToProductionFailedResult> {\n\tconst deployResult = await publishStore.updateCustomDomain(deployment)\n\tswitch (deployResult.ok) {\n\t\tcase false: {\n\t\t\tconst errorSuffix = deployResult.errorMessage ? ` (${deployResult.errorMessage})` : \"\"\n\t\t\treturn {\n\t\t\t\taction: DEPLOY_TO_PRODUCTION_ACTION,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tmessage: `Failed to publish version ${deployment.id} to production${errorSuffix}.`,\n\t\t\t\tstagingEnabled: context.stagingEnabled,\n\t\t\t\turls: {\n\t\t\t\t\t...context.urls,\n\t\t\t\t\tpublished: context.urls.production,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase true: {\n\t\t\tconst urls = getPublishUrls(publishStore)\n\t\t\treturn {\n\t\t\t\taction: DEPLOY_TO_PRODUCTION_ACTION,\n\t\t\t\tstatus: \"published\",\n\t\t\t\tmessage: `Version ${deployment.id} published to production.`,\n\t\t\t\tstagingEnabled: context.stagingEnabled,\n\t\t\t\tversions: serializePublishVersions(publishStore, deployment),\n\t\t\t\turls: {\n\t\t\t\t\t...urls,\n\t\t\t\t\tpublished: urls.production,\n\t\t\t\t},\n\t\t\t\tversion: { id: deployment.id },\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(deployResult.ok, \"Invalid deploy result\")\n\t}\n}\n\nasync function preparePublishState(ctx: AgentContext): Promise<PreparedPublishState> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required\")\n\n\tconst { publishStore } = engine.stores\n\tif (!publishStore.didLoadInitialVersionDeployments) {\n\t\tawait publishStore.loadVersions()\n\t}\n\tconst publishErrors = await publishStore.prepareForPublishing()\n\tconst issueContext = {\n\t\ttree: engine.tree,\n\t\tcomponentLoader: engine.componentLoader,\n\t}\n\tconst issues = publishErrors.map(error => createPublishIssue(error, issueContext))\n\tconst { errors, warnings } = splitIssues(issues)\n\n\tconst revisions = publishStore.getPublishRevisions()\n\n\treturn {\n\t\tstagingEnabled: getStagingEnabled(publishStore),\n\t\terrors,\n\t\twarnings,\n\t\tchanges: serializePublishChanges(revisions.changes),\n\t\tchangesCount: revisions.count,\n\t\turls: getPublishUrls(publishStore),\n\t}\n}\n\nfunction createBlockedResult(state: PreparedPublishState): PublishToolResult {\n\treturn {\n\t\taction: PREVIEW_ACTION,\n\t\tstatus: \"blocked\",\n\t\tmessage: `Publishing blocked by ${state.errors.length} ${pluralize(\"error\", state.errors.length)}. Resolve these before publishing.`,\n\t\tstagingEnabled: state.stagingEnabled,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tchanges: state.changes,\n\t\tchangesCount: state.changesCount,\n\t\turls: state.urls,\n\t}\n}\n\nfunction createPublishConfirmationHash(state: PreparedPublishState): string {\n\tconst serializableState: PublishConfirmationHashState = {\n\t\tstagingEnabled: state.stagingEnabled,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tchanges: state.changes,\n\t\tchangesCount: state.changesCount,\n\t\turls: state.urls,\n\t}\n\n\t// Coerce to uint32 (non-negative) before converting to compact base-36 (1-7 chars).\n\treturn (murmurHash(stableStringify(serializableState)) >>> 0).toString(36)\n}\n\nfunction getSerializedPublishChanges(publishStore: PublishStore): {\n\tchanges: PublishToolChange[]\n\tchangesCount: number | null\n} {\n\tconst revisions = publishStore.getPublishRevisions()\n\n\treturn {\n\t\tchanges: serializePublishChanges(revisions.changes),\n\t\tchangesCount: revisions.count,\n\t}\n}\n\nfunction getNoPermissionMessage(action: PublishInput[\"action\"], stagingEnabled: boolean): string {\n\tswitch (action) {\n\t\tcase DEPLOY_TO_PRODUCTION_ACTION:\n\t\t\treturn \"You do not have permission to publish to production.\"\n\t\tcase CONFIRM_PUBLISH_ACTION:\n\t\tcase PREVIEW_ACTION:\n\t\t\treturn stagingEnabled\n\t\t\t\t? \"You do not have permission to publish to staging.\"\n\t\t\t\t: \"You do not have permission to publish this site.\"\n\t\tdefault:\n\t\t\tassertNever(action, \"Invalid action\")\n\t}\n}\n\nfunction createNoPermissionResult(publishStore: PublishStore, action: PublishInput[\"action\"]): PublishToolResult {\n\tconst stagingEnabled = getStagingEnabled(publishStore)\n\tconst urls = getPublishUrls(publishStore)\n\tconst message = getNoPermissionMessage(action, stagingEnabled)\n\n\tif (action === PREVIEW_ACTION) {\n\t\tconst { changes, changesCount } = getSerializedPublishChanges(publishStore)\n\t\treturn {\n\t\t\taction,\n\t\t\tstatus: \"failed\",\n\t\t\tmessage,\n\t\t\tstagingEnabled,\n\t\t\terrors: emptyArray(),\n\t\t\twarnings: emptyArray(),\n\t\t\tchanges,\n\t\t\tchangesCount,\n\t\t\turls,\n\t\t}\n\t}\n\n\treturn {\n\t\taction,\n\t\tstatus: \"failed\",\n\t\tmessage,\n\t\tstagingEnabled,\n\t\turls,\n\t}\n}\n\nfunction createInvalidInputResult(\n\tpublishStore: PublishStore,\n\taction: typeof CONFIRM_PUBLISH_ACTION | typeof DEPLOY_TO_PRODUCTION_ACTION,\n\tmessage: string,\n): PublishToolResult {\n\tconst stagingEnabled = getStagingEnabled(publishStore)\n\tconst urls = getPublishUrls(publishStore)\n\n\treturn {\n\t\taction,\n\t\tstatus: \"failed\",\n\t\tmessage,\n\t\tstagingEnabled,\n\t\turls,\n\t}\n}\n\nfunction createActionBlockedResult(\n\taction: typeof CONFIRM_PUBLISH_ACTION,\n\tprepared: PreparedPublishState,\n): PublishToolResult {\n\tconst blockedCount = prepared.errors.length\n\treturn {\n\t\taction,\n\t\tstatus: \"failed\",\n\t\tmessage: `Publishing blocked by ${blockedCount} ${pluralize(\"error\", blockedCount)}. Run ${JSON.stringify({ action: PREVIEW_ACTION })} to inspect and resolve issues.`,\n\t\tstagingEnabled: prepared.stagingEnabled,\n\t\turls: prepared.urls,\n\t}\n}\n\nfunction createBlockedResultForAction(\n\taction: typeof PREVIEW_ACTION | typeof CONFIRM_PUBLISH_ACTION,\n\tprepared: PreparedPublishState,\n): PublishToolResult {\n\tswitch (action) {\n\t\tcase PREVIEW_ACTION:\n\t\t\treturn createBlockedResult(prepared)\n\t\tcase CONFIRM_PUBLISH_ACTION:\n\t\t\treturn createActionBlockedResult(action, prepared)\n\t\tdefault:\n\t\t\tassertNever(action, \"Invalid action\")\n\t}\n}\n\nconst key = \"prepared\" satisfies keyof PreparedActionExecution | keyof PublishToolResult\nfunction isPreparedActionExecution(\n\tresult: PreparedActionExecution | PublishToolResult,\n): result is PreparedActionExecution {\n\treturn key in result\n}\n\n/**\n * Runs shared action preconditions:\n * 1) permission check\n * 2) publish preparation (issues/changes/urls)\n * 3) blocked-state short-circuit (preview/confirm only)\n *\n * On success returns prepared data + expected confirmation hash.\n */\nasync function prepareActionExecution({\n\tctx,\n\tpublishStore,\n\taction,\n\tpublishToProduction,\n}: {\n\tctx: AgentContext\n\tpublishStore: PublishStore\n\taction: PublishInput[\"action\"]\n\tpublishToProduction: boolean\n}): Promise<PreparedActionExecution | PublishToolResult> {\n\tif (!publishStore.hasPublishPermission({ publishToProduction })) {\n\t\treturn createNoPermissionResult(publishStore, action)\n\t}\n\n\tconst prepared = await preparePublishState(ctx)\n\tconst hasBlockingIssues = prepared.errors.length > 0\n\tif (hasBlockingIssues) {\n\t\tswitch (action) {\n\t\t\tcase PREVIEW_ACTION:\n\t\t\tcase CONFIRM_PUBLISH_ACTION:\n\t\t\t\treturn createBlockedResultForAction(action, prepared)\n\t\t\tcase DEPLOY_TO_PRODUCTION_ACTION:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(action, \"Invalid action\")\n\t\t}\n\t}\n\n\treturn {\n\t\tprepared,\n\t\texpectedConfirmationHash: createPublishConfirmationHash(prepared),\n\t}\n}\n\nfunction createPreviewReadyResult({\n\tpublishStore,\n\tprepared,\n\texpectedConfirmationHash,\n}: {\n\tpublishStore: PublishStore\n\tprepared: PreparedPublishState\n\texpectedConfirmationHash: string\n}): PublishToolReadyResult {\n\tconst currentStagingVersion = prepared.stagingEnabled ? publishStore.defaultHostnameDeployment : undefined\n\n\treturn {\n\t\taction: PREVIEW_ACTION,\n\t\tstatus: \"ready\",\n\t\tmessage: prepared.stagingEnabled\n\t\t\t? `Review changelog and warnings, then confirm publish with confirmationHash \"${expectedConfirmationHash}\" to publish to staging.`\n\t\t\t: `Review changelog and warnings, then confirm publish with confirmationHash \"${expectedConfirmationHash}\".`,\n\t\tstagingEnabled: prepared.stagingEnabled,\n\t\tconfirmationHash: expectedConfirmationHash,\n\t\terrors: prepared.errors,\n\t\twarnings: prepared.warnings,\n\t\tchanges: prepared.changes,\n\t\tchangesCount: prepared.changesCount,\n\t\tversion: currentStagingVersion ? { id: currentStagingVersion.id } : undefined,\n\t\tversions: prepared.stagingEnabled ? serializePublishVersions(publishStore, currentStagingVersion) : undefined,\n\t\turls: prepared.urls,\n\t\tnextAction: {\n\t\t\ttype: CONFIRM_PUBLISH_ACTION,\n\t\t\tconfirmationHash: expectedConfirmationHash,\n\t\t},\n\t}\n}\n\nasync function executeDeployToProductionAction({\n\tpublishStore,\n\tcontext,\n\tversion,\n}: {\n\tpublishStore: PublishStore\n\tcontext: Pick<PreparedPublishState, \"stagingEnabled\" | \"urls\">\n\tversion: string\n}): Promise<PublishToolDeployToProductionPublishedResult | PublishToolDeployToProductionFailedResult> {\n\tconst deployment = await findVersionDeploymentById(publishStore, version)\n\tif (!deployment) {\n\t\treturn {\n\t\t\taction: DEPLOY_TO_PRODUCTION_ACTION,\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: `Version ${version} was not found. Publish to staging first, then retry with a returned version id.`,\n\t\t\tstagingEnabled: context.stagingEnabled,\n\t\t\turls: context.urls,\n\t\t}\n\t}\n\n\treturn deployVersionToProduction(publishStore, deployment, context)\n}\n\nasync function executePreviewToolAction({\n\tctx,\n\tpublishStore,\n}: {\n\tctx: AgentContext\n\tpublishStore: PublishStore\n}): Promise<PublishToolResult> {\n\tconst execution = await prepareActionExecution({\n\t\tctx,\n\t\tpublishStore,\n\t\taction: PREVIEW_ACTION,\n\t\tpublishToProduction: false,\n\t})\n\n\tif (!isPreparedActionExecution(execution)) return execution\n\n\treturn createPreviewReadyResult({\n\t\tpublishStore,\n\t\tprepared: execution.prepared,\n\t\texpectedConfirmationHash: execution.expectedConfirmationHash,\n\t})\n}\n\n/** Validates and executes deploy-to-production action. */\nasync function executeDeployToProductionToolAction({\n\tpublishStore,\n\tversion,\n}: {\n\tpublishStore: PublishStore\n\tversion: string\n}): Promise<PublishToolResult> {\n\tif (!isValidVersion(version)) {\n\t\treturn createInvalidInputResult(\n\t\t\tpublishStore,\n\t\t\tDEPLOY_TO_PRODUCTION_ACTION,\n\t\t\t\"Invalid version id format. Provide a version id returned by publish preview or staging publish.\",\n\t\t)\n\t}\n\n\tif (!publishStore.hasPublishPermission({ publishToProduction: true })) {\n\t\treturn createNoPermissionResult(publishStore, DEPLOY_TO_PRODUCTION_ACTION)\n\t}\n\n\tconst stagingEnabled = getStagingEnabled(publishStore)\n\tconst urls = getPublishUrls(publishStore)\n\n\tif (!stagingEnabled) {\n\t\treturn {\n\t\t\taction: DEPLOY_TO_PRODUCTION_ACTION,\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: \"Staging is not enabled for this site, so deploying a specific version to production is unavailable.\",\n\t\t\tstagingEnabled,\n\t\t\turls,\n\t\t}\n\t}\n\n\treturn executeDeployToProductionAction({\n\t\tpublishStore,\n\t\tcontext: { stagingEnabled, urls },\n\t\tversion,\n\t})\n}\n\n/** Validates and executes confirm-publish action. */\nasync function executeConfirmPublishToolAction({\n\tctx,\n\tpublishStore,\n\tconfirmationHash,\n}: {\n\tctx: AgentContext\n\tpublishStore: PublishStore\n\tconfirmationHash: string\n}): Promise<PublishToolResult> {\n\tif (!isValidConfirmationHash(confirmationHash)) {\n\t\treturn createInvalidInputResult(\n\t\t\tpublishStore,\n\t\t\tCONFIRM_PUBLISH_ACTION,\n\t\t\t\"Invalid confirmation hash format. Re-run publish preview and use the returned hash.\",\n\t\t)\n\t}\n\n\tconst execution = await prepareActionExecution({\n\t\tctx,\n\t\tpublishStore,\n\t\taction: CONFIRM_PUBLISH_ACTION,\n\t\tpublishToProduction: false,\n\t})\n\n\tif (!isPreparedActionExecution(execution)) return execution\n\n\tconst { prepared, expectedConfirmationHash } = execution\n\tif (confirmationHash !== expectedConfirmationHash) {\n\t\treturn {\n\t\t\taction: CONFIRM_PUBLISH_ACTION,\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: `Publish confirmation hash mismatch.`,\n\t\t\tstagingEnabled: prepared.stagingEnabled,\n\t\t\tconfirmationHash: expectedConfirmationHash,\n\t\t\turls: prepared.urls,\n\t\t\tnextAction: {\n\t\t\t\ttype: CONFIRM_PUBLISH_ACTION,\n\t\t\t\tconfirmationHash: expectedConfirmationHash,\n\t\t\t},\n\t\t}\n\t}\n\n\tconst result = await publishStore.publish({ suppressPublishPopover: true })\n\tif (isPublishError(result)) {\n\t\treturn {\n\t\t\taction: CONFIRM_PUBLISH_ACTION,\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: `Publish failed: ${result.error}`,\n\t\t\tstagingEnabled: prepared.stagingEnabled,\n\t\t\turls: prepared.urls,\n\t\t}\n\t}\n\n\tconst deploymentId = result.deployment.id\n\tconst urls = getPublishUrls(publishStore)\n\tconst published = prepared.stagingEnabled && \"staging\" in urls ? urls.staging : urls.production\n\n\treturn {\n\t\taction: CONFIRM_PUBLISH_ACTION,\n\t\tstatus: \"published\",\n\t\tmessage: prepared.stagingEnabled\n\t\t\t? `Site published to staging (version ${deploymentId}).`\n\t\t\t: `Site published (version ${deploymentId}).`,\n\t\tstagingEnabled: prepared.stagingEnabled,\n\t\tversions: serializePublishVersions(publishStore, result.deployment),\n\t\turls: {\n\t\t\t...urls,\n\t\t\tpublished,\n\t\t},\n\t\tversion: { id: deploymentId },\n\t\tnextAction: prepared.stagingEnabled\n\t\t\t? {\n\t\t\t\t\ttype: DEPLOY_TO_PRODUCTION_ACTION,\n\t\t\t\t\tversion: deploymentId,\n\t\t\t\t}\n\t\t\t: undefined,\n\t}\n}\n\n/** Measures elapsed time and logs the final tool response. */\nasync function measurePublishResponse<T extends PublishToolResult>(cb: () => Promise<T>): Promise<T> {\n\tconst startedAt = performance.now()\n\tconst response = await cb()\n\tlog.debug(\"Tool response: publish\", {\n\t\telapsedMs: Math.round(performance.now() - startedAt),\n\t\tresponse,\n\t})\n\treturn response\n}\n\nfunction getPublishStartMessage(input: PublishInput): string {\n\tswitch (input.action) {\n\t\tcase PREVIEW_ACTION:\n\t\t\treturn \"Preparing publish\"\n\t\tcase DEPLOY_TO_PRODUCTION_ACTION:\n\t\t\treturn \"Deploying to production\"\n\t\tcase CONFIRM_PUBLISH_ACTION:\n\t\t\treturn \"Publishing\"\n\t\tdefault:\n\t\t\tassertNever(input.action, \"Invalid action\")\n\t}\n}\n\nfunction getPublishCompletedMessage(output: PublishToolResult): string {\n\tswitch (output.action) {\n\t\t// oxlint-disable-next-line no-fallthrough\n\t\tcase PREVIEW_ACTION:\n\t\t\tswitch (output.status) {\n\t\t\t\tcase \"ready\":\n\t\t\t\t\treturn \"Publish ready\"\n\t\t\t\tcase \"blocked\":\n\t\t\t\tcase \"failed\":\n\t\t\t\t\treturn \"Publish failed\"\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(output, \"Invalid preview output\")\n\t\t\t}\n\t\t// oxlint-disable-next-line no-fallthrough\n\t\tcase CONFIRM_PUBLISH_ACTION:\n\t\t\tswitch (output.status) {\n\t\t\t\tcase \"published\":\n\t\t\t\t\treturn output.stagingEnabled ? \"Published to staging\" : \"Published site\"\n\t\t\t\tcase \"failed\":\n\t\t\t\t\treturn \"Publish failed\"\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(output, \"Invalid confirm_publish output\")\n\t\t\t}\n\t\t// oxlint-disable-next-line no-fallthrough\n\t\tcase DEPLOY_TO_PRODUCTION_ACTION:\n\t\t\tswitch (output.status) {\n\t\t\t\tcase \"published\":\n\t\t\t\t\treturn \"Deployed production\"\n\t\t\t\tcase \"failed\":\n\t\t\t\t\treturn \"Deploy failed\"\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(output, \"Invalid deploy_to_production output\")\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(output, \"Invalid output\")\n\t}\n}\n\nexport async function executePublish(ctx: AgentContext, input: PublishInput): Promise<PublishToolResult> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required\")\n\n\tconst { publishStore } = engine.stores\n\tswitch (input.action) {\n\t\tcase PREVIEW_ACTION:\n\t\t\treturn executePreviewToolAction({ ctx, publishStore })\n\t\tcase DEPLOY_TO_PRODUCTION_ACTION: {\n\t\t\tconst { version } = PublishDeployRuntimeInputSchema.parse(input)\n\t\t\treturn executeDeployToProductionToolAction({ publishStore, version })\n\t\t}\n\t\tcase CONFIRM_PUBLISH_ACTION: {\n\t\t\tconst { confirmationHash } = PublishConfirmRuntimeInputSchema.parse(input)\n\t\t\treturn executeConfirmPublishToolAction({ ctx, publishStore, confirmationHash })\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(input.action, \"Invalid action\")\n\t}\n}\n\nexport function createPublishTool(\n\tsynchronize: () => Promise<void>,\n\tctx: AgentContext,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: PublishInputSchema,\n\t\t\texecute: async (input: PublishInput) => {\n\t\t\t\tlog.debug(\"Tool called: publish\", input)\n\t\t\t\treturn measurePublishResponse<PublishToolResult>(() => executePublish(ctx, input))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttoolName: PUBLISH_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: input => ({\n\t\t\t\ttype: \"blocking-task\",\n\t\t\t\ttask: \"publish\",\n\t\t\t\tmessage: getPublishStartMessage(input),\n\t\t\t}),\n\t\t\tonComplete: (part, output, _input, completedAt) => ({\n\t\t\t\t...part,\n\t\t\t\tmessage: getPublishCompletedMessage(output),\n\t\t\t\tcompletedAt,\n\t\t\t}),\n\t\t},\n\t)\n}\n", "import { DeploymentStrategy, ProtectedStagingValue } from \"@framerjs/app-shared/src/Deployments.ts\"\nimport type { PublishStore } from \"document/stores/PublishStore.ts\"\n\ninterface PublishUrls {\n\tstaging?: string\n\t/** If staging is protected, the staging URL is only accessible to authenticated users with at least viewer permissions. */\n\tprotectedStaging?: boolean\n\tproduction: string\n}\n\nexport function getPublishUrlsFromPublishStore(publishStore: PublishStore): PublishUrls {\n\tconst stagingEnabled = getStagingEnabled(publishStore)\n\tconst staging = toUrl(publishStore.defaultHostname?.hostname)\n\t// Newly created projects may not have hostnames yet; keep tool responses structured instead of throwing.\n\tconst production = toUrl(publishStore.customHostname?.hostname) ?? staging ?? \"\"\n\n\treturn stagingEnabled && staging\n\t\t? {\n\t\t\t\tstaging,\n\t\t\t\tproduction,\n\t\t\t\tprotectedStaging: publishStore.deploymentSettings?.protectedStaging === ProtectedStagingValue.On,\n\t\t\t}\n\t\t: { production }\n}\n\nfunction toUrl(hostname: string | undefined): string | undefined {\n\tif (!hostname) return\n\treturn `https://${hostname}`\n}\n\nfunction getStagingEnabled(publishStore: PublishStore): boolean {\n\tconst hasCustomDomain = Boolean(publishStore.customHostname && publishStore.customHostnameDeployment)\n\treturn publishStore.deploymentStrategy === DeploymentStrategy.Manual && hasCustomDomain\n}\n", "import { assertNever, getLogger } from \"@framerjs/shared\"\nimport type { JSONValue, ToolResultPart } from \"ai\"\nimport { tool } from \"ai\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { Files } from \"../context/files.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { QUERY_IMAGES_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\nexport type ImageSource = \"unsplash\"\n\nexport const AVAILABLE_IMAGE_SOURCES = ([\"unsplash\"] as const satisfies readonly ImageSource[])\n\t.map(s => escapeValue(`\"${s}\"`))\n\t.join(\", \")\n\nconst DEFAULT_COUNT = 3\nconst MAX_COUNT = 5\n\nconst log = getLogger(\"ai:agents:query-images\")\n\nconst UnsplashImageSourceSchema = z.object({\n\tsource: z.literal(\"unsplash\"),\n\tquery: z.string().describe(\"Natural-language search query describing the desired image.\"),\n\tcount: z.number().max(MAX_COUNT).default(DEFAULT_COUNT).optional().describe(`Number of candidates to return.`),\n\torientation: z\n\t\t.enum([\"landscape\", \"portrait\", \"squarish\"])\n\t\t.optional()\n\t\t.describe(\"Preferred image orientation for the search results.\"),\n\twidth: z\n\t\t.number()\n\t\t.int()\n\t\t.positive()\n\t\t.optional()\n\t\t.describe(\n\t\t\t\"Width in pixels for candidate image urls. Use 2x the width of the frame to be filled for best results on higher resolution displays.\",\n\t\t),\n})\n\nexport const QueryImagesInputSchema = UnsplashImageSourceSchema\n\ntype QueryImagesInput = z.infer<typeof QueryImagesInputSchema>\n\nexport interface ImageCandidate {\n\tid: string\n\tsource: ImageSource\n\turl: string\n\tsmallUrl: string\n\talt: string | null\n\twidth: number\n\theight: number\n\tcolor: string\n}\n\ninterface QueryImagesSuccessResponse {\n\tsource: ImageSource\n\tquery: string\n\tresults: ImageCandidate[]\n}\n\ninterface QueryImagesErrorResponse {\n\tsource: ImageSource\n\tquery: string\n\terror: string\n}\n\ntype QueryImagesResponse = QueryImagesSuccessResponse | QueryImagesErrorResponse\n\nconst UnsplashPhotoSchema = z.object({\n\tid: z.string(),\n\twidth: z.number(),\n\theight: z.number(),\n\tcolor: z.string(),\n\talt_description: z.string().nullish(),\n\tdescription: z.string().nullish(),\n\turls: z.object({\n\t\tfull: z.string(),\n\t\traw: z.string(),\n\t\tregular: z.string(),\n\t\tsmall: z.string(),\n\t\tthumb: z.string(),\n\t}),\n\tuser: z.object({\n\t\tname: z.string(),\n\t\tlinks: z.object({\n\t\t\thtml: z.string(),\n\t\t}),\n\t}),\n})\n\ntype UnsplashPhoto = z.infer<typeof UnsplashPhotoSchema>\n\nconst UnsplashSearchResponseSchema = z.object({\n\tresults: z.array(UnsplashPhotoSchema),\n\ttotal: z.number(),\n})\n\nfunction normalizeCount(count: number | undefined): number {\n\treturn Math.max(1, Math.min(count ?? DEFAULT_COUNT, MAX_COUNT))\n}\n\nfunction toImageCandidate(photo: UnsplashPhoto, width: number | undefined): ImageCandidate {\n\tconst fullUrl = cleanUnsplashUrl(photo.urls.full)\n\tconst isValidWidth = isNumber(width) && width > 0\n\treturn {\n\t\tid: photo.id,\n\t\tsource: \"unsplash\",\n\t\turl: isValidWidth ? addWidthQueryParamToURL(fullUrl, width) : fullUrl,\n\t\tsmallUrl: cleanUnsplashUrl(photo.urls.small),\n\t\talt: photo.alt_description ?? null,\n\t\twidth: photo.width,\n\t\theight: photo.height,\n\t\tcolor: photo.color,\n\t}\n}\n\n/**\n * Removes token hogging tracking params from Unsplash image urls.\n * @param url Unsplash image url e.g. https://images.unsplash.com/photo-1552944114-c4de3ade0cd7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMzc5NjJ8MHwxfHNlYXJjaHwxfHx3ZXMlMjBhbmRlcnNvbiUyMHN5bW1ldHJpY2FsJTIwcGFzdGVsJTIwYXJjaGl0ZWN0dXJlfGVufDB8Mnx8fDE3NzgyNDQzNDh8MA&ixlib=rb-4.1.0&q=80&w=400\n * @returns Cleaned url e.g. https://images.unsplash.com/photo-1552944114-c4de3ade0cd7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixlib=rb-4.1.0&q=80&w=400\n */\nfunction cleanUnsplashUrl(url: string): string {\n\tconst urlObj = new URL(url)\n\turlObj.searchParams.delete(\"ixid\")\n\treturn urlObj.toString()\n}\n\nfunction addWidthQueryParamToURL(url: string, width: number): string {\n\tconst urlObj = new URL(url)\n\turlObj.searchParams.set(\"w\", String(Math.round(width)))\n\treturn urlObj.toString()\n}\n\nasync function searchUnsplash(\n\tquery: string,\n\tcount: number,\n\torientation: \"landscape\" | \"portrait\" | \"squarish\" | undefined,\n\twidth: number | undefined,\n\tfiles: Pick<Files, \"registerTrustedUrl\">,\n): Promise<QueryImagesResponse> {\n\ttry {\n\t\tconst raw = await apiFetcher.get(\"/web/unsplash/search/photos\", {\n\t\t\tquery,\n\t\t\tper_page: count,\n\t\t\torientation,\n\t\t})\n\t\tconst response = UnsplashSearchResponseSchema.parse(raw)\n\n\t\tconst results = response.results.map(photo => {\n\t\t\tconst candidate = toImageCandidate(photo, width)\n\t\t\tfiles.registerTrustedUrl(candidate.url)\n\t\t\tfiles.registerTrustedUrl(candidate.smallUrl)\n\t\t\treturn candidate\n\t\t})\n\t\treturn { source: \"unsplash\", query, results }\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown search error.\"\n\t\tlog.warn(\"query_images unsplash search failed\", { query, error: message })\n\t\treturn { source: \"unsplash\", query, error: message }\n\t}\n}\n\nexport async function executeQueryImages(\n\tinput: QueryImagesInput,\n\tfiles: Pick<Files, \"registerTrustedUrl\">,\n): Promise<QueryImagesResponse> {\n\tswitch (input.source) {\n\t\tcase \"unsplash\": {\n\t\t\tconst count = normalizeCount(input.count)\n\t\t\treturn searchUnsplash(input.query, count, input.orientation, input.width, files)\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(input.source, `Unknown image source: ${input.source}`)\n\t}\n}\n\ntype ToolResultOutput = ToolResultPart[\"output\"]\n\n/**\n * Converts a query-images response into the tool-output format expected by the model. For\n * successful searches we emit multimodal content so vision-capable models can see image thumbnails\n * directly instead of only reading image URLs from JSON.\n */\nexport function getQueryImagesToolResultOutput(response: QueryImagesResponse): ToolResultOutput {\n\tconst smallUrls = \"error\" in response ? [] : response.results.map(r => r.smallUrl)\n\n\tif (smallUrls.length === 0) {\n\t\treturn {\n\t\t\ttype: \"json\",\n\t\t\tvalue: response as unknown as JSONValue,\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"content\",\n\t\tvalue: [\n\t\t\t{ type: \"text\", text: JSON.stringify(response) },\n\t\t\t...smallUrls.map(url => ({ type: \"image-url\" as const, url })),\n\t\t],\n\t}\n}\n\nconst description =\n\t\"Search for images to use on the website. Returns candidate images with preview thumbnails. Use the candidate's `url` field value in `fill` attributes to apply the chosen image.\" as const\n\nexport function createQueryImagesTool(\n\tsynchronize: () => Promise<void>,\n\tfiles: Pick<Files, \"registerTrustedUrl\">,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: QueryImagesInputSchema,\n\t\t\texecute: async input => {\n\t\t\t\tlog.debug(\"Tool called: query_images\", {\n\t\t\t\t\tsource: input.source,\n\t\t\t\t\tquery: input.query,\n\t\t\t\t\torientation: input.orientation,\n\t\t\t\t\twidth: input.width,\n\t\t\t\t})\n\t\t\t\tconst startedAt = performance.now()\n\t\t\t\tconst response = await executeQueryImages(input, files)\n\t\t\t\tconst elapsedMs = Math.round(performance.now() - startedAt)\n\t\t\t\tlog.debug(\"Tool response: query_images\", { elapsedMs, response })\n\t\t\t\treturn response\n\t\t\t},\n\t\t\ttoModelOutput: ({ output }) => getQueryImagesToolResultOutput(output),\n\t\t},\n\t\t{\n\t\t\ttoolName: QUERY_IMAGES_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: () => ({ type: \"blocking-task\", task: \"image-search\" }),\n\t\t\tonComplete: (part, result, _input, completedAt) => {\n\t\t\t\tconst imageUrls = \"error\" in result ? [] : result.results.map(r => r.url)\n\t\t\t\treturn {\n\t\t\t\t\t...part,\n\t\t\t\t\tcompletedAt,\n\t\t\t\t\t...(imageUrls.length > 0 && { metadata: { imageUrls } }),\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t)\n}\n\n/** Used by the Agent evals. */\nexport function createQueryImagesToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: QueryImagesInputSchema,\n\t})\n}\n", "/**!\r\n * FlexSearch.js v0.8.212 (Bundle/Module)\r\n * Author and Copyright: Thomas Wilkerling\r\n * Licence: Apache-2.0\r\n * Hosted by Nextapps GmbH\r\n * https://github.com/nextapps-de/flexsearch\r\n */\nvar w;function H(a,c,b){const e=typeof b,d=typeof a;if(e!==\"undefined\"){if(d!==\"undefined\"){if(b){if(d===\"function\"&&e===d)return function(k){return a(b(k))};c=a.constructor;if(c===b.constructor){if(c===Array)return b.concat(a);if(c===Map){var f=new Map(b);for(var g of a)f.set(g[0],g[1]);return f}if(c===Set){g=new Set(b);for(f of a.values())g.add(f);return g}}}return a}return b}return d===\"undefined\"?c:a}function aa(a,c){return typeof a===\"undefined\"?c:a}function I(){return Object.create(null)}\nfunction M(a){return typeof a===\"string\"}function ba(a){return typeof a===\"object\"}function ca(a,c){if(M(c))a=a[c];else for(let b=0;a&&b<c.length;b++)a=a[c[b]];return a};const ea=/[^\\p{L}\\p{N}]+/u,fa=/(\\d{3})/g,ha=/(\\D)(\\d{3})/g,ia=/(\\d{3})(\\D)/g,ja=/[\\u0300-\\u036f]/g;function ka(a={}){if(!this||this.constructor!==ka)return new ka(...arguments);if(arguments.length)for(a=0;a<arguments.length;a++)this.assign(arguments[a]);else this.assign(a)}w=ka.prototype;\nw.assign=function(a){this.normalize=H(a.normalize,!0,this.normalize);let c=a.include,b=c||a.exclude||a.split,e;if(b||b===\"\"){if(typeof b===\"object\"&&b.constructor!==RegExp){let d=\"\";e=!c;c||(d+=\"\\\\p{Z}\");b.letter&&(d+=\"\\\\p{L}\");b.number&&(d+=\"\\\\p{N}\",e=!!c);b.symbol&&(d+=\"\\\\p{S}\");b.punctuation&&(d+=\"\\\\p{P}\");b.control&&(d+=\"\\\\p{C}\");if(b=b.char)d+=typeof b===\"object\"?b.join(\"\"):b;try{this.split=new RegExp(\"[\"+(c?\"^\":\"\")+d+\"]+\",\"u\")}catch(f){this.split=/\\s+/}}else this.split=b,e=b===!1||\"a1a\".split(b).length<\n2;this.numeric=H(a.numeric,e)}else{try{this.split=H(this.split,ea)}catch(d){this.split=/\\s+/}this.numeric=H(a.numeric,H(this.numeric,!0))}this.prepare=H(a.prepare,null,this.prepare);this.finalize=H(a.finalize,null,this.finalize);b=a.filter;this.filter=typeof b===\"function\"?b:H(b&&new Set(b),null,this.filter);this.dedupe=H(a.dedupe,!0,this.dedupe);this.matcher=H((b=a.matcher)&&new Map(b),null,this.matcher);this.mapper=H((b=a.mapper)&&new Map(b),null,this.mapper);this.stemmer=H((b=a.stemmer)&&new Map(b),\nnull,this.stemmer);this.replacer=H(a.replacer,null,this.replacer);this.minlength=H(a.minlength,1,this.minlength);this.maxlength=H(a.maxlength,1024,this.maxlength);this.rtl=H(a.rtl,!1,this.rtl);if(this.cache=b=H(a.cache,!0,this.cache))this.F=null,this.L=typeof b===\"number\"?b:2E5,this.B=new Map,this.D=new Map,this.I=this.H=128;this.h=\"\";this.J=null;this.A=\"\";this.K=null;if(this.matcher)for(const d of this.matcher.keys())this.h+=(this.h?\"|\":\"\")+d;if(this.stemmer)for(const d of this.stemmer.keys())this.A+=\n(this.A?\"|\":\"\")+d;return this};w.addStemmer=function(a,c){this.stemmer||(this.stemmer=new Map);this.stemmer.set(a,c);this.A+=(this.A?\"|\":\"\")+a;this.K=null;this.cache&&Q(this);return this};w.addFilter=function(a){typeof a===\"function\"?this.filter=a:(this.filter||(this.filter=new Set),this.filter.add(a));this.cache&&Q(this);return this};\nw.addMapper=function(a,c){if(typeof a===\"object\")return this.addReplacer(a,c);if(a.length>1)return this.addMatcher(a,c);this.mapper||(this.mapper=new Map);this.mapper.set(a,c);this.cache&&Q(this);return this};w.addMatcher=function(a,c){if(typeof a===\"object\")return this.addReplacer(a,c);if(a.length<2&&(this.dedupe||this.mapper))return this.addMapper(a,c);this.matcher||(this.matcher=new Map);this.matcher.set(a,c);this.h+=(this.h?\"|\":\"\")+a;this.J=null;this.cache&&Q(this);return this};\nw.addReplacer=function(a,c){if(typeof a===\"string\")return this.addMatcher(a,c);this.replacer||(this.replacer=[]);this.replacer.push(a,c);this.cache&&Q(this);return this};\nw.encode=function(a,c){if(this.cache&&a.length<=this.H)if(this.F){if(this.B.has(a))return this.B.get(a)}else this.F=setTimeout(Q,50,this);this.normalize&&(typeof this.normalize===\"function\"?a=this.normalize(a):a=ja?a.normalize(\"NFKD\").replace(ja,\"\").toLowerCase():a.toLowerCase());this.prepare&&(a=this.prepare(a));this.numeric&&a.length>3&&(a=a.replace(ha,\"$1 $2\").replace(ia,\"$1 $2\").replace(fa,\"$1 \"));const b=!(this.dedupe||this.mapper||this.filter||this.matcher||this.stemmer||this.replacer);let e=\n[],d=I(),f,g,k=this.split||this.split===\"\"?a.split(this.split):[a];for(let l=0,m,p;l<k.length;l++)if((m=p=k[l])&&!(m.length<this.minlength||m.length>this.maxlength)){if(c){if(d[m])continue;d[m]=1}else{if(f===m)continue;f=m}if(b)e.push(m);else if(!this.filter||(typeof this.filter===\"function\"?this.filter(m):!this.filter.has(m))){if(this.cache&&m.length<=this.I)if(this.F){var h=this.D.get(m);if(h||h===\"\"){h&&e.push(h);continue}}else this.F=setTimeout(Q,50,this);if(this.stemmer){this.K||(this.K=new RegExp(\"(?!^)(\"+\nthis.A+\")$\"));let u;for(;u!==m&&m.length>2;)u=m,m=m.replace(this.K,r=>this.stemmer.get(r))}if(m&&(this.mapper||this.dedupe&&m.length>1)){h=\"\";for(let u=0,r=\"\",t,n;u<m.length;u++)t=m.charAt(u),t===r&&this.dedupe||((n=this.mapper&&this.mapper.get(t))||n===\"\"?n===r&&this.dedupe||!(r=n)||(h+=n):h+=r=t);m=h}this.matcher&&m.length>1&&(this.J||(this.J=new RegExp(\"(\"+this.h+\")\",\"g\")),m=m.replace(this.J,u=>this.matcher.get(u)));if(m&&this.replacer)for(h=0;m&&h<this.replacer.length;h+=2)m=m.replace(this.replacer[h],\nthis.replacer[h+1]);this.cache&&p.length<=this.I&&(this.D.set(p,m),this.D.size>this.L&&(this.D.clear(),this.I=this.I/1.1|0));if(m){if(m!==p)if(c){if(d[m])continue;d[m]=1}else{if(g===m)continue;g=m}e.push(m)}}}this.finalize&&(e=this.finalize(e)||e);this.cache&&a.length<=this.H&&(this.B.set(a,e),this.B.size>this.L&&(this.B.clear(),this.H=this.H/1.1|0));return e};function Q(a){a.F=null;a.B.clear();a.D.clear()};function la(a,c,b){b||(c||typeof a!==\"object\"?typeof c===\"object\"&&(b=c,c=0):b=a);b&&(a=b.query||a,c=b.limit||c);let e=\"\"+(c||0);b&&(e+=(b.offset||0)+!!b.context+!!b.suggest+(b.resolve!==!1)+(b.resolution||this.resolution)+(b.boost||0));a=(\"\"+a).toLowerCase();this.cache||(this.cache=new ma);let d=this.cache.get(a+e);if(!d){const f=b&&b.cache;f&&(b.cache=!1);d=this.search(a,c,b);f&&(b.cache=f);this.cache.set(a+e,d)}return d}function ma(a){this.limit=a&&a!==!0?a:1E3;this.cache=new Map;this.h=\"\"}\nma.prototype.set=function(a,c){this.cache.set(this.h=a,c);this.cache.size>this.limit&&this.cache.delete(this.cache.keys().next().value)};ma.prototype.get=function(a){const c=this.cache.get(a);c&&this.h!==a&&(this.cache.delete(a),this.cache.set(this.h=a,c));return c};ma.prototype.remove=function(a){for(const c of this.cache){const b=c[0];c[1].includes(a)&&this.cache.delete(b)}};ma.prototype.clear=function(){this.cache.clear();this.h=\"\"};const na={normalize:!1,numeric:!1,dedupe:!1};const oa={};const ra=new Map([[\"b\",\"p\"],[\"v\",\"f\"],[\"w\",\"f\"],[\"z\",\"s\"],[\"x\",\"s\"],[\"d\",\"t\"],[\"n\",\"m\"],[\"c\",\"k\"],[\"g\",\"k\"],[\"j\",\"k\"],[\"q\",\"k\"],[\"i\",\"e\"],[\"y\",\"e\"],[\"u\",\"o\"]]);const sa=new Map([[\"ae\",\"a\"],[\"oe\",\"o\"],[\"sh\",\"s\"],[\"kh\",\"k\"],[\"th\",\"t\"],[\"ph\",\"f\"],[\"pf\",\"f\"]]),ta=[/([^aeo])h(.)/g,\"$1$2\",/([aeo])h([^aeo]|$)/g,\"$1$2\",/(.)\\1+/g,\"$1\"];const ua={a:\"\",e:\"\",i:\"\",o:\"\",u:\"\",y:\"\",b:1,f:1,p:1,v:1,c:2,g:2,j:2,k:2,q:2,s:2,x:2,z:2,\"\\u00df\":2,d:3,t:3,l:4,m:5,n:5,r:6};var va={Exact:na,Default:oa,Normalize:oa,LatinBalance:{mapper:ra},LatinAdvanced:{mapper:ra,matcher:sa,replacer:ta},LatinExtra:{mapper:ra,replacer:ta.concat([/(?!^)[aeo]/g,\"\"]),matcher:sa},LatinSoundex:{dedupe:!1,include:{letter:!0},finalize:function(a){for(let b=0;b<a.length;b++){var c=a[b];let e=c.charAt(0),d=ua[e];for(let f=1,g;f<c.length&&(g=c.charAt(f),g===\"h\"||g===\"w\"||!(g=ua[g])||g===d||(e+=g,d=g,e.length!==4));f++);a[b]=e}}},CJK:{split:\"\"},LatinExact:na,LatinDefault:oa,LatinSimple:oa};function wa(a,c,b,e){let d=[];for(let f=0,g;f<a.index.length;f++)if(g=a.index[f],c>=g.length)c-=g.length;else{c=g[e?\"splice\":\"slice\"](c,b);const k=c.length;if(k&&(d=d.length?d.concat(c):c,b-=k,e&&(a.length-=k),!b))break;c=0}return d}\nfunction xa(a){if(!this||this.constructor!==xa)return new xa(a);this.index=a?[a]:[];this.length=a?a.length:0;const c=this;return new Proxy([],{get(b,e){if(e===\"length\")return c.length;if(e===\"push\")return function(d){c.index[c.index.length-1].push(d);c.length++};if(e===\"pop\")return function(){if(c.length)return c.length--,c.index[c.index.length-1].pop()};if(e===\"indexOf\")return function(d){let f=0;for(let g=0,k,h;g<c.index.length;g++){k=c.index[g];h=k.indexOf(d);if(h>=0)return f+h;f+=k.length}return-1};\nif(e===\"includes\")return function(d){for(let f=0;f<c.index.length;f++)if(c.index[f].includes(d))return!0;return!1};if(e===\"slice\")return function(d,f){return wa(c,d||0,f||c.length,!1)};if(e===\"splice\")return function(d,f){return wa(c,d||0,f||c.length,!0)};if(e===\"constructor\")return Array;if(typeof e!==\"symbol\")return(b=c.index[e/2**31|0])&&b[e]},set(b,e,d){b=e/2**31|0;(c.index[b]||(c.index[b]=[]))[e]=d;c.length++;return!0}})}xa.prototype.clear=function(){this.index.length=0};xa.prototype.push=function(){};\nfunction R(a=8){if(!this||this.constructor!==R)return new R(a);this.index=I();this.h=[];this.size=0;a>32?(this.B=Aa,this.A=BigInt(a)):(this.B=Ba,this.A=a)}R.prototype.get=function(a){const c=this.index[this.B(a)];return c&&c.get(a)};R.prototype.set=function(a,c){var b=this.B(a);let e=this.index[b];e?(b=e.size,e.set(a,c),(b-=e.size)&&this.size++):(this.index[b]=e=new Map([[a,c]]),this.h.push(e),this.size++)};\nfunction S(a=8){if(!this||this.constructor!==S)return new S(a);this.index=I();this.h=[];this.size=0;a>32?(this.B=Aa,this.A=BigInt(a)):(this.B=Ba,this.A=a)}S.prototype.add=function(a){var c=this.B(a);let b=this.index[c];b?(c=b.size,b.add(a),(c-=b.size)&&this.size++):(this.index[c]=b=new Set([a]),this.h.push(b),this.size++)};w=R.prototype;w.has=S.prototype.has=function(a){const c=this.index[this.B(a)];return c&&c.has(a)};\nw.delete=S.prototype.delete=function(a){const c=this.index[this.B(a)];c&&c.delete(a)&&this.size--};w.clear=S.prototype.clear=function(){this.index=I();this.h=[];this.size=0};w.values=S.prototype.values=function*(){for(let a=0;a<this.h.length;a++)for(let c of this.h[a].values())yield c};w.keys=S.prototype.keys=function*(){for(let a=0;a<this.h.length;a++)for(let c of this.h[a].keys())yield c};w.entries=S.prototype.entries=function*(){for(let a=0;a<this.h.length;a++)for(let c of this.h[a].entries())yield c};\nfunction Ba(a){let c=2**this.A-1;if(typeof a==\"number\")return a&c;let b=0,e=this.A+1;for(let d=0;d<a.length;d++)b=(b*e^a.charCodeAt(d))&c;return this.A===32?b+2**31:b}function Aa(a){let c=BigInt(2)**this.A-BigInt(1);var b=typeof a;if(b===\"bigint\")return a&c;if(b===\"number\")return BigInt(a)&c;b=BigInt(0);let e=this.A+BigInt(1);for(let d=0;d<a.length;d++)b=(b*e^BigInt(a.charCodeAt(d)))&c;return b};let Ca,Da;\nasync function Ea(a){a=a.data;var c=a.task;const b=a.id;let e=a.args;switch(c){case \"init\":Da=a.options||{};(c=a.factory)?(Function(\"return \"+c)()(self),Ca=new self.FlexSearch.Index(Da),delete self.FlexSearch):Ca=new T(Da);postMessage({id:b});break;default:let d;c===\"export\"&&(e[1]?(e[0]=Da.export,e[2]=0,e[3]=1):e=null);c===\"import\"?e[0]&&(a=await Da.import.call(Ca,e[0]),Ca.import(e[0],a)):((d=e&&Ca[c].apply(Ca,e))&&d.then&&(d=await d),d&&d.await&&(d=await d.await),c===\"search\"&&d.result&&(d=d.result));\npostMessage(c===\"search\"?{id:b,msg:d}:{id:b})}};function Fa(a){Ga.call(a,\"add\");Ga.call(a,\"append\");Ga.call(a,\"search\");Ga.call(a,\"update\");Ga.call(a,\"remove\");Ga.call(a,\"searchCache\")}let Ha,Ia,Ja;function Ka(){Ha=Ja=0}\nfunction Ga(a){this[a+\"Async\"]=function(){const c=arguments;var b=c[c.length-1];let e;typeof b===\"function\"&&(e=b,delete c[c.length-1]);Ha?Ja||(Ja=Date.now()-Ia>=this.priority*this.priority*3):(Ha=setTimeout(Ka,0),Ia=Date.now());if(Ja){const f=this;return new Promise(g=>{setTimeout(function(){g(f[a+\"Async\"].apply(f,c))},0)})}const d=this[a].apply(this,c);b=d.then?d:new Promise(f=>f(d));e&&b.then(e);return b}};let V=0;\nfunction La(a={},c){function b(k){function h(l){l=l.data||l;const m=l.id,p=m&&f.h[m];p&&(p(l.msg),delete f.h[m])}this.worker=k;this.h=I();if(this.worker){d?this.worker.on(\"message\",h):this.worker.onmessage=h;if(a.config)return new Promise(function(l){V>1E9&&(V=0);f.h[++V]=function(){l(f)};f.worker.postMessage({id:V,task:\"init\",factory:e,options:a})});this.priority=a.priority||4;this.encoder=c||null;this.worker.postMessage({task:\"init\",factory:e,options:a});return this}}if(!this||this.constructor!==La)return new La(a);\nlet e=typeof self!==\"undefined\"?self._factory:typeof window!==\"undefined\"?window._factory:null;e&&(e=e.toString());const d=typeof window===\"undefined\",f=this,g=Ma(e,d,a.worker);return g.then?g.then(function(k){return b.call(f,k)}):b.call(this,g)}W(\"add\");W(\"append\");W(\"search\");W(\"update\");W(\"remove\");W(\"clear\");W(\"export\");W(\"import\");La.prototype.searchCache=la;Fa(La.prototype);\nfunction W(a){La.prototype[a]=function(){const c=this,b=[].slice.call(arguments);var e=b[b.length-1];let d;typeof e===\"function\"&&(d=e,b.pop());e=new Promise(function(f){a===\"export\"&&typeof b[0]===\"function\"&&(b[0]=null);V>1E9&&(V=0);c.h[++V]=f;c.worker.postMessage({task:a,id:V,args:b})});return d?(e.then(d),this):e}}\nfunction Ma(a,c,b){return c?typeof module!==\"undefined\"?new(require(\"worker_threads\")[\"Worker\"])(__dirname+\"/worker/node.js\"):import(\"worker_threads\").then(function(worker){return new worker[\"Worker\"](import.meta.dirname+\"/node/node.mjs\")}):a?new window.Worker(URL.createObjectURL(new Blob([\"onmessage=\"+Ea.toString()],{type:\"text/javascript\"}))):new window.Worker(typeof b===\"string\"?b:import.meta.url.replace(\"/worker.js\",\"/worker/worker.js\").replace(\"flexsearch.bundle.module.min.js\",\n\"module/worker/worker.js\").replace(\"flexsearch.bundle.module.min.mjs\",\"module/worker/worker.js\"),{type:\"module\"})};Na.prototype.add=function(a,c,b){ba(a)&&(c=a,a=ca(c,this.key));if(c&&(a||a===0)){if(!b&&this.reg.has(a))return this.update(a,c);for(let k=0,h;k<this.field.length;k++){h=this.B[k];var e=this.index.get(this.field[k]);if(typeof h===\"function\"){var d=h(c);d&&e.add(a,d,b,!0)}else if(d=h.G,!d||d(c))h.constructor===String?h=[\"\"+h]:M(h)&&(h=[h]),Qa(c,h,this.D,0,e,a,h[0],b)}if(this.tag)for(e=0;e<this.A.length;e++){var f=this.A[e];d=this.tag.get(this.F[e]);let k=I();if(typeof f===\"function\"){if(f=f(c),!f)continue}else{var g=\nf.G;if(g&&!g(c))continue;f.constructor===String&&(f=\"\"+f);f=ca(c,f)}if(d&&f){M(f)&&(f=[f]);for(let h=0,l,m;h<f.length;h++)if(l=f[h],!k[l]&&(k[l]=1,(g=d.get(l))?m=g:d.set(l,m=[]),!b||!m.includes(a))){if(m.length===2**31-1){g=new xa(m);if(this.fastupdate)for(let p of this.reg.values())p.includes(m)&&(p[p.indexOf(m)]=g);d.set(l,m=g)}m.push(a);this.fastupdate&&((g=this.reg.get(a))?g.push(m):this.reg.set(a,[m]))}}}if(this.store&&(!b||!this.store.has(a))){let k;if(this.h){k=I();for(let h=0,l;h<this.h.length;h++){l=\nthis.h[h];if((b=l.G)&&!b(c))continue;let m;if(typeof l===\"function\"){m=l(c);if(!m)continue;l=[l.O]}else if(M(l)||l.constructor===String){k[l]=c[l];continue}Ra(c,k,l,0,l[0],m)}}this.store.set(a,k||c)}this.worker&&(this.fastupdate||this.reg.add(a))}return this};function Ra(a,c,b,e,d,f){a=a[d];if(e===b.length-1)c[d]=f||a;else if(a)if(a.constructor===Array)for(c=c[d]=Array(a.length),d=0;d<a.length;d++)Ra(a,c,b,e,d);else c=c[d]||(c[d]=I()),d=b[++e],Ra(a,c,b,e,d)}\nfunction Qa(a,c,b,e,d,f,g,k){if(a=a[g])if(e===c.length-1){if(a.constructor===Array){if(b[e]){for(c=0;c<a.length;c++)d.add(f,a[c],!0,!0);return}a=a.join(\" \")}d.add(f,a,k,!0)}else if(a.constructor===Array)for(g=0;g<a.length;g++)Qa(a,c,b,e,d,f,g,k);else g=c[++e],Qa(a,c,b,e,d,f,g,k)};function Sa(a,c,b,e){if(!a.length)return a;if(a.length===1)return a=a[0],a=b||a.length>c?a.slice(b,b+c):a,e?Ta.call(this,a):a;let d=[];for(let f=0,g,k;f<a.length;f++)if((g=a[f])&&(k=g.length)){if(b){if(b>=k){b-=k;continue}g=g.slice(b,b+c);k=g.length;b=0}k>c&&(g=g.slice(0,c),k=c);if(!d.length&&k>=c)return e?Ta.call(this,g):g;d.push(g);c-=k;if(!c)break}d=d.length>1?[].concat.apply([],d):d[0];return e?Ta.call(this,d):d};function Ua(a,c,b,e){var d=e[0];if(d[0]&&d[0].query)return a[c].apply(a,d);if(!(c!==\"and\"&&c!==\"not\"||a.result.length||a.await||d.suggest))return e.length>1&&(d=e[e.length-1]),(e=d.resolve)?a.await||a.result:a;let f=[],g=0,k=0,h,l,m,p,u;for(c=0;c<e.length;c++)if(d=e[c]){var r=void 0;if(d.constructor===X)r=d.await||d.result;else if(d.then||d.constructor===Array)r=d;else{g=d.limit||0;k=d.offset||0;m=d.suggest;l=d.resolve;h=((p=d.highlight||a.highlight)||d.enrich)&&l;r=d.queue;let t=d.async||r,n=d.index,\nq=d.query;n?a.index||(a.index=n):n=a.index;if(q||d.tag){const x=d.field||d.pluck;x&&(!q||a.query&&!p||(a.query=q,a.field=x,a.highlight=p),n=n.index.get(x));if(r&&(u||a.await)){u=1;let v;const A=a.C.length,D=new Promise(function(F){v=F});(function(F,E){D.h=function(){E.index=null;E.resolve=!1;let B=t?F.searchAsync(E):F.search(E);if(B.then)return B.then(function(z){a.C[A]=z=z.result||z;v(z);return z});B=B.result||B;v(B);return B}})(n,Object.assign({},d));a.C.push(D);f[c]=D;continue}else d.resolve=!1,\nd.index=null,r=t?n.searchAsync(d):n.search(d),d.resolve=l,d.index=n}else if(d.and)r=Va(d,\"and\",n);else if(d.or)r=Va(d,\"or\",n);else if(d.not)r=Va(d,\"not\",n);else if(d.xor)r=Va(d,\"xor\",n);else continue}r.await?(u=1,r=r.await):r.then?(u=1,r=r.then(function(t){return t.result||t})):r=r.result||r;f[c]=r}u&&!a.await&&(a.await=new Promise(function(t){a.return=t}));if(u){const t=Promise.all(f).then(function(n){for(let q=0;q<a.C.length;q++)if(a.C[q]===t){a.C[q]=function(){return b.call(a,n,g,k,h,l,m,p)};break}Wa(a)});\na.C.push(t)}else if(a.await)a.C.push(function(){return b.call(a,f,g,k,h,l,m,p)});else return b.call(a,f,g,k,h,l,m,p);return l?a.await||a.result:a}function Va(a,c,b){a=a[c];const e=a[0]||a;e.index||(e.index=b);b=new X(e);a.length>1&&(b=b[c].apply(b,a.slice(1)));return b};X.prototype.or=function(){return Ua(this,\"or\",Xa,arguments)};function Xa(a,c,b,e,d,f,g){a.length&&(this.result.length&&a.push(this.result),a.length<2?this.result=a[0]:(this.result=Ya(a,c,b,!1,this.h),b=0));d&&(this.await=null);return d?this.resolve(c,b,e,g):this};X.prototype.and=function(){return Ua(this,\"and\",Za,arguments)};function Za(a,c,b,e,d,f,g){if(!f&&!this.result.length)return d?this.result:this;let k;if(a.length)if(this.result.length&&a.unshift(this.result),a.length<2)this.result=a[0];else{let h=0;for(let l=0,m,p;l<a.length;l++)if((m=a[l])&&(p=m.length))h<p&&(h=p);else if(!f){h=0;break}h?(this.result=$a(a,h,c,b,f,this.h,d),k=!0):this.result=[]}else f||(this.result=a);d&&(this.await=null);return d?this.resolve(c,b,e,g,k):this};X.prototype.xor=function(){return Ua(this,\"xor\",ab,arguments)};\nfunction ab(a,c,b,e,d,f,g){if(a.length)if(this.result.length&&a.unshift(this.result),a.length<2)this.result=a[0];else{a:{f=b;var k=this.h;const h=[],l=I();let m=0;for(let p=0,u;p<a.length;p++)if(u=a[p]){m<u.length&&(m=u.length);for(let r=0,t;r<u.length;r++)if(t=u[r])for(let n=0,q;n<t.length;n++)q=t[n],l[q]=l[q]?2:1}for(let p=0,u,r=0;p<m;p++)for(let t=0,n;t<a.length;t++)if(n=a[t])if(u=n[p])for(let q=0,x;q<u.length;q++)if(x=u[q],l[x]===1)if(f)f--;else if(d){if(h.push(x),h.length===c){a=h;break a}}else{const v=\np+(t?k:0);h[v]||(h[v]=[]);h[v].push(x);if(++r===c){a=h;break a}}a=h}this.result=a;k=!0}else f||(this.result=a);d&&(this.await=null);return d?this.resolve(c,b,e,g,k):this};X.prototype.not=function(){return Ua(this,\"not\",bb,arguments)};\nfunction bb(a,c,b,e,d,f,g){if(!f&&!this.result.length)return d?this.result:this;if(a.length&&this.result.length){a:{f=b;var k=[];a=new Set(a.flat().flat());for(let h=0,l,m=0;h<this.result.length;h++)if(l=this.result[h])for(let p=0,u;p<l.length;p++)if(u=l[p],!a.has(u))if(f)f--;else if(d){if(k.push(u),k.length===c){a=k;break a}}else if(k[h]||(k[h]=[]),k[h].push(u),++m===c){a=k;break a}a=k}this.result=a;k=!0}d&&(this.await=null);return d?this.resolve(c,b,e,g,k):this};function cb(a,c,b,e,d){let f,g,k;typeof d===\"string\"?(f=d,d=\"\"):f=d.template;g=f.indexOf(\"$1\");k=f.substring(g+2);g=f.substring(0,g);let h=d&&d.boundary,l=!d||d.clip!==!1,m=d&&d.merge&&k&&g&&new RegExp(k+\" \"+g,\"g\");d=d&&d.ellipsis;var p=0;if(typeof d===\"object\"){var u=d.template;p=u.length-2;d=d.pattern}typeof d!==\"string\"&&(d=d===!1?\"\":\"...\");p&&(d=u.replace(\"$1\",d));u=d.length-p;let r,t;typeof h===\"object\"&&(r=h.before,r===0&&(r=-1),t=h.after,t===0&&(t=-1),h=h.total||9E5);p=new Map;for(let Oa=0,\nda,db,pa;Oa<c.length;Oa++){let qa;if(e)qa=c,pa=e;else{var n=c[Oa];pa=n.field;if(!pa)continue;qa=n.result}db=b.get(pa);da=db.encoder;n=p.get(da);typeof n!==\"string\"&&(n=da.encode(a),p.set(da,n));for(let ya=0;ya<qa.length;ya++){var q=qa[ya].doc;if(!q)continue;q=ca(q,pa);if(!q)continue;var x=q.trim().split(/\\s+/);if(!x.length)continue;q=\"\";var v=[];let za=[];var A=-1,D=-1,F=0;for(var E=0;E<x.length;E++){var B=x[E],z=da.encode(B);z=z.length>1?z.join(\" \"):z[0];let y;if(z&&B){var C=B.length,J=(da.split?\nB.replace(da.split,\"\"):B).length-z.length,G=\"\",N=0;for(var O=0;O<n.length;O++){var P=n[O];if(P){var L=P.length;L+=J<0?0:J;N&&L<=N||(P=z.indexOf(P),P>-1&&(G=(P?B.substring(0,P):\"\")+g+B.substring(P,P+L)+k+(P+L<C?B.substring(P+L):\"\"),N=L,y=!0))}}G&&(h&&(A<0&&(A=q.length+(q?1:0)),D=q.length+(q?1:0)+G.length,F+=C,za.push(v.length),v.push({match:G})),q+=(q?\" \":\"\")+G)}if(!y)B=x[E],q+=(q?\" \":\"\")+B,h&&v.push({text:B});else if(h&&F>=h)break}F=za.length*(f.length-2);if(r||t||h&&q.length-F>h)if(F=h+F-u*2,E=D-\nA,r>0&&(E+=r),t>0&&(E+=t),E<=F)x=r?A-(r>0?r:0):A-((F-E)/2|0),v=t?D+(t>0?t:0):x+F,l||(x>0&&q.charAt(x)!==\" \"&&q.charAt(x-1)!==\" \"&&(x=q.indexOf(\" \",x),x<0&&(x=0)),v<q.length&&q.charAt(v-1)!==\" \"&&q.charAt(v)!==\" \"&&(v=q.lastIndexOf(\" \",v),v<D?v=D:++v)),q=(x?d:\"\")+q.substring(x,v)+(v<q.length?d:\"\");else{D=[];A={};F={};E={};B={};z={};G=J=C=0;for(O=N=1;;){var U=void 0;for(let y=0,K;y<za.length;y++){K=za[y];if(G)if(J!==G){if(E[y+1])continue;K+=G;if(A[K]){C-=u;F[y+1]=1;E[y+1]=1;continue}if(K>=v.length-\n1){if(K>=v.length){E[y+1]=1;K>=x.length&&(F[y+1]=1);continue}C-=u}q=v[K].text;if(L=t&&z[y])if(L>0){if(q.length>L)if(E[y+1]=1,l)q=q.substring(0,L);else continue;(L-=q.length)||(L=-1);z[y]=L}else{E[y+1]=1;continue}if(C+q.length+1<=h)q=\" \"+q,D[y]+=q;else if(l)U=h-C-1,U>0&&(q=\" \"+q.substring(0,U),D[y]+=q),E[y+1]=1;else{E[y+1]=1;continue}}else{if(E[y])continue;K-=J;if(A[K]){C-=u;E[y]=1;F[y]=1;continue}if(K<=0){if(K<0){E[y]=1;F[y]=1;continue}C-=u}q=v[K].text;if(L=r&&B[y])if(L>0){if(q.length>L)if(E[y]=1,\nl)q=q.substring(q.length-L);else continue;(L-=q.length)||(L=-1);B[y]=L}else{E[y]=1;continue}if(C+q.length+1<=h)q+=\" \",D[y]=q+D[y];else if(l)U=q.length+1-(h-C),U>=0&&U<q.length&&(q=q.substring(U)+\" \",D[y]=q+D[y]),E[y]=1;else{E[y]=1;continue}}else{q=v[K].match;r&&(B[y]=r);t&&(z[y]=t);y&&C++;let Pa;K?!y&&u&&(C+=u):(F[y]=1,E[y]=1);K>=x.length-1?Pa=1:K<v.length-1&&v[K+1].match?Pa=1:u&&(C+=u);C-=f.length-2;if(!y||C+q.length<=h)D[y]=q;else{U=N=O=F[y]=0;break}Pa&&(F[y+1]=1,E[y+1]=1)}C+=q.length;U=A[K]=1}if(U)J===\nG?G++:J++;else{J===G?N=0:O=0;if(!N&&!O)break;N?(J++,G=J):G++}}q=\"\";for(let y=0,K;y<D.length;y++)K=(F[y]?y?\" \":\"\":(y&&!d?\" \":\"\")+d)+D[y],q+=K;d&&!F[D.length]&&(q+=d)}m&&(q=q.replace(m,\" \"));qa[ya].highlight=q}if(e)break}return c};function X(a,c){if(!this||this.constructor!==X)return new X(a,c);let b=0,e,d,f,g,k,h;if(a&&a.index){const l=a;c=l.index;b=l.boost||0;if(d=l.query){f=l.field||l.pluck;g=l.highlight;const m=l.resolve;a=l.async||l.queue;l.resolve=!1;l.index=null;a=a?c.searchAsync(l):c.search(l);l.resolve=m;l.index=c;a=a.result||a}else a=[]}if(a&&a.then){const l=this;a=a.then(function(m){l.C[0]=l.result=m.result||m;Wa(l)});e=[a];a=[];k=new Promise(function(m){h=m})}this.index=c||null;this.result=a||[];this.h=b;this.C=\ne||[];this.await=k||null;this.return=h||null;this.highlight=g||null;this.query=d||\"\";this.field=f||\"\"}w=X.prototype;w.limit=function(a){if(this.await){const c=this;this.C.push(function(){return c.limit(a).result})}else if(this.result.length){const c=[];for(let b=0,e;b<this.result.length;b++)if(e=this.result[b])if(e.length<=a){if(c[b]=e,a-=e.length,!a)break}else{c[b]=e.slice(0,a);break}this.result=c}return this};\nw.offset=function(a){if(this.await){const c=this;this.C.push(function(){return c.offset(a).result})}else if(this.result.length){const c=[];for(let b=0,e;b<this.result.length;b++)if(e=this.result[b])e.length<=a?a-=e.length:(c[b]=e.slice(a),a=0);this.result=c}return this};w.boost=function(a){if(this.await){const c=this;this.C.push(function(){return c.boost(a).result})}else this.h+=a;return this};\nfunction Wa(a,c){let b=a.result;var e=a.await;a.await=null;for(let d=0,f;d<a.C.length;d++)if(f=a.C[d])if(typeof f===\"function\")b=f(),a.C[d]=b=b.result||b,d--;else if(f.h)b=f.h(),a.C[d]=b=b.result||b,d--;else if(f.then)return a.await=e;e=a.return;a.C=[];a.return=null;c||e(b);return b}\nw.resolve=function(a,c,b,e,d){let f=this.await?Wa(this,!0):this.result;if(f.then){const g=this;return f.then(function(){return g.resolve(a,c,b,e,d)})}f.length&&(typeof a===\"object\"?(e=a.highlight||this.highlight,b=!!e||a.enrich,c=a.offset,a=a.limit):(e=e||this.highlight,b=!!e||b),f=d?b?Ta.call(this.index,f):f:Sa.call(this.index,f,a||100,c,b));return this.finalize(f,e)};\nw.finalize=function(a,c){if(a.then){const e=this;return a.then(function(d){return e.finalize(d,c)})}c&&a.length&&this.query&&(a=cb(this.query,a,this.index.index,this.field,c));const b=this.return;this.highlight=this.index=this.result=this.C=this.await=this.return=null;this.query=this.field=\"\";b&&b(a);return a};function $a(a,c,b,e,d,f,g){const k=a.length;let h=[],l,m;l=I();for(let p=0,u,r,t,n;p<c;p++)for(let q=0;q<k;q++)if(t=a[q],p<t.length&&(u=t[p]))for(let x=0;x<u.length;x++){r=u[x];(m=l[r])?l[r]++:(m=0,l[r]=1);n=h[m]||(h[m]=[]);if(!g){let v=p+(q||!d?0:f||0);n=n[v]||(n[v]=[])}n.push(r);if(g&&b&&m===k-1&&n.length-e===b)return e?n.slice(e):n}if(a=h.length)if(d)h=h.length>1?Ya(h,b,e,g,f):(h=h[0])&&b&&h.length>b||e?h.slice(e,b+e):h;else{if(a<k)return[];h=h[a-1];if(b||e)if(g){if(h.length>b||e)h=h.slice(e,b+\ne)}else{d=[];for(let p=0,u;p<h.length;p++)if(u=h[p])if(e&&u.length>e)e-=u.length;else{if(b&&u.length>b||e)u=u.slice(e,b+e),b-=u.length,e&&(e-=u.length);d.push(u);if(!b)break}h=d}}return h}\nfunction Ya(a,c,b,e,d){const f=[],g=I();let k;var h=a.length;let l;if(e)for(d=h-1;d>=0;d--){if(l=(e=a[d])&&e.length)for(h=0;h<l;h++)if(k=e[h],!g[k])if(g[k]=1,b)b--;else if(f.push(k),f.length===c)return f}else for(let m=h-1,p,u=0;m>=0;m--){p=a[m];for(let r=0;r<p.length;r++)if(l=(e=p[r])&&e.length)for(let t=0;t<l;t++)if(k=e[t],!g[k])if(g[k]=1,b)b--;else{let n=(r+(m<h-1?d||0:0))/(m+1)|0;(f[n]||(f[n]=[])).push(k);if(++u===c)return f}}return f}\nfunction eb(a,c,b,e,d){const f=I(),g=[];for(let k=0,h;k<c.length;k++){h=c[k];for(let l=0;l<h.length;l++)f[h[l]]=1}if(d)for(let k=0,h;k<a.length;k++){if(h=a[k],f[h])if(e)e--;else if(g.push(h),f[h]=0,b&&--b===0)break}else for(let k=0,h,l;k<a.result.length;k++)for(h=a.result[k],c=0;c<h.length;c++)l=h[c],f[l]&&((g[k]||(g[k]=[])).push(l),f[l]=0);return g};I();Na.prototype.search=function(a,c,b,e){b||(!c&&ba(a)?(b=a,a=\"\"):ba(c)&&(b=c,c=0));let d=[];var f=[];let g;let k,h,l,m,p;let u=0,r=!0,t;if(b){b.constructor===Array&&(b={index:b});a=b.query||a;g=b.pluck;k=b.merge;l=b.boost;p=g||b.field||(p=b.index)&&(p.index?null:p);var n=this.tag&&b.tag;h=b.suggest;r=b.resolve!==!1;m=b.cache;t=r&&this.store&&b.highlight;var q=!!t||r&&this.store&&b.enrich;c=b.limit||c;var x=b.offset||0;c||(c=r?100:0);if(n&&(!this.db||!e)){n.constructor!==Array&&(n=[n]);var v=[];for(let B=\n0,z;B<n.length;B++)if(z=n[B],z.field&&z.tag){var A=z.tag;if(A.constructor===Array)for(var D=0;D<A.length;D++)v.push(z.field,A[D]);else v.push(z.field,A)}else{A=Object.keys(z);for(let C=0,J,G;C<A.length;C++)if(J=A[C],G=z[J],G.constructor===Array)for(D=0;D<G.length;D++)v.push(J,G[D]);else v.push(J,G)}n=v;if(!a){f=[];if(v.length)for(n=0;n<v.length;n+=2){if(this.db){e=this.index.get(v[n]);if(!e)continue;f.push(e=e.db.tag(v[n+1],c,x,q))}else e=fb.call(this,v[n],v[n+1],c,x,q);d.push(r?{field:v[n],tag:v[n+\n1],result:e}:[e])}if(f.length){const B=this;return Promise.all(f).then(function(z){for(let C=0;C<z.length;C++)r?d[C].result=z[C]:d[C]=z[C];return r?d:new X(d.length>1?$a(d,1,0,0,h,l):d[0],B)})}return r?d:new X(d.length>1?$a(d,1,0,0,h,l):d[0],this)}}r||g||!(p=p||this.field)||(M(p)?g=p:(p.constructor===Array&&p.length===1&&(p=p[0]),g=p.field||p.index));p&&p.constructor!==Array&&(p=[p])}p||(p=this.field);let F;v=(this.worker||this.db)&&!e&&[];for(let B=0,z,C,J;B<p.length;B++){C=p[B];if(this.db&&this.tag&&\n!this.B[B])continue;let G;M(C)||(G=C,C=G.field,a=G.query||a,c=aa(G.limit,c),x=aa(G.offset,x),h=aa(G.suggest,h),t=r&&this.store&&aa(G.highlight,t),q=!!t||r&&this.store&&aa(G.enrich,q),m=aa(G.cache,m));if(e)z=e[B];else{A=G||b||{};D=A.enrich;var E=this.index.get(C);n&&(this.db&&(A.tag=n,A.field=p,F=E.db.support_tag_search),!F&&D&&(A.enrich=!1),F||(A.limit=0,A.offset=0));z=m?E.searchCache(a,n&&!F?0:c,A):E.search(a,n&&!F?0:c,A);n&&!F&&(A.limit=c,A.offset=x);D&&(A.enrich=D);if(v){v[B]=z;continue}}J=(z=\nz.result||z)&&z.length;if(n&&J){A=[];D=0;if(this.db&&e){if(!F)for(E=p.length;E<e.length;E++){let N=e[E];if(N&&N.length)D++,A.push(N);else if(!h)return r?d:new X(d,this)}}else for(let N=0,O,P;N<n.length;N+=2){O=this.tag.get(n[N]);if(!O)if(h)continue;else return r?d:new X(d,this);if(P=(O=O&&O.get(n[N+1]))&&O.length)D++,A.push(O);else if(!h)return r?d:new X(d,this)}if(D){z=eb(z,A,c,x,r);J=z.length;if(!J&&!h)return r?z:new X(z,this);D--}}if(J)f[u]=C,d.push(z),u++;else if(p.length===1)return r?d:new X(d,\nthis)}if(v){if(this.db&&n&&n.length&&!F)for(q=0;q<n.length;q+=2){f=this.index.get(n[q]);if(!f)if(h)continue;else return r?d:new X(d,this);v.push(f.db.tag(n[q+1],c,x,!1))}const B=this;return Promise.all(v).then(function(z){b&&(b.resolve=r);z.length&&(z=B.search(a,c,b,z));return z})}if(!u)return r?d:new X(d,this);if(g&&(!q||!this.store))return d=d[0],r?d:new X(d,this);v=[];for(x=0;x<f.length;x++){n=d[x];q&&n.length&&typeof n[0].doc===\"undefined\"&&(this.db?v.push(n=this.index.get(this.field[0]).db.enrich(n)):\nn=Ta.call(this,n));if(g)return r?t?cb(a,n,this.index,g,t):n:new X(n,this);d[x]={field:f[x],result:n}}if(q&&this.db&&v.length){const B=this;return Promise.all(v).then(function(z){for(let C=0;C<z.length;C++)d[C].result=z[C];t&&(d=cb(a,d,B.index,g,t));return k?gb(d):d})}t&&(d=cb(a,d,this.index,g,t));return k?gb(d):d};\nfunction gb(a){const c=[],b=I(),e=I();for(let d=0,f,g,k,h,l,m,p;d<a.length;d++){f=a[d];g=f.field;k=f.result;for(let u=0;u<k.length;u++)if(l=k[u],typeof l!==\"object\"?l={id:h=l}:h=l.id,(m=b[h])?m.push(g):(l.field=b[h]=[g],c.push(l)),p=l.highlight)m=e[h],m||(e[h]=m={},l.highlight=m),m[g]=p}return c}function fb(a,c,b,e,d){a=this.tag.get(a);if(!a)return[];a=a.get(c);if(!a)return[];c=a.length-e;if(c>0){if(b&&c>b||e)a=a.slice(e,e+b);d&&(a=Ta.call(this,a))}return a}\nfunction Ta(a){if(!this||!this.store)return a;if(this.db)return this.index.get(this.field[0]).db.enrich(a);const c=Array(a.length);for(let b=0,e;b<a.length;b++)e=a[b],c[b]={id:e,doc:this.store.get(e)};return c};function Na(a){if(!this||this.constructor!==Na)return new Na(a);const c=a.document||a.doc||a;let b,e;this.B=[];this.field=[];this.D=[];this.key=(b=c.key||c.id)&&hb(b,this.D)||\"id\";(e=a.keystore||0)&&(this.keystore=e);this.fastupdate=!!a.fastupdate;this.reg=!this.fastupdate||a.worker||a.db?e?new S(e):new Set:e?new R(e):new Map;this.h=(b=c.store||null)&&b&&b!==!0&&[];this.store=b?e?new R(e):new Map:null;this.cache=(b=a.cache||null)&&new ma(b);a.cache=!1;this.worker=a.worker||!1;this.priority=a.priority||\n4;this.index=ib.call(this,a,c);this.tag=null;if(b=c.tag)if(typeof b===\"string\"&&(b=[b]),b.length){this.tag=new Map;this.A=[];this.F=[];for(let d=0,f,g;d<b.length;d++){f=b[d];g=f.field||f;if(!g)throw Error(\"The tag field from the document descriptor is undefined.\");f.custom?this.A[d]=f.custom:(this.A[d]=hb(g,this.D),f.filter&&(typeof this.A[d]===\"string\"&&(this.A[d]=new String(this.A[d])),this.A[d].G=f.filter));this.F[d]=g;this.tag.set(g,new Map)}}if(this.worker){this.fastupdate=!1;a=[];for(const d of this.index.values())d.then&&\na.push(d);if(a.length){const d=this;return Promise.all(a).then(function(f){let g=0;for(const k of d.index.entries()){const h=k[0];let l=k[1];l.then&&(l=f[g],d.index.set(h,l),g++)}return d})}}else a.db&&(this.fastupdate=!1,this.mount(a.db))}w=Na.prototype;\nw.mount=function(a){let c=this.field;if(this.tag)for(let f=0,g;f<this.F.length;f++){g=this.F[f];var b=void 0;this.index.set(g,b=new T({},this.reg));c===this.field&&(c=c.slice(0));c.push(g);b.tag=this.tag.get(g)}b=[];const e={db:a.db,type:a.type,fastupdate:a.fastupdate};for(let f=0,g,k;f<c.length;f++){e.field=k=c[f];g=this.index.get(k);const h=new a.constructor(a.id,e);h.id=a.id;b[f]=h.mount(g);g.document=!0;f?g.bypass=!0:g.store=this.store}const d=this;return this.db=Promise.all(b).then(function(){d.db=\n!0})};w.commit=async function(){const a=[];for(const c of this.index.values())a.push(c.commit());await Promise.all(a);this.reg.clear()};w.destroy=function(){const a=[];for(const c of this.index.values())a.push(c.destroy());return Promise.all(a)};\nfunction ib(a,c){const b=new Map;let e=c.index||c.field||c;M(e)&&(e=[e]);for(let f=0,g,k;f<e.length;f++){g=e[f];M(g)||(k=g,g=g.field);k=ba(k)?Object.assign({},a,k):a;if(this.worker){var d=void 0;d=(d=k.encoder)&&d.encode?d:new ka(typeof d===\"string\"?va[d]:d||{});d=new La(k,d);b.set(g,d)}this.worker||b.set(g,new T(k,this.reg));k.custom?this.B[f]=k.custom:(this.B[f]=hb(g,this.D),k.filter&&(typeof this.B[f]===\"string\"&&(this.B[f]=new String(this.B[f])),this.B[f].G=k.filter));this.field[f]=g}if(this.h){a=\nc.store;M(a)&&(a=[a]);for(let f=0,g,k;f<a.length;f++)g=a[f],k=g.field||g,g.custom?(this.h[f]=g.custom,g.custom.O=k):(this.h[f]=hb(k,this.D),g.filter&&(typeof this.h[f]===\"string\"&&(this.h[f]=new String(this.h[f])),this.h[f].G=g.filter))}return b}function hb(a,c){const b=a.split(\":\");let e=0;for(let d=0;d<b.length;d++)a=b[d],a[a.length-1]===\"]\"&&(a=a.substring(0,a.length-2))&&(c[e]=!0),a&&(b[e++]=a);e<b.length&&(b.length=e);return e>1?b:b[0]}w.append=function(a,c){return this.add(a,c,!0)};\nw.update=function(a,c){return this.remove(a).add(a,c)};w.remove=function(a){ba(a)&&(a=ca(a,this.key));for(var c of this.index.values())c.remove(a,!0);if(this.reg.has(a)){if(this.tag&&!this.fastupdate)for(let b of this.tag.values())for(let e of b){c=e[0];const d=e[1],f=d.indexOf(a);f>-1&&(d.length>1?d.splice(f,1):b.delete(c))}this.store&&this.store.delete(a);this.reg.delete(a)}this.cache&&this.cache.remove(a);return this};\nw.clear=function(){const a=[];for(const c of this.index.values()){const b=c.clear();b.then&&a.push(b)}if(this.tag)for(const c of this.tag.values())c.clear();this.store&&this.store.clear();this.cache&&this.cache.clear();return a.length?Promise.all(a):this};w.contain=function(a){return this.db?this.index.get(this.field[0]).db.has(a):this.reg.has(a)};w.cleanup=function(){for(const a of this.index.values())a.cleanup();return this};\nw.get=function(a){return this.db?this.index.get(this.field[0]).db.enrich(a).then(function(c){return c[0]&&c[0].doc||null}):this.store.get(a)||null};w.set=function(a,c){typeof a===\"object\"&&(c=a,a=ca(c,this.key));this.store.set(a,c);return this};w.searchCache=la;w.export=jb;w.import=kb;Fa(Na.prototype);function lb(a,c=0){let b=[],e=[];c&&(c=25E4/c*5E3|0);for(const d of a.entries())e.push(d),e.length===c&&(b.push(e),e=[]);e.length&&b.push(e);return b}function mb(a,c){c||(c=new Map);for(let b=0,e;b<a.length;b++)e=a[b],c.set(e[0],e[1]);return c}function nb(a,c=0){let b=[],e=[];c&&(c=25E4/c*1E3|0);for(const d of a.entries())e.push([d[0],lb(d[1])[0]||[]]),e.length===c&&(b.push(e),e=[]);e.length&&b.push(e);return b}\nfunction ob(a,c){c||(c=new Map);for(let b=0,e,d;b<a.length;b++)e=a[b],d=c.get(e[0]),c.set(e[0],mb(e[1],d));return c}function pb(a){let c=[],b=[];for(const e of a.keys())b.push(e),b.length===25E4&&(c.push(b),b=[]);b.length&&c.push(b);return c}function qb(a,c){c||(c=new Set);for(let b=0;b<a.length;b++)c.add(a[b]);return c}\nfunction rb(a,c,b,e,d,f,g=0){const k=e&&e.constructor===Array;var h=k?e.shift():e;if(!h)return this.export(a,c,d,f+1);if((h=a((c?c+\".\":\"\")+(g+1)+\".\"+b,JSON.stringify(h)))&&h.then){const l=this;return h.then(function(){return rb.call(l,a,c,b,k?e:null,d,f,g+1)})}return rb.call(this,a,c,b,k?e:null,d,f,g+1)}\nfunction jb(a,c,b=0,e=0){if(b<this.field.length){const g=this.field[b];if((c=this.index.get(g).export(a,g,b,e=1))&&c.then){const k=this;return c.then(function(){return k.export(a,g,b+1)})}return this.export(a,g,b+1)}let d,f;switch(e){case 0:d=\"reg\";f=pb(this.reg);c=null;break;case 1:d=\"tag\";f=this.tag&&nb(this.tag,this.reg.size);c=null;break;case 2:d=\"doc\";f=this.store&&lb(this.store);c=null;break;default:return}return rb.call(this,a,c,d,f||null,b,e)}\nfunction kb(a,c){var b=a.split(\".\");b[b.length-1]===\"json\"&&b.pop();const e=b.length>2?b[0]:\"\";b=b.length>2?b[2]:b[1];if(this.worker&&e)return this.index.get(e).import(a);if(c){typeof c===\"string\"&&(c=JSON.parse(c));if(e)return this.index.get(e).import(b,c);switch(b){case \"reg\":this.fastupdate=!1;this.reg=qb(c,this.reg);for(let d=0,f;d<this.field.length;d++)f=this.index.get(this.field[d]),f.fastupdate=!1,f.reg=this.reg;if(this.worker){c=[];for(const d of this.index.values())c.push(d.import(a));return Promise.all(c)}break;\ncase \"tag\":this.tag=ob(c,this.tag);break;case \"doc\":this.store=mb(c,this.store)}}}function sb(a,c){let b=\"\";for(const e of a.entries()){a=e[0];const d=e[1];let f=\"\";for(let g=0,k;g<d.length;g++){k=d[g]||[\"\"];let h=\"\";for(let l=0;l<k.length;l++)h+=(h?\",\":\"\")+(c===\"string\"?'\"'+k[l]+'\"':k[l]);h=\"[\"+h+\"]\";f+=(f?\",\":\"\")+h}f='[\"'+a+'\",['+f+\"]]\";b+=(b?\",\":\"\")+f}return b};T.prototype.remove=function(a,c){const b=this.reg.size&&(this.fastupdate?this.reg.get(a):this.reg.has(a));if(b){if(this.fastupdate)for(let e=0,d,f;e<b.length;e++){if((d=b[e])&&(f=d.length))if(d[f-1]===a)d.pop();else{const g=d.indexOf(a);g>=0&&d.splice(g,1)}}else tb(this.map,a),this.depth&&tb(this.ctx,a);c||this.reg.delete(a)}this.db&&(this.commit_task.push({del:a}),this.M&&ub(this));this.cache&&this.cache.remove(a);return this};\nfunction tb(a,c){let b=0;var e=typeof c===\"undefined\";if(a.constructor===Array)for(let d=0,f,g,k;d<a.length;d++){if((f=a[d])&&f.length){if(e)return 1;g=f.indexOf(c);if(g>=0){if(f.length>1)return f.splice(g,1),1;delete a[d];if(b)return 1;k=1}else{if(k)return 1;b++}}}else for(let d of a.entries())e=d[0],tb(d[1],c)?b++:a.delete(e);return b};const vb={memory:{resolution:1},performance:{resolution:3,fastupdate:!0,context:{depth:1,resolution:1}},match:{tokenize:\"forward\"},score:{resolution:9,context:{depth:2,resolution:3}}};T.prototype.add=function(a,c,b,e){if(c&&(a||a===0)){if(!e&&!b&&this.reg.has(a))return this.update(a,c);e=this.depth;c=this.encoder.encode(c,!e);const l=c.length;if(l){const m=I(),p=I(),u=this.resolution;for(let r=0;r<l;r++){let t=c[this.rtl?l-1-r:r];var d=t.length;if(d&&(e||!p[t])){var f=this.score?this.score(c,t,r,null,0):wb(u,l,r),g=\"\";switch(this.tokenize){case \"tolerant\":Y(this,p,t,f,a,b);if(d>2){for(let n=1,q,x,v,A;n<d-1;n++)q=t.charAt(n),x=t.charAt(n+1),v=t.substring(0,n)+x,A=t.substring(n+\n2),g=v+q+A,Y(this,p,g,f,a,b),g=v+A,Y(this,p,g,f,a,b);Y(this,p,t.substring(0,t.length-1),f,a,b)}break;case \"full\":if(d>2){for(let n=0,q;n<d;n++)for(f=d;f>n;f--){g=t.substring(n,f);q=this.rtl?d-1-n:n;var k=this.score?this.score(c,t,r,g,q):wb(u,l,r,d,q);Y(this,p,g,k,a,b)}break}case \"bidirectional\":case \"reverse\":if(d>1){for(k=d-1;k>0;k--){g=t[this.rtl?d-1-k:k]+g;var h=this.score?this.score(c,t,r,g,k):wb(u,l,r,d,k);Y(this,p,g,h,a,b)}g=\"\"}case \"forward\":if(d>1){for(k=0;k<d;k++)g+=t[this.rtl?d-1-k:k],Y(this,\np,g,f,a,b);break}default:if(Y(this,p,t,f,a,b),e&&l>1&&r<l-1)for(d=this.N,g=t,f=Math.min(e+1,this.rtl?r+1:l-r),k=1;k<f;k++){t=c[this.rtl?l-1-r-k:r+k];h=this.bidirectional&&t>g;const n=this.score?this.score(c,g,r,t,k-1):wb(d+(l/2>d?0:1),l,r,f-1,k-1);Y(this,m,h?g:t,n,a,b,h?t:g)}}}}this.fastupdate||this.reg.add(a)}}this.db&&(this.commit_task.push(b?{ins:a}:{del:a}),this.M&&ub(this));return this};\nfunction Y(a,c,b,e,d,f,g){let k,h;if(!(k=c[b])||g&&!k[g]){g?(c=k||(c[b]=I()),c[g]=1,h=a.ctx,(k=h.get(g))?h=k:h.set(g,h=a.keystore?new R(a.keystore):new Map)):(h=a.map,c[b]=1);(k=h.get(b))?h=k:h.set(b,h=k=[]);if(f)for(let l=0,m;l<k.length;l++)if((m=k[l])&&m.includes(d)){if(l<=e)return;m.splice(m.indexOf(d),1);a.fastupdate&&(c=a.reg.get(d))&&c.splice(c.indexOf(m),1);break}h=h[e]||(h[e]=[]);h.push(d);if(h.length===2**31-1){c=new xa(h);if(a.fastupdate)for(let l of a.reg.values())l.includes(h)&&(l[l.indexOf(h)]=\nc);k[e]=h=c}a.fastupdate&&((e=a.reg.get(d))?e.push(h):a.reg.set(d,[h]))}}function wb(a,c,b,e,d){return b&&a>1?c+(e||0)<=a?b+(d||0):(a-1)/(c+(e||0))*(b+(d||0))+1|0:0};T.prototype.search=function(a,c,b){b||(c||typeof a!==\"object\"?typeof c===\"object\"&&(b=c,c=0):(b=a,a=\"\"));if(b&&b.cache)return b.cache=!1,a=this.searchCache(a,c,b),b.cache=!0,a;let e=[],d,f,g,k=0,h,l,m,p,u;b&&(a=b.query||a,c=b.limit||c,k=b.offset||0,f=b.context,g=b.suggest,u=(h=b.resolve)&&b.enrich,m=b.boost,p=b.resolution,l=this.db&&b.tag);typeof h===\"undefined\"&&(h=this.resolve);f=this.depth&&f!==!1;let r=this.encoder.encode(a,!f);d=r.length;c=c||(h?100:0);if(d===1)return xb.call(this,r[0],\"\",c,\nk,h,u,l);if(d===2&&f&&!g)return xb.call(this,r[1],r[0],c,k,h,u,l);let t=I(),n=0,q;f&&(q=r[0],n=1);p||p===0||(p=q?this.N:this.resolution);if(this.db){if(this.db.search&&(b=this.db.search(this,r,c,k,g,h,u,l),b!==!1))return b;const x=this;return async function(){for(let v,A;n<d;n++){if((A=r[n])&&!t[A]){t[A]=1;v=await yb(x,A,q,0,0,!1,!1);if(v=zb(v,e,g,p)){e=v;break}q&&(g&&v&&e.length||(q=A))}g&&q&&n===d-1&&!e.length&&(p=x.resolution,q=\"\",n=-1,t=I())}return Ab(e,p,c,k,g,m,h)}()}for(let x,v;n<d;n++){if((v=\nr[n])&&!t[v]){t[v]=1;x=yb(this,v,q,0,0,!1,!1);if(x=zb(x,e,g,p)){e=x;break}q&&(g&&x&&e.length||(q=v))}g&&q&&n===d-1&&!e.length&&(p=this.resolution,q=\"\",n=-1,t=I())}return Ab(e,p,c,k,g,m,h)};function Ab(a,c,b,e,d,f,g){let k=a.length,h=a;if(k>1)h=$a(a,c,b,e,d,f,g);else if(k===1)return g?Sa.call(null,a[0],b,e):new X(a[0],this);return g?h:new X(h,this)}\nfunction xb(a,c,b,e,d,f,g){a=yb(this,a,c,b,e,d,f,g);return this.db?a.then(function(k){return d?k||[]:new X(k,this)}):a&&a.length?d?Sa.call(this,a,b,e):new X(a,this):d?[]:new X([],this)}function zb(a,c,b,e){let d=[];if(a&&a.length){if(a.length<=e){c.push(a);return}for(let f=0,g;f<e;f++)if(g=a[f])d[f]=g;if(d.length){c.push(d);return}}if(!b)return d}\nfunction yb(a,c,b,e,d,f,g,k){let h;b&&(h=a.bidirectional&&c>b)&&(h=b,b=c,c=h);if(a.db)return a.db.get(c,b,e,d,f,g,k);a=b?(a=a.ctx.get(b))&&a.get(c):a.map.get(c);return a};function T(a,c){if(!this||this.constructor!==T)return new T(a);if(a){var b=M(a)?a:a.preset;b&&(a=Object.assign({},vb[b],a))}else a={};b=a.context;const e=b===!0?{depth:1}:b||{},d=M(a.encoder)?va[a.encoder]:a.encode||a.encoder||{};this.encoder=d.encode?d:typeof d===\"object\"?new ka(d):{encode:d};this.resolution=a.resolution||9;this.tokenize=b=(b=a.tokenize)&&b!==\"default\"&&b!==\"exact\"&&b||\"strict\";this.depth=b===\"strict\"&&e.depth||0;this.bidirectional=e.bidirectional!==!1;this.fastupdate=!!a.fastupdate;\nthis.score=a.score||null;(b=a.keystore||0)&&(this.keystore=b);this.map=b?new R(b):new Map;this.ctx=b?new R(b):new Map;this.reg=c||(this.fastupdate?b?new R(b):new Map:b?new S(b):new Set);this.N=e.resolution||3;this.rtl=d.rtl||a.rtl||!1;this.cache=(b=a.cache||null)&&new ma(b);this.resolve=a.resolve!==!1;if(b=a.db)this.db=this.mount(b);this.M=a.commit!==!1;this.commit_task=[];this.commit_timer=null;this.priority=a.priority||4}w=T.prototype;\nw.mount=function(a){this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null);return a.mount(this)};w.commit=function(){this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null);return this.db.commit(this)};w.destroy=function(){this.commit_timer&&(clearTimeout(this.commit_timer),this.commit_timer=null);return this.db.destroy()};function ub(a){a.commit_timer||(a.commit_timer=setTimeout(function(){a.commit_timer=null;a.db.commit(a)},1))}\nw.clear=function(){this.map.clear();this.ctx.clear();this.reg.clear();this.cache&&this.cache.clear();return this.db?(this.commit_timer&&clearTimeout(this.commit_timer),this.commit_timer=null,this.commit_task=[],this.db.clear()):this};w.append=function(a,c){return this.add(a,c,!0)};w.contain=function(a){return this.db?this.db.has(a):this.reg.has(a)};w.update=function(a,c){const b=this,e=this.remove(a);return e&&e.then?e.then(()=>b.add(a,c)):this.add(a,c)};\nw.cleanup=function(){if(!this.fastupdate)return this;tb(this.map);this.depth&&tb(this.ctx);return this};w.searchCache=la;w.export=function(a,c,b=0,e=0){let d,f;switch(e){case 0:d=\"reg\";f=pb(this.reg);break;case 1:d=\"cfg\";f=null;break;case 2:d=\"map\";f=lb(this.map,this.reg.size);break;case 3:d=\"ctx\";f=nb(this.ctx,this.reg.size);break;default:return}return rb.call(this,a,c,d,f,b,e)};\nw.import=function(a,c){if(c)switch(typeof c===\"string\"&&(c=JSON.parse(c)),a=a.split(\".\"),a[a.length-1]===\"json\"&&a.pop(),a.length===3&&a.shift(),a=a.length>1?a[1]:a[0],a){case \"reg\":this.fastupdate=!1;this.reg=qb(c,this.reg);break;case \"map\":this.map=mb(c,this.map);break;case \"ctx\":this.ctx=ob(c,this.ctx)}};\nw.serialize=function(a=!0){let c=\"\",b=\"\",e=\"\";if(this.reg.size){let f;for(var d of this.reg.keys())f||(f=typeof d),c+=(c?\",\":\"\")+(f===\"string\"?'\"'+d+'\"':d);c=\"index.reg=new Set([\"+c+\"]);\";b=sb(this.map,f);b=\"index.map=new Map([\"+b+\"]);\";for(const g of this.ctx.entries()){d=g[0];let k=sb(g[1],f);k=\"new Map([\"+k+\"])\";k='[\"'+d+'\",'+k+\"]\";e+=(e?\",\":\"\")+k}e=\"index.ctx=new Map([\"+e+\"]);\"}return a?\"function inject(index){\"+c+b+e+\"}\":c+b+e};Fa(T.prototype);const Bb=typeof window!==\"undefined\"&&(window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB),Cb=[\"map\",\"ctx\",\"tag\",\"reg\",\"cfg\"],Db=I();\nfunction Eb(a,c={}){if(!this||this.constructor!==Eb)return new Eb(a,c);typeof a===\"object\"&&(c=a,a=a.name);a||console.info(\"Default storage space was used, because a name was not passed.\");this.id=\"flexsearch\"+(a?\":\"+a.toLowerCase().replace(/[^a-z0-9_\\-]/g,\"\"):\"\");this.field=c.field?c.field.toLowerCase().replace(/[^a-z0-9_\\-]/g,\"\"):\"\";this.type=c.type;this.fastupdate=this.support_tag_search=!1;this.db=null;this.h={}}w=Eb.prototype;w.mount=function(a){if(a.index)return a.mount(this);a.db=this;return this.open()};\nw.open=function(){if(this.db)return this.db;let a=this;navigator.storage&&navigator.storage.persist&&navigator.storage.persist();Db[a.id]||(Db[a.id]=[]);Db[a.id].push(a.field);const c=Bb.open(a.id,1);c.onupgradeneeded=function(){const b=a.db=this.result;for(let e=0,d;e<Cb.length;e++){d=Cb[e];for(let f=0,g;f<Db[a.id].length;f++)g=Db[a.id][f],b.objectStoreNames.contains(d+(d!==\"reg\"?g?\":\"+g:\"\":\"\"))||b.createObjectStore(d+(d!==\"reg\"?g?\":\"+g:\"\":\"\"))}};return a.db=Z(c,function(b){a.db=b;a.db.onversionchange=\nfunction(){a.close()}})};w.close=function(){this.db&&this.db.close();this.db=null};w.destroy=function(){const a=Bb.deleteDatabase(this.id);return Z(a)};w.clear=function(){const a=[];for(let b=0,e;b<Cb.length;b++){e=Cb[b];for(let d=0,f;d<Db[this.id].length;d++)f=Db[this.id][d],a.push(e+(e!==\"reg\"?f?\":\"+f:\"\":\"\"))}const c=this.db.transaction(a,\"readwrite\");for(let b=0;b<a.length;b++)c.objectStore(a[b]).clear();return Z(c)};\nw.get=function(a,c,b=0,e=0,d=!0,f=!1){a=this.db.transaction((c?\"ctx\":\"map\")+(this.field?\":\"+this.field:\"\"),\"readonly\").objectStore((c?\"ctx\":\"map\")+(this.field?\":\"+this.field:\"\")).get(c?c+\":\"+a:a);const g=this;return Z(a).then(function(k){let h=[];if(!k||!k.length)return h;if(d){if(!b&&!e&&k.length===1)return k[0];for(let l=0,m;l<k.length;l++)if((m=k[l])&&m.length){if(e>=m.length){e-=m.length;continue}const p=b?e+Math.min(m.length-e,b):m.length;for(let u=e;u<p;u++)h.push(m[u]);e=0;if(h.length===b)break}return f?\ng.enrich(h):h}return k})};w.tag=function(a,c=0,b=0,e=!1){a=this.db.transaction(\"tag\"+(this.field?\":\"+this.field:\"\"),\"readonly\").objectStore(\"tag\"+(this.field?\":\"+this.field:\"\")).get(a);const d=this;return Z(a).then(function(f){if(!f||!f.length||b>=f.length)return[];if(!c&&!b)return f;f=f.slice(b,b+c);return e?d.enrich(f):f})};\nw.enrich=function(a){typeof a!==\"object\"&&(a=[a]);const c=this.db.transaction(\"reg\",\"readonly\").objectStore(\"reg\"),b=[];for(let e=0;e<a.length;e++)b[e]=Z(c.get(a[e]));return Promise.all(b).then(function(e){for(let d=0;d<e.length;d++)e[d]={id:a[d],doc:e[d]?JSON.parse(e[d]):null};return e})};w.has=function(a){a=this.db.transaction(\"reg\",\"readonly\").objectStore(\"reg\").getKey(a);return Z(a).then(function(c){return!!c})};w.search=null;w.info=function(){};\nw.transaction=function(a,c,b){a+=a!==\"reg\"?this.field?\":\"+this.field:\"\":\"\";let e=this.h[a+\":\"+c];if(e)return b.call(this,e);let d=this.db.transaction(a,c);this.h[a+\":\"+c]=e=d.objectStore(a);const f=b.call(this,e);this.h[a+\":\"+c]=null;return Z(d).finally(function(){return f})};\nw.commit=async function(a){let c=a.commit_task,b=[];a.commit_task=[];for(let e=0,d;e<c.length;e++)d=c[e],d.del&&b.push(d.del);b.length&&await this.remove(b);a.reg.size&&(await this.transaction(\"map\",\"readwrite\",function(e){for(const d of a.map){const f=d[0],g=d[1];g.length&&(e.get(f).onsuccess=function(){let k=this.result;var h;if(k&&k.length){const l=Math.max(k.length,g.length);for(let m=0,p,u;m<l;m++)if((u=g[m])&&u.length){if((p=k[m])&&p.length)for(h=0;h<u.length;h++)p.push(u[h]);else k[m]=u;h=\n1}}else k=g,h=1;h&&e.put(k,f)})}}),await this.transaction(\"ctx\",\"readwrite\",function(e){for(const d of a.ctx){const f=d[0],g=d[1];for(const k of g){const h=k[0],l=k[1];l.length&&(e.get(f+\":\"+h).onsuccess=function(){let m=this.result;var p;if(m&&m.length){const u=Math.max(m.length,l.length);for(let r=0,t,n;r<u;r++)if((n=l[r])&&n.length){if((t=m[r])&&t.length)for(p=0;p<n.length;p++)t.push(n[p]);else m[r]=n;p=1}}else m=l,p=1;p&&e.put(m,f+\":\"+h)})}}}),a.store?await this.transaction(\"reg\",\"readwrite\",\nfunction(e){for(const d of a.store){const f=d[0],g=d[1];e.put(typeof g===\"object\"?JSON.stringify(g):1,f)}}):a.bypass||await this.transaction(\"reg\",\"readwrite\",function(e){for(const d of a.reg.keys())e.put(1,d)}),a.tag&&await this.transaction(\"tag\",\"readwrite\",function(e){for(const d of a.tag){const f=d[0],g=d[1];g.length&&(e.get(f).onsuccess=function(){let k=this.result;k=k&&k.length?k.concat(g):g;e.put(k,f)})}}),a.map.clear(),a.ctx.clear(),a.tag&&a.tag.clear(),a.store&&a.store.clear(),a.document||\na.reg.clear())};function Fb(a,c,b){const e=a.value;let d,f=0;for(let g=0,k;g<e.length;g++){if(k=b?e:e[g]){for(let h=0,l,m;h<c.length;h++)if(m=c[h],l=k.indexOf(m),l>=0)if(d=1,k.length>1)k.splice(l,1);else{e[g]=[];break}f+=k.length}if(b)break}f?d&&a.update(e):a.delete();a.continue()}\nw.remove=function(a){typeof a!==\"object\"&&(a=[a]);return Promise.all([this.transaction(\"map\",\"readwrite\",function(c){c.openCursor().onsuccess=function(){const b=this.result;b&&Fb(b,a)}}),this.transaction(\"ctx\",\"readwrite\",function(c){c.openCursor().onsuccess=function(){const b=this.result;b&&Fb(b,a)}}),this.transaction(\"tag\",\"readwrite\",function(c){c.openCursor().onsuccess=function(){const b=this.result;b&&Fb(b,a,!0)}}),this.transaction(\"reg\",\"readwrite\",function(c){for(let b=0;b<a.length;b++)c.delete(a[b])})])};\nfunction Z(a,c){return new Promise((b,e)=>{a.onsuccess=a.oncomplete=function(){c&&c(this.result);c=null;b(this.result)};a.onerror=a.onblocked=e;a=null})};export default {Index:T,Charset:va,Encoder:ka,Document:Na,Worker:La,Resolver:X,IndexedDB:Eb,Language:{}};\nexport const Index=T;export const Charset=va;export const Encoder=ka;export const Document=Na;export const Worker=La;export const Resolver=X;export const IndexedDB=Eb;export const Language={};", "import { getLogger } from \"@framerjs/shared\"\nimport { Output, generateText as aiGenerateText } from \"ai\"\nimport { LanguageModel } from \"app/ai/languageModels.ts\"\nimport { Index } from \"flexsearch\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport pluralize from \"pluralize\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { z } from \"zod\"\nimport { createVekterOpenRouterExtraBody, openRouter } from \"../../../config/openRouter.ts\"\nimport { getProviderForModel, getReasoningForModel } from \"../../../models.ts\"\nimport type { AgentInteractionHandle } from \"../../../raindrop/AgentInteraction.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"../../../tracing/openRouterTrace.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { FontSearchOptions } from \"./queryFonts.ts\"\nimport type { CharacterVariantDescriptorTag, StylisticSetDescriptorTag } from \"./utils.ts\"\n\nexport interface FontFamilyCatalogEntry {\n\tname: string\n\tdescription: string\n\t/** Font descriptors such as category, style, weight, and OpenType feature tags. */\n\tdescriptors?: string[]\n}\n\ninterface FontFamilyNameCatalogEntry {\n\tname: string\n}\n\nexport interface FontFamilyPick {\n\tname: string\n\treason: string\n}\n\n/** Narrowed type for describe searches where `query` and `limit` are always present. */\ninterface FontDescribeSearch extends FontSearchOptions {\n\tquery: string\n\tlimit: number\n}\n\nexport interface FontFamilyPickerInput {\n\tsearch: FontSearchOptions\n\tcatalog: readonly FontFamilyCatalogEntry[]\n\ttraceConfig: OpenRouterFeatureStepTraceConfig\n\tparentInteraction?: AgentInteractionHandle\n\tdisableRaindropTelemetry?: boolean\n\tmodel?: Parameters<typeof aiGenerateText>[0][\"model\"]\n\ttimeout?: number | false\n}\n\ninterface FontFamilyDescribePickerInput extends Omit<FontFamilyPickerInput, \"search\"> {\n\tsearch: FontDescribeSearch\n}\n\ninterface FontFamilyNamePickerInput extends Omit<FontFamilyPickerInput, \"catalog\"> {\n\tcatalog: readonly FontFamilyNameCatalogEntry[]\n}\n\nexport type FontFamilyPicker = (input: FontFamilyPickerInput) => Promise<FontFamilyPick[]>\n\nconst fontFamilyPicksSchema = z.object({\n\tfonts: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tname: z.string().describe(\"Exact font family name from the font catalog.\"),\n\t\t\t\treason: z.string().describe(\"Short reason why this font matches the query.\"),\n\t\t\t}),\n\t\t)\n\t\t.max(20)\n\t\t.describe(\"Ordered best-to-worst shortlist of font families.\"),\n})\n\nconst fontPickerModel: LanguageModel = LanguageModel.Gemini31FlashLite\n\nconst log = getLogger(\"ai:agents:fonts:picker\")\nconst fontCatalogTelemetryNameLimit = 50\n\nfunction summarizeFontCatalogForTelemetry(catalog: readonly FontFamilyCatalogEntry[]) {\n\treturn {\n\t\tcount: catalog.length,\n\t\tnames: catalog.slice(0, fontCatalogTelemetryNameLimit).map(entry => entry.name),\n\t\ttruncated: catalog.length > fontCatalogTelemetryNameLimit,\n\t}\n}\n\nfunction buildFontPickerSystemPrompt(search: FontDescribeSearch, catalog: readonly FontFamilyCatalogEntry[]): string {\n\tconst diversityFragment =\n\t\tsearch.limit >= 3\n\t\t\t? `Diversity: Your job is to rank and pick the ${search.limit} best ${pluralize(\"matches\", search.limit)}, include some variety in your picks while still matching the intent.`\n\t\t\t: `Diversity: Your job is to rank and pick the ${search.limit} best ${pluralize(\"matches\", search.limit)}.`\n\n\treturn `You are an expert typography assistant. Your only task is to pick suitable font families for a design request.\n\n## Instructions\n- Return up to ${search.limit} ${pluralize(\"picks\", search.limit)}. If fewer than ${search.limit} ${pluralize(\"fonts\", search.limit)} reasonably match the intent, return fewer. If no fonts match, return an empty list.\n- Respect the requested limit of ${search.limit}. Return fewer if nothing fits.\n- Match the subjective style intent expressed in the query against each font's description.\n- ${diversityFragment}\n- Each font has a \"descriptors\" list containing categories, styles, weights, OpenType features, and variation axes \u2014 ${escapeValue<StylisticSetDescriptorTag>(\"feature/ss??/\")} represents stylistic sets and ${escapeValue<CharacterVariantDescriptorTag>(\"feature/cv??/\")} represents character variants, each with an affected/alternative character at the end.\n- The query may include required descriptors and/or alternative glyph requirements \u2014 prefer fonts whose descriptors match closely and when no perfect matches exist consider different overlaps for diversity.\n\n## Output\nReturn JSON matching the provided schema with an ordered list of picks and a short reason per pick.\n\n## Font catalog\nThe available font families are provided as a JSON array of objects:\n${JSON.stringify(\n\tcatalog.map(item => {\n\t\treturn {\n\t\t\t...item,\n\t\t\tdescriptors: item.descriptors?.join(\" \"),\n\t\t}\n\t}),\n)}\n`.trim()\n}\n\nfunction serializeFontSearchOptions(search: FontDescribeSearch): string {\n\tlet prompt = `Please recommend me ${search.limit} ${pluralize(\"font\", search.limit)} which:\n- Match this description: ${search.query}\\n`\n\n\tif (search.mustHaveAlternativeCharacters?.length) {\n\t\tprompt += `- Have alternative glyphs for: ${search.mustHaveAlternativeCharacters?.join(\", \")}\\n`\n\t}\n\tif (search.mustHave?.length) {\n\t\tprompt += `- Have these descriptors: ${search.mustHave?.join(\", \")}\\n`\n\t}\n\n\treturn prompt.trim()\n}\n\nfunction normalizeFontSearchText(value: string): string {\n\treturn value.normalize(\"NFKC\").replace(/[_-]+/gu, \" \").replace(/\\s+/gu, \" \").trim().toLowerCase()\n}\n\nconst NAME_SEARCH_FUZZY_LIMIT = 3\n\ninterface CachedNameIndex {\n\thash: number\n\tindex: Index\n\tnamesById: Map<number, string>\n\tnormalizedNames: Map<string, string>\n}\n\nlet cachedNameIndex: CachedNameIndex | undefined\n\n/**\n * Builds a FlexSearch name index from ALL available fonts in the store,\n * not from the filtered catalog. This makes fontStore.hash the correct\n * cache key, since it represents the full unfiltered set. Callers filter\n * search results against their own catalog to apply exclusions.\n */\nfunction getOrBuildNameIndex(): CachedNameIndex {\n\tconst hash = fontStore.hash\n\tif (cachedNameIndex?.hash === hash) return cachedNameIndex\n\n\tconst index = new Index({ tokenize: \"forward\" })\n\tconst namesById = new Map<number, string>()\n\tconst normalizedNames = new Map<string, string>()\n\n\tconst seenFamilies = new Set<string>()\n\tlet id = 0\n\tfor (const font of fontStore.getAvailableFonts()) {\n\t\tconst familyName = font.family.name\n\t\tif (seenFamilies.has(familyName)) continue\n\t\tseenFamilies.add(familyName)\n\n\t\tconst normalized = normalizeFontSearchText(familyName)\n\t\tindex.add(id, normalized)\n\t\tnamesById.set(id, familyName)\n\t\tnormalizedNames.set(normalized, familyName)\n\t\tid++\n\t}\n\n\tcachedNameIndex = { hash, index, namesById, normalizedNames }\n\treturn cachedNameIndex\n}\n\nexport async function pickFontFamiliesByName({\n\tsearch,\n\tcatalog,\n}: FontFamilyNamePickerInput): Promise<FontFamilyPick[]> {\n\tconst normalizedQuery = normalizeFontSearchText(search.name ?? \"\")\n\tif (!normalizedQuery) return []\n\n\tconst { index, namesById, normalizedNames } = getOrBuildNameIndex()\n\tconst catalogNames = new Set(catalog.map(entry => entry.name))\n\n\tconst exactMatchName = normalizedNames.get(normalizedQuery)\n\tif (exactMatchName && catalogNames.has(exactMatchName)) {\n\t\tlog.info(\"Picked fonts by name lookup\", {\n\t\t\tname: search.name,\n\t\t\tcatalogSize: catalog.length,\n\t\t\tresultCount: 1,\n\t\t\texactMatch: true,\n\t\t})\n\t\treturn [{ name: exactMatchName, reason: \"exact match\" }]\n\t}\n\n\tconst resultIds = index.search(normalizedQuery, {\n\t\tlimit: NAME_SEARCH_FUZZY_LIMIT,\n\t})\n\n\tconst picks: FontFamilyPick[] = []\n\tfor (const resultId of resultIds) {\n\t\tif (!isNumber(resultId)) continue\n\t\tconst name = namesById.get(resultId)\n\t\tif (!name || !catalogNames.has(name)) continue\n\t\tpicks.push({\n\t\t\tname,\n\t\t\treason: \"closest match\",\n\t\t})\n\t}\n\n\tlog.info(\"Picked fonts by name lookup\", {\n\t\tname: search.name,\n\t\tcatalogSize: catalog.length,\n\t\tresultCount: picks.length,\n\t\texactMatch: false,\n\t})\n\n\treturn picks\n}\n\nasync function pickFontFamiliesWithLLM({\n\tsearch,\n\tcatalog,\n\ttraceConfig,\n\tparentInteraction,\n\tdisableRaindropTelemetry,\n\tmodel: modelOverride,\n\ttimeout = 20_000,\n}: FontFamilyDescribePickerInput): Promise<FontFamilyPick[]> {\n\tconst system = buildFontPickerSystemPrompt(search, catalog)\n\tconst userMessage = serializeFontSearchOptions(search)\n\tconst subagentInteraction =\n\t\tdisableRaindropTelemetry === true\n\t\t\t? undefined\n\t\t\t: parentInteraction?.createSubcall(\"font-picker\", {\n\t\t\t\t\tcatalog_count: catalog.length,\n\t\t\t\t\trequested_limit: search.limit,\n\t\t\t\t})\n\tsubagentInteraction?.addJsonAttachment(\"font_search.json\", \"input\", search)\n\tsubagentInteraction?.addJsonAttachment(\n\t\t\"font_catalog_summary.json\",\n\t\t\"input\",\n\t\tsummarizeFontCatalogForTelemetry(catalog),\n\t)\n\n\tconst model =\n\t\tmodelOverride ??\n\t\topenRouter(fontPickerModel, {\n\t\t\tprovider: getProviderForModel(fontPickerModel),\n\t\t\treasoning: getReasoningForModel(fontPickerModel),\n\t\t\textraBody: createVekterOpenRouterExtraBody({\n\t\t\t\tfeatureCategory: \"agents\",\n\t\t\t\tstep: \"font-picker\",\n\t\t\t\t...traceConfig,\n\t\t\t}),\n\t\t})\n\n\tlog.info(\"Picking fonts with LLM\", { search, catalog, system })\n\n\ttry {\n\t\tconst { output } = await aiGenerateText({\n\t\t\tmodel,\n\t\t\toutput: Output.object({\n\t\t\t\tschema: fontFamilyPicksSchema,\n\t\t\t}),\n\t\t\tsystem,\n\t\t\tmessages: [{ role: \"user\", content: userMessage }],\n\t\t\t...(timeout === false ? {} : { timeout }),\n\t\t\tmaxRetries: 2,\n\t\t})\n\t\tsubagentInteraction?.addJsonAttachment(\"font_picks.json\", \"output\", output.fonts)\n\t\tawait subagentInteraction?.flush()\n\t\tawait subagentInteraction?.finish(\"completed\", { model: fontPickerModel, output: JSON.stringify(output.fonts) })\n\t\treturn output.fonts\n\t} catch (error) {\n\t\tawait subagentInteraction?.flush()\n\t\tawait subagentInteraction?.finish(\"error\", {\n\t\t\tmodel: fontPickerModel,\n\t\t\toutput: error instanceof Error ? error.message : String(error),\n\t\t})\n\t\tthrow error\n\t}\n}\n\nexport async function pickFontFamilies(input: FontFamilyPickerInput): Promise<FontFamilyPick[]> {\n\tconst { query, limit } = input.search\n\tif (!query || !isNumber(limit)) return []\n\treturn pickFontFamiliesWithLLM({ ...input, search: { ...input.search, query, limit } })\n}\n\nexport const test = {\n\tbuildFontPickerSystemPrompt,\n\tserializeFontSearchOptions,\n\tnormalizeFontSearchText,\n\tsummarizeFontCatalogForTelemetry,\n\tclearNameIndexCache() {\n\t\tcachedNameIndex = undefined\n\t},\n}\n", "{\n\t\"42dot Sans\": \"42dot Sans is a clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and open apertures for high legibility. Its balanced proportions and minimalist design make it versatile for both digital interfaces and print.\",\n\t\"Abeezee\": \"ABeeZee is a clean, geometric sans-serif font with a friendly and educational feel, featuring open counters and simple, clear letterforms. Its balanced weight and straightforward design make it highly legible and modern, originally designed for children's learning materials.\",\n\t\"Abel\": \"Abel is a modern, condensed sans-serif font with a clean and professional feel, featuring tall x-heights and slightly squared-off curves that give it a distinct, architectural look.\",\n\t\"Abhaya Libre\": \"Abhaya Libre is a classic serif font with a sophisticated and elegant mood, featuring high-contrast strokes and sharp, refined serifs. Its tall x-height and open counters provide excellent legibility, making it suitable for both formal body text and editorial headlines.\",\n\t\"Aboreto\": \"Aboreto is an elegant, high-contrast display serif font with a classic, sophisticated feel. It features thin, delicate hairlines paired with bold strokes and sharp, refined serifs that give it a timeless, architectural quality.\",\n\t\"Abril Fatface\": \"Abril Fatface is a bold, high-contrast Didone serif display font that exudes a sophisticated yet dramatic mood. It features heavy vertical strokes paired with razor-thin hairlines and elegant curves, reminiscent of 19th-century advertising posters.\",\n\t\"Absans\": \"Absans is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring a medium weight and high-contrast stroke endings. Its most notable feature is the sharp, tapered terminals on letters like 's' and 'a', which give it a sophisticated and slightly edgy personality.\",\n\t\"Abyssinica Sil\": \"Abyssinica SIL is a classic serif typeface with a formal and scholarly feel, featuring moderate stroke contrast and sharp, wedge-like serifs. Its design is clean and highly legible, making it well-suited for academic and body text applications.\",\n\t\"Aclonica\": \"Aclonica is a bold, modern display font featuring a unique blend of sans-serif structures with calligraphic, flared terminals. Its clean yet slightly playful aesthetic is defined by asymmetrical curves and sharp, angled cuts that give it a techno-organic feel.\",\n\t\"Acme\": \"Acme is a bold, condensed display font with a playful, rhythmic feel, characterized by its slightly irregular, hand-drawn strokes and expressive curves. Its heavy weight and unique, cartoon-inspired aesthetic make it ideal for headlines and informal branding.\",\n\t\"Actor\": \"Actor is a clean, modern sans-serif font with a tall x-height and a professional, approachable mood. It features subtle, unique details like the slightly angled terminals and a high-waisted 'A', giving it a distinct personality while remaining highly legible.\",\n\t\"Adamina\": \"Adamina is a transitional serif font with a classic, refined feel, featuring asymmetrical serifs and a high x-height that ensures excellent readability. Its elegant, slightly condensed letterforms and moderate contrast give it a professional yet approachable character suitable for body text.\",\n\t\"Adlam Display\": \"ADLaM Display is a bold, friendly sans-serif font featuring soft, rounded terminals and unique calligraphic flourishes, such as the diamond-shaped tittle on the 'i'. Its heavy weight and playful, organic curves give it a modern yet approachable personality suitable for headlines.\",\n\t\"Advent Pro\": \"Advent Pro is a modern, thin sans-serif font with a distinct edge, featuring narrow letterforms and unique, sharp terminal cuts that give it a futuristic and clean aesthetic.\",\n\t\"Afacad\": \"Afacad is a clean, geometric sans-serif font with a modern and approachable feel, featuring open apertures and a balanced weight. Its design is characterized by circular curves and sharp terminals, making it highly legible and professional for both display and body text.\",\n\t\"Afacad Flux\": \"Afacad Flux is a clean, geometric sans-serif font with a modern and professional feel. It features a medium weight with balanced proportions and open apertures, making it highly legible and versatile for both digital and print applications.\",\n\t\"Affigere\": \"Affigere is an ultra-bold, condensed sans-serif display font with a modern, impactful feel. It features tight letter spacing and distinctive rounded terminals on the 'f' and 'g' that contrast with its otherwise blocky, geometric structure.\",\n\t\"Agbalumo\": \"Agbalumo is a bold, rhythmic display font with a playful, hand-lettered feel, featuring heavy strokes and distinctive fluid, wavy terminals. Its organic curves and high-contrast weight give it a vibrant, expressive personality suitable for headlines and creative branding.\",\n\t\"Agdasima\": \"Agdasima is a narrow, condensed sans-serif font with a modern, geometric feel, featuring tall letterforms and clean, uniform stroke weights. Its tight spacing and vertical emphasis give it a sleek, efficient appearance suitable for headlines and contemporary branding.\",\n\t\"Agu Display\": \"Agu Display is a whimsical, decorative display font featuring a medium weight and a playful, hand-crafted mood. Its most notable features are the intricate internal hatch patterns and geometric embellishments that give it a unique, illustrative quality.\",\n\t\"Aguafina Script\": \"Aguafina Script is an elegant, semi-formal script font featuring narrow, condensed letterforms and a sharp, rhythmic flow. Its fluid, calligraphic strokes and high-contrast weight give it a sophisticated yet energetic and modern feel.\",\n\t\"Aileron\": \"Aileron is a clean, neo-grotesque sans-serif font with a modern and professional feel, characterized by its high legibility and balanced proportions. It features subtle geometric influences and open apertures, making it versatile for both display and body text.\",\n\t\"Akatab\": \"Akatab is a clean, geometric sans-serif font with a modern and approachable feel, featuring monolinear strokes and open apertures. Its balanced proportions and simple letterforms provide excellent legibility for both display and body text.\",\n\t\"Akaya Kanadaka\": \"Akaya Kanadaka is a playful, informal display font featuring a hand-drawn aesthetic with rounded terminals and a slight calligraphic influence. Its irregular, organic strokes and bouncy baseline create a friendly, casual mood suitable for creative and whimsical designs.\",\n\t\"Akaya Telivigala\": \"Akaya Telivigala is a playful, decorative display font featuring rounded, organic strokes and a hand-drawn feel. Its soft curves and informal structure give it a friendly, whimsical, and approachable mood.\",\n\t\"Akronim\": \"Akronim is a highly stylized display font featuring a dynamic, brush-like texture composed of multiple parallel strokes that create a sense of motion. Its energetic and organic aesthetic gives it a hand-drawn, futuristic feel, making it ideal for bold headlines and creative branding.\",\n\t\"Akshar\": \"Akshar is a clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features high-contrast vertical terminals and open apertures, giving it a balanced and highly legible appearance.\",\n\t\"Aktura\": \"Aktura is a bold, modern blackletter display font that blends traditional gothic calligraphy with sharp, geometric edges. Its high-contrast strokes and aggressive, angular terminals create a dramatic and edgy aesthetic suitable for metal music or streetwear branding.\",\n\t\"Aladin\": \"Aladin is a playful, calligraphic display font with a magical, Middle Eastern-inspired aesthetic, featuring fluid, organic curves and a medium-heavy weight. Its casual, hand-drawn feel is characterized by flared terminals and a rhythmic, bouncy baseline that evokes a sense of fantasy and adventure.\",\n\t\"Alan Sans\": \"Alan Sans is a friendly, medium-weight sans-serif font featuring soft, rounded terminals and a clean, modern aesthetic. Its open counters and balanced proportions give it a welcoming and highly legible character suitable for both display and body text.\",\n\t\"Alata\": \"Alata is a geometric sans-serif font with a clean, monumental feel, featuring monolinear strokes and distinctively angled terminals on letters like the 't'. Its wide proportions and balanced structure evoke a modern yet timeless aesthetic suitable for both display and body text.\",\n\t\"Alatsi\": \"Alatsi is a contemporary sans-serif font with a bold weight and a confident, approachable mood. It features unique, slightly flared terminals and a high x-height, giving it a distinct, modern personality suitable for headlines.\",\n\t\"Albert Sans\": \"Albert Sans is a clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and open apertures for high legibility. Its balanced proportions and minimalist design make it versatile for both digital interfaces and print media.\",\n\t\"Aldrich\": \"Aldrich is a modern, geometric sans-serif font with a distinct techno or sci-fi feel, characterized by its square proportions and rounded outer corners. Its clean, monolinear weight and architectural structure give it a professional yet futuristic appearance.\",\n\t\"Alef\": \"Alef is a clean, modern sans-serif typeface with a friendly and open feel, characterized by its monolinear stroke weight and slightly rounded terminals. Its wide proportions and large x-height ensure excellent readability and a contemporary, approachable aesthetic.\",\n\t\"Alegreya\": \"Alegreya is a dynamic serif typeface with a calligraphic feel, featuring varied stroke weights and sharp, angular terminals that create a rhythmic, literary mood. Its organic, slightly irregular shapes give it a warm, humanistic quality suitable for long-form reading.\",\n\t\"Alegreya Sans\": \"Alegreya Sans is a humanist sans-serif typeface with a calligraphic feel, featuring varied stroke widths and angled terminals that provide a dynamic, literary rhythm. It balances a modern, clean aesthetic with a warm, classic personality, making it highly legible for long-form reading.\",\n\t\"Alegreya Sans Sc\": \"Alegreya Sans SC is a humanist sans-serif font featuring small caps, characterized by its calligraphic influence and dynamic, varied stroke widths. It conveys an elegant yet approachable mood with its organic curves and slightly flared terminals.\",\n\t\"Alegreya Sc\": \"Alegreya SC is a dynamic, calligraphic serif font featuring small caps with a classic yet energetic feel. It is characterized by its varied stroke weights, sharp serifs, and organic, slightly irregular letterforms that evoke a sense of literary elegance.\",\n\t\"Aleo\": \"Aleo is a contemporary slab serif typeface featuring a semi-rounded structure and sleek details that provide a friendly, approachable feel. Its balanced proportions and strong, blocky serifs make it highly legible while maintaining a modern and professional aesthetic.\",\n\t\"Alex Brush\": \"Alex Brush is an elegant, flowing script font with a hand-drawn feel, featuring smooth, rhythmic strokes and a classic, formal mood. Its beautifully balanced letterforms and varying line weights create a sophisticated, calligraphic aesthetic suitable for invitations and branding.\",\n\t\"Alexandria\": \"Alexandria is a clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and perfectly circular counters. Its minimalist design and high legibility make it versatile for both display and body text.\",\n\t\"Alfa Slab One\": \"Alfa Slab One is a contemporary, heavy-weight slab serif font with an extreme black weight and high contrast. Its bold, chunky letterforms and rounded terminals create a powerful, high-impact display style that feels both modern and authoritative.\",\n\t\"Alice\": \"Alice is an elegant, old-style serif font with a classic and slightly whimsical feel, featuring soft, rounded terminals and a gentle contrast between thick and thin strokes. Its graceful curves and traditional proportions give it a timeless, storybook-like quality.\",\n\t\"Alike\": \"Alike is a serif typeface with a calligraphic influence, featuring expressive, slightly irregular strokes and wedge-shaped serifs that give it a classic yet handcrafted feel. Its medium weight and organic letterforms create a warm, literary mood suitable for body text and editorial design.\",\n\t\"Alike Angular\": \"Alike Angular is a medium-weight serif font with a distinct, chiseled appearance, featuring sharp, geometric edges and broken curves that give it a rustic, hand-carved feel. Its expressive, angular construction creates a unique blend of classic letterforms with a modern, slightly edgy personality.\",\n\t\"Alkalami\": \"Alkalami is a bold, calligraphic serif font with a hand-carved feel, featuring irregular stroke widths and sharp, wedge-like serifs that evoke a traditional, organic mood. Its rugged, slightly uneven outlines give it a unique, artisanal character suitable for display purposes.\",\n\t\"Alkatra\": \"Alkatra is a bold, hand-drawn display font with a playful and organic feel, featuring irregular stroke widths and soft, rounded terminals. Its slightly italicized posture and calligraphic influence give it a dynamic, friendly, and informal character.\",\n\t\"Allan\": \"Allan is a bold, decorative display font with a casual, hand-lettered feel, featuring a strong italic slant and rounded terminals. Its playful yet energetic mood is characterized by high-contrast strokes and a rhythmic, script-like flow.\",\n\t\"Allerta\": \"Allerta is a clean, medium-weight sans-serif font designed for high legibility, featuring open counters and subtle, unique details like the slight outward curve on the base of the lowercase 'l' and 't'. Its modern and functional aesthetic makes it ideal for signage and clear communication.\",\n\t\"Allerta Stencil\": \"Allerta Stencil is a clean, modern sans-serif display font featuring a medium weight and distinct vertical breaks in its letterforms. Its utilitarian, industrial aesthetic is balanced by rounded terminals, making it highly legible for signage and technical applications.\",\n\t\"Allison\": \"Allison is a casual, handwritten script font with a fluid, brush-like quality and a personal, expressive mood. It features high-contrast strokes, an elegant slant, and organic, slightly irregular letterforms that mimic natural ink handwriting.\",\n\t\"Allkin\": \"A bold, geometric display font characterized by a series of uniform, thick rectangular stroke borders that create a minimalist, industrial, and highly structural appearance.\",\n\t\"Allura\": \"Allura is a stylized, flowing script font with an elegant and romantic feel, featuring smooth, handwritten curves and a medium weight. Its graceful loops and slanted posture give it a sophisticated yet approachable look, ideal for invitations and decorative branding.\",\n\t\"Almarai\": \"Almarai is a clean, geometric sans-serif typeface with a modern and professional feel, featuring open counters and consistent stroke weights for high legibility. Its balanced proportions and minimalist design make it versatile for both digital and print applications.\",\n\t\"Almendra\": \"Almendra is a calligraphic display typeface that blends medieval blackletter influences with a modern, elegant serif structure. It features sharp, angular terminals and a rhythmic, hand-drawn quality that evokes a sense of fantasy and classic literature.\",\n\t\"Almendra Display\": \"Almendra Display is a calligraphic display font with a light weight and a medieval, fantasy-inspired mood. It features elegant, sweeping swashes on capital letters and sharp, angular terminals that evoke the look of traditional blackletter and chancery scripts.\",\n\t\"Almendra Sc\": \"Almendra SC is a calligraphic display typeface with a medieval, gothic-inspired aesthetic, featuring sharp, angular serifs and elegant, fluid strokes. Its small caps design and rhythmic, hand-drawn quality evoke a sense of classic literature and historical fantasy.\",\n\t\"Alpha Lyrae\": \"A clean, geometric sans-serif font with a modern and professional feel, featuring uniform line weights and open apertures for high legibility.\",\n\t\"Alpino\": \"Alpino is a clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and open, circular letterforms. Its minimalist design and high legibility make it versatile for both display and body text.\",\n\t\"Alumni Sans\": \"Alumni Sans is a clean, ultra-condensed sans-serif font with a modern and professional aesthetic. Its tall x-height and narrow proportions make it ideal for high-impact headlines and space-efficient display use.\",\n\t\"Alumni Sans Collegiate One\": \"This is a bold, condensed sans-serif display font with a classic athletic or collegiate feel, featuring a distinctive double-outline effect. Its tall, narrow letterforms and solid black fill create a strong, high-impact look suitable for sports branding and varsity-style designs.\",\n\t\"Alumni Sans Inline One\": \"Alumni Sans Inline One is a bold, condensed sans-serif display font featuring a distinctive white inline stroke that creates a sophisticated, athletic, and modern aesthetic. Its tall, narrow letterforms and clean lines give it a strong, authoritative presence suitable for headlines and branding.\",\n\t\"Alumni Sans Pinstripe\": \"Alumni Sans Pinstripe is an ultra-thin, condensed sans-serif font that exudes a modern, elegant, and minimalist aesthetic. Its extremely light weight and tall, narrow letterforms create a sophisticated and airy feel, making it ideal for high-end display use.\",\n\t\"Alumni Sans Sc\": \"Alumni Sans SC is a condensed, modern sans-serif font with a tall x-height and a clean, athletic aesthetic. Its narrow proportions and uniform stroke weight give it a sophisticated yet high-impact look suitable for headlines and branding.\",\n\t\"Alyamama\": \"A refined serif font featuring a calligraphic influence with sharp, angular terminals and a medium weight that strikes a balance between classic elegance and modern clarity.\",\n\t\"Amarante\": \"Amarante is a distinctive Art Nouveau-inspired display font featuring elegant, elongated curves and flared terminals. Its medium weight and organic, calligraphic shapes evoke a sophisticated, vintage, and slightly whimsical mood.\",\n\t\"Amaranth\": \"Amaranth is a friendly, upright sans-serif font with a playful personality, characterized by its distinctive teardrop-shaped curves and slightly flared stroke endings. Its medium weight and organic, fluid letterforms give it a modern yet approachable feel suitable for display use.\",\n\t\"Amarna\": \"Amarna is a rustic, hand-drawn display font with a medium weight and an organic, chiseled feel. Its irregular, slightly jagged edges and uneven strokes evoke an ancient, calligraphic, or stone-carved aesthetic.\",\n\t\"Amatic Sc\": \"Amatic SC is a whimsical, hand-drawn display font featuring tall, narrow letterforms and a playful, informal mood. Its irregular, sketchy lines and condensed proportions give it a charming, organic feel suitable for creative and casual designs.\",\n\t\"Americaine\": \"Americaine is a condensed, high-contrast serif font with a classic and elegant feel, featuring tall letterforms and sharp, flat serifs. Its narrow proportions and dramatic stroke variation give it a sophisticated, editorial look suitable for headlines.\",\n\t\"Amethysta\": \"Amethysta is a classic wedge-serif typeface with a medium weight that balances elegance and readability. It features sharp, triangular serifs and a moderate contrast between thick and thin strokes, giving it a sophisticated yet sturdy appearance.\",\n\t\"Amiamie\": \"A friendly, medium-weight sans-serif display font with a hand-drawn feel, featuring rounded terminals and slightly irregular stroke widths that create a playful and approachable mood.\",\n\t\"Amiko\": \"Amiko is a clean, modern sans-serif typeface with a balanced weight and high legibility. It features open apertures and a neutral, professional mood, making it well-suited for both body text and UI design.\",\n\t\"Amiri\": \"Amiri is a classical serif font with a calligraphic influence, featuring high contrast between thick and thin strokes and elegant, sharp serifs. It conveys a sophisticated and traditional mood, characterized by its fluid, organic curves and distinctively large, circular tittle dots.\",\n\t\"Amiri Quran\": \"Amiri Quran is a classical serif font with a traditional, calligraphic feel, featuring high contrast between thick and thin strokes and elegant, rounded terminals. Its sophisticated and scholarly mood is emphasized by its refined proportions and distinct, sharp serifs.\",\n\t\"Amita\": \"Amita is a graceful, calligraphic display font that blends Latin and Devanagari influences, featuring fluid, rhythmic strokes and a medium weight. Its elegant curves and sharp terminals create a sophisticated yet approachable mood, reminiscent of traditional handwriting.\",\n\t\"Amulya\": \"Amulya is a clean, geometric sans-serif font with a modern and approachable feel, featuring open counters and a medium weight. Its design is characterized by balanced proportions and subtle, friendly curves, making it highly legible for both display and body text.\",\n\t\"Anaheim\": \"Anaheim is a geometric sans-serif font with a clean, modern aesthetic, featuring a light-to-medium weight and open apertures. Its tall x-height and balanced proportions give it a professional yet approachable feel, suitable for both display and body text.\",\n\t\"Ancizar Sans\": \"Ancizar Sans is a clean, humanist sans-serif font with a medium weight that balances modern clarity with a friendly, approachable mood. It features subtle calligraphic influences, seen in the slightly flared stroke endings and the organic, diamond-shaped tittle on the 'i'.\",\n\t\"Ancizar Serif\": \"Ancizar Serif is a contemporary serif typeface with a medium weight and a sophisticated, scholarly mood. It features sharp, wedge-like serifs and calligraphic details, such as the diamond-shaped tittle on the 'i', which give it a distinct, artisanal character.\",\n\t\"Andada Pro\": \"Andada Pro is a slab-serif typeface with a sturdy, organic feel, featuring thick, wedge-shaped serifs and a medium weight that balances classic elegance with modern readability.\",\n\t\"Andika\": \"Andika is a clean, sans-serif font designed for literacy, featuring a friendly and legible style with subtle calligraphic touches in its stroke endings. Its clear, open letterforms and balanced weight create a modern yet approachable feel, specifically optimized for readability.\",\n\t\"Anek Bangla\": \"Anek Bangla is a clean, modern sans-serif font with a medium weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Anek Devanagari\": \"A clean, modern sans-serif typeface with a medium weight and a neutral, professional mood. It features open apertures and a high x-height, ensuring excellent legibility for both display and body text.\",\n\t\"Anek Gujarati\": \"Anek Gujarati is a clean, modern sans-serif font with a medium weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Anek Gurmukhi\": \"Anek Gurmukhi is a clean, modern sans-serif font with a medium weight and a professional, approachable mood. It features open apertures and subtle calligraphic influences in its terminal strokes, ensuring high legibility for both display and body text.\",\n\t\"Anek Kannada\": \"Anek Kannada is a clean, modern sans-serif typeface with a medium weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Anek Latin\": \"Anek Latin is a contemporary sans-serif typeface with a clean, geometric structure and a friendly, approachable mood. It features open apertures and subtle calligraphic touches, such as the slightly flared terminals, which give it a distinct and modern personality.\",\n\t\"Anek Malayalam\": \"A clean and modern sans-serif typeface with a medium weight, featuring open apertures and a neutral, highly legible design suitable for both display and body text.\",\n\t\"Anek Odia\": \"Anek Odia is a clean, modern sans-serif font with a medium weight and a professional, approachable mood. It features open apertures and a high x-height, ensuring excellent legibility for both display and body text.\",\n\t\"Anek Tamil\": \"A modern, clean sans-serif font with a medium weight and a professional, approachable mood. It features subtle calligraphic influences, seen in the slight tapering of strokes and the open counters, which enhance its legibility and contemporary feel.\",\n\t\"Anek Telugu\": \"Anek Telugu is a clean, modern sans-serif typeface with a balanced weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Angkor\": \"Angkor is a heavy, slab-serif display font with a bold and sturdy presence, featuring thick strokes and blocky terminals. Its slightly irregular, hand-carved feel gives it a rustic and historic mood, reminiscent of traditional stone inscriptions.\",\n\t\"Annapurna Sil\": \"Annapurna SIL is a classic serif font with a traditional, scholarly feel, featuring moderate stroke contrast and sharp, well-defined serifs. Its balanced proportions and clear letterforms make it highly legible and professional, suitable for academic or literary body text.\",\n\t\"Annie Use Your Telescope\": \"Annie Use Your Telescope is a casual, handwritten font with a light weight and a whimsical, personal feel. It features irregular, tall letterforms with a slight tilt and uneven baselines, giving it a charmingly unpolished and youthful appearance.\",\n\t\"Anonymous Pro\": \"Anonymous Pro is a clean, monospaced sans-serif font with a technical and utilitarian feel, featuring a regular weight and high legibility. Its design is characterized by fixed-width characters and subtle geometric details, making it ideal for coding and professional data display.\",\n\t\"Anta\": \"Anta is a modern, geometric sans-serif display font with a futuristic, techno-inspired aesthetic. It features unique, angular letterforms with distinct cutouts and rounded outer corners that give it a sleek, digital appearance.\",\n\t\"Antic\": \"Antic is a slim, sans-serif display font with a modern, clean aesthetic and subtle calligraphic influences. It features high-waisted letterforms and slightly flared stroke endings that give it a sophisticated yet approachable feel.\",\n\t\"Antic Didone\": \"Antic Didone is a refined serif font featuring high contrast between thick and thin strokes, giving it an elegant, classic, and scholarly appearance. Its tall x-height and sharp, hairline serifs create a sophisticated and modern aesthetic suitable for editorial design.\",\n\t\"Antic Slab\": \"Antic Slab is a clean, modern slab-serif font featuring a light weight and a tall x-height that gives it an airy, contemporary feel. Its design combines geometric structures with subtle, blocky serifs, making it highly legible and sophisticated for both headlines and body text.\",\n\t\"Anton\": \"Anton is a bold, condensed sans-serif display font with a strong, modern presence. It features thick strokes and tight spacing, making it ideal for high-impact headlines and advertising.\",\n\t\"Anton Sc\": \"Anton SC is a bold, condensed sans-serif display font with a strong, impactful presence. Its tall, narrow letterforms and heavy weight create a modern, industrial feel suitable for headlines and advertising.\",\n\t\"Antonio\": \"Antonio is a bold, condensed sans-serif font with a modern and professional feel. Its tall x-height and narrow proportions make it ideal for high-impact headlines and space-efficient displays.\",\n\t\"Anuphan\": \"Anuphan is a clean, modern sans-serif font with a light-to-medium weight and a professional, approachable mood. It features open apertures and subtle, elegant curves in the letter joints, giving it a contemporary and highly legible appearance.\",\n\t\"Anybody\": \"Anybody is a versatile, modern sans-serif font with a clean, geometric structure and a medium weight. It features a neutral yet friendly mood, characterized by its open apertures and balanced proportions that ensure high legibility.\",\n\t\"Aoboshi One\": \"Aoboshi One is a bold, high-contrast serif font that blends classic elegance with a modern, geometric feel. It features distinctive slab-like serifs and perfectly circular counters, giving it a clean yet authoritative presence.\",\n\t\"Apfel Grotezk\": \"Apfel Grotezk is a clean, geometric sans-serif font with a modern and utilitarian feel, featuring a medium weight and balanced proportions. Its design is characterized by circular curves and sharp, straight terminals, giving it a contemporary and approachable aesthetic.\",\n\t\"Ar One Sans\": \"AR One Sans is a clean, modern sans-serif typeface with a medium weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Arapey\": \"Arapey is an elegant, high-contrast serif font with a classic, sophisticated feel reminiscent of Bodoni styles. It features thin, delicate hairlines paired with bold thick strokes and soft, rounded terminals that give it a graceful and distinguished appearance.\",\n\t\"Arbutus\": \"Arbutus is a heavy, slab-serif display font with a rugged, hand-drawn feel, featuring irregular, notched edges and a sturdy, vintage-inspired aesthetic. Its bold weight and quirky, uneven terminals give it a playful yet rustic character suitable for headlines.\",\n\t\"Arbutus Slab\": \"Arbutus Slab is a sturdy slab-serif typeface with a classic, academic feel, featuring heavy, rectangular serifs and a medium weight. Its generous spacing and distinct letterforms provide a balanced, authoritative look suitable for both headlines and body text.\",\n\t\"Arcane\": \"Arcane is a bold, experimental display font featuring a futuristic and mystical aesthetic with intricate, interlocking loops and sharp, geometric terminals. Its heavy weight and abstract, runic-inspired letterforms create a sense of mystery and high-concept design.\",\n\t\"Architects Daughter\": \"Architects Daughter is a casual, handwritten display font that mimics the neat, blocky printing of architectural blueprints. It features a medium weight with slightly irregular, rounded strokes that convey a friendly, personal, and creative mood.\",\n\t\"Archivo\": \"Archivo is a grotesque sans-serif typeface with a clean, utilitarian aesthetic and a medium weight that feels both modern and professional. It features high x-heights and open apertures, making it highly legible for both digital and print applications.\",\n\t\"Archivo Black\": \"Archivo Black is a heavy, grotesque sans-serif font with a bold and commanding presence, designed for high-impact headlines. Its wide proportions and clean, geometric lines give it a modern, industrial feel that is both professional and authoritative.\",\n\t\"Archivo Narrow\": \"Archivo Narrow is a clean, grotesque sans-serif font with a condensed width and a professional, utilitarian mood. It features high x-heights and uniform stroke weights, making it highly legible and efficient for space-constrained digital and print layouts.\",\n\t\"Are You Serious\": \"This is a whimsical display font with a hand-drawn, illustrative feel, featuring irregular, rough edges and playful curls on the terminals. Its medium weight and bouncy baseline create a quirky, storybook-like mood that is both charming and informal.\",\n\t\"Aref Ruqaa\": \"Aref Ruqaa is a calligraphic display font that blends traditional Arabic Ruq'ah aesthetics with Latin letterforms, featuring high-contrast strokes and elegant, fluid terminals. Its hand-drawn quality and sharp, angular serifs evoke a classic yet artistic mood, making it ideal for headlines and decorative text.\",\n\t\"Aref Ruqaa Ink\": \"Aref Ruqaa Ink is a calligraphic display font that blends classical Arabic Ruq\u2019ah aesthetics with Latin letterforms, featuring elegant, fluid strokes and sharp, ink-like terminals. Its high-contrast weight and organic curves evoke a sophisticated, handcrafted feel suitable for artistic and literary contexts.\",\n\t\"Arima\": \"Arima is a soft, calligraphic display font featuring rounded terminals and a gentle, organic flow that evokes a friendly and approachable mood. Its design blends informal handwriting styles with elegant, curved strokes, making it both legible and distinctively stylish.\",\n\t\"Arima Madurai\": \"Arima Madurai is a soft, calligraphic display font with a friendly and organic feel, featuring rounded terminals and a gentle, handwritten rhythm. Its medium weight and elegant, flowing curves give it a modern yet approachable aesthetic suitable for headlines and branding.\",\n\t\"Arimo\": \"Arimo is a clean, modern sans-serif font with a neutral and professional feel, featuring balanced proportions and high legibility. It is characterized by its straightforward, geometric structure and consistent stroke weight, making it highly versatile for both digital and print interfaces.\",\n\t\"Arizonia\": \"Arizonia is a flowing, calligraphic script font with a romantic and elegant feel, featuring high-contrast strokes and sweeping flourishes. Its decorative, hand-lettered style is characterized by fluid connections and a distinct, artistic flair.\",\n\t\"Ark Es\": \"Ark Es is a bold, experimental display font with a futuristic, liquid-like aesthetic characterized by rounded, bulbous terminals and interconnected, organic shapes. Its heavy weight and unconventional, sci-fi-inspired letterforms create a high-impact, tech-oriented mood.\",\n\t\"Armata\": \"Armata is a low-contrast, sans-serif typeface with a modern and sturdy feel, featuring subtle calligraphic touches in its terminal strokes. Its open apertures and balanced proportions make it highly legible for both display and body text.\",\n\t\"Array\": \"Array is a bold, retro-style display font composed entirely of circular dots arranged in a grid-like pattern. Its pixelated, dot-matrix aesthetic evokes a nostalgic, digital feel reminiscent of early computer displays or scoreboard signage.\",\n\t\"Arsenal\": \"Arsenal is a semi-serif typeface with a professional and modern feel, featuring narrow proportions and subtle, sharp flares at the stroke ends. Its clean lines and economical width make it highly legible and efficient for both body text and display use.\",\n\t\"Arsenal Sc\": \"Arsenal SC is a semi-serif typeface with a professional and modern feel, featuring narrow proportions and subtle, sharp terminals. Its clean lines and light weight give it an elegant, utilitarian aesthetic suitable for clear communication.\",\n\t\"Artifika\": \"Artifika is a calligraphic serif font with a medium weight that blends classic elegance with a hand-crafted, organic feel. It features distinctive flared terminals, subtle irregularities in stroke width, and a tall x-height that gives it a friendly yet sophisticated character.\",\n\t\"Arvo\": \"Arvo is a geometric slab-serif typeface that balances a sturdy, professional feel with high readability. It features strong, blocky serifs and a medium weight, making it suitable for both digital displays and print.\",\n\t\"Arya\": \"Arya is a high-contrast sans-serif font with a modern, elegant feel, featuring sharp terminals and a distinct calligraphic influence in its stroke transitions.\",\n\t\"Asap\": \"Asap is a contemporary sans-serif font featuring rounded corners and a friendly, approachable mood. Its design is characterized by a subtle softness and uniform stroke weight, making it highly legible and modern.\",\n\t\"Asap Condensed\": \"Asap Condensed is a contemporary sans-serif font featuring a narrow width and subtly rounded corners that provide a soft, approachable feel. Its clean lines and uniform stroke weight create a modern, highly legible aesthetic suitable for space-efficient designs.\",\n\t\"Asar\": \"Asar is a medium-weight serif font with a hand-drawn, calligraphic feel, featuring irregular stroke widths and soft, rounded terminals. Its organic, slightly rustic aesthetic gives it a classic yet approachable and warm personality.\",\n\t\"Asimovian\": \"A bold, futuristic sans-serif display font featuring geometric curves and unique, open-ended letterforms. Its sleek, sci-fi aesthetic is characterized by a uniform stroke weight and a modern, high-tech feel.\",\n\t\"Aspekta Variable\": \"Aspekta Variable is a clean, modern sans-serif font with a geometric influence, featuring a medium weight and high legibility. Its balanced proportions and open apertures create a professional yet approachable aesthetic suitable for both digital and print interfaces.\",\n\t\"Asset\": \"Asset is a bold, high-contrast display serif font with an ultra-wide, expanded stance that evokes a sense of stability and authority. Its design features sharp, flared terminals and a dramatic weight distribution, giving it a classic yet powerful aesthetic reminiscent of mid-20th-century financial engraving.\",\n\t\"Assistant\": \"Assistant is a clean, modern sans-serif font with a light-to-medium weight and an open, airy feel. Its simple, geometric forms and generous spacing create a highly legible and professional appearance suitable for both digital and print interfaces.\",\n\t\"Asta Sans\": \"Asta Sans is a clean, geometric sans-serif typeface with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible and versatile for both display and body text.\",\n\t\"Astloch\": \"Astloch is a monolinear display font with a delicate, whimsical feel, featuring elongated, spindly letterforms and intricate, swirling flourishes. Its design blends Art Nouveau influences with a modern, geometric structure, resulting in a unique, decorative aesthetic.\",\n\t\"Asul\": \"Asul is a semi-serif display font with a classic yet slightly rustic feel, featuring flared stroke endings and subtle calligraphic influences. Its medium weight and organic, slightly irregular curves give it a distinctive, hand-crafted personality suitable for headlines.\",\n\t\"Athiti\": \"Athiti is a clean, modern sans-serif font with a light-to-medium weight and a geometric structure. It features unique, subtle curves at the base of vertical strokes and square-cut terminals, giving it a professional yet approachable feel.\",\n\t\"Atkinson Hyperlegible\": \"Atkinson Hyperlegible is a clean, modern sans-serif font designed for maximum readability, featuring distinct character shapes and exaggerated forms to aid low-vision readers. Its balanced weight and functional aesthetic provide a professional yet highly accessible appearance.\",\n\t\"Atkinson Hyperlegible Mono\": \"A clean, monospaced sans-serif font designed for maximum readability, featuring distinct character shapes and a functional, modern aesthetic. Its uniform stroke weight and generous spacing create a clear, professional look optimized for low-vision accessibility.\",\n\t\"Atkinson Hyperlegible Next\": \"A clean, modern sans-serif font designed for maximum legibility, featuring a medium weight and distinct character shapes to aid readability. Its professional yet approachable mood is defined by open counters and clear, functional letterforms.\",\n\t\"Atma\": \"Atma is a playful, hand-drawn display font featuring irregular, marker-like strokes and a casual, energetic mood. Its slightly wobbly lines and varying weights give it a friendly, informal character suitable for creative and youthful designs.\",\n\t\"Atomic Age\": \"Atomic Age is a bold, retro-futuristic display font inspired by 1950s sci-fi aesthetics, featuring unique geometric letterforms with rounded tops and sharp, mechanical angles. Its distinct look is characterized by unconventional crossbars and a mid-century modern feel that evokes the spirit of the space age.\",\n\t\"Aubrey\": \"Aubrey is a whimsical, Art Nouveau-inspired display font featuring a light-to-medium weight and a playful, hand-drawn feel. Its unique character is defined by irregular, organic curves, flared terminals, and an eccentric, decorative charm.\",\n\t\"Audio Junglism\": \"This is a bold, futuristic display font featuring ultra-rounded, tubular letterforms with a distinct techno or sci-fi aesthetic. The lowercase characters are characterized by their wide, horizontal stretch and thick black outlines, creating a bubbly yet modern look.\",\n\t\"Audiowide\": \"Audiowide is a futuristic, techno-inspired display font featuring a wide, geometric structure with soft, rounded corners. Its tubular forms and lack of traditional serifs create a sleek, high-tech aesthetic reminiscent of science fiction and modern electronics.\",\n\t\"Aujournuit\": \"Aujournuit is an elegant, high-contrast serif display font with a condensed structure and a sophisticated, classic mood. It features sharp, delicate serifs and distinctive calligraphic touches, such as the teardrop terminals and the unique, elongated descender on the 'j'.\",\n\t\"Author\": \"This is a clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features distinct angled terminals on the ascenders and descenders, giving it a subtle, contemporary edge.\",\n\t\"Autour One\": \"Autour One is a playful, medium-weight display font with a hand-drawn feel, featuring rounded terminals and slightly irregular, organic shapes that give it a friendly and informal character.\",\n\t\"Average\": \"Average is a classic serif typeface with a neutral, balanced appearance and a medium weight. It features subtle, sharp serifs and a high x-height, making it highly legible and professional for body text.\",\n\t\"Average Sans\": \"Average Sans is a clean, neutral sans-serif typeface with a regular weight and a balanced, professional mood. It features open apertures and a high x-height, making it highly legible and versatile for both digital and print body text.\",\n\t\"Averia Gruesa Libre\": \"Averia Gruesa Libre is a unique display font with a soft, weathered appearance, featuring rounded terminals and slightly irregular, organic strokes. Its medium-heavy weight and blurred edges create a friendly, nostalgic mood that mimics the look of aged printing or worn rubber stamps.\",\n\t\"Averia Libre\": \"Averia Libre is a unique, organic serif font featuring soft, rounded edges and a slightly irregular, hand-drawn feel. Its smudged, weathered appearance gives it a warm, approachable, and nostalgic mood, as if it were created by averaging multiple typefaces together.\",\n\t\"Averia Sans Libre\": \"Averia Sans Libre is a unique sans-serif font with a soft, weathered appearance, featuring rounded terminals and slightly irregular strokes that give it a friendly, organic, and hand-drawn feel. Its design is based on the average of many other fonts, resulting in a balanced yet casual aesthetic that works well for approachable and informal designs.\",\n\t\"Averia Serif Libre\": \"Averia Serif Libre is a unique serif font featuring soft, rounded edges and a slightly irregular, organic feel that mimics the look of weathered or averaged letterforms. It conveys a warm, approachable, and vintage mood while maintaining a clear, readable structure.\",\n\t\"Azeret Mono\": \"Azeret Mono is a clean, monospaced sans-serif font with a modern, technical aesthetic. It features a medium weight and distinct geometric shapes, such as the sharp, angled terminals on the 't' and 'z', giving it a precise and digital feel.\",\n\t\"B612\": \"B612 is a highly legible, functional sans-serif font designed for digital cockpits, featuring a medium weight and a clean, technical aesthetic. Its open counters and distinct character shapes ensure maximum readability in high-stress, low-visibility environments.\",\n\t\"B612 Mono\": \"B612 Mono is a highly legible, monospaced sans-serif font designed for technical environments, featuring a clean, utilitarian aesthetic with distinct character shapes and a medium weight. Its open apertures and uniform stroke widths provide a modern, professional feel optimized for clarity in digital displays.\",\n\t\"Babylonica\": \"Babylonica is a fluid, expressive script font with a hand-drawn, calligraphic feel, featuring rough, textured edges that mimic ink on paper. Its elegant, sweeping strokes and varying line weights create a sophisticated yet organic mood, perfect for artistic or historical themes.\",\n\t\"Bacasime Antique\": \"Bacasime Antique is an elegant, high-contrast serif font with a classic and sophisticated feel. It features sharp, delicate serifs and a vertical axis, reminiscent of traditional Didone or transitional typefaces.\",\n\t\"Bad Script\": \"Bad Script is a casual, handwritten font with a light weight and a slight italic slant, giving it a personal and informal feel. Its irregular strokes and rounded terminals mimic natural penmanship, making it ideal for projects that require a friendly, human touch.\",\n\t\"Badeen Display\": \"Badeen Display is an ultra-bold, blocky sans-serif font with a heavy, industrial feel and minimal negative space. Its squat, rectangular letterforms and tiny counters create a powerful, monolithic aesthetic suitable for high-impact headlines.\",\n\t\"Bagel Fat One\": \"Bagel Fat One is an ultra-bold, rounded display font with a playful and friendly mood. Its thick, soft letterforms and minimal negative space give it a bubbly, doughy appearance perfect for casual and fun designs.\",\n\t\"Bagnard\": \"Bagnard is a bold, high-contrast serif font with a classic yet slightly rugged feel, featuring sharp, wedge-like serifs and distinctive ball terminals. Its sturdy construction and unique letterforms, like the double-story 'g', evoke a sense of historical craftsmanship and authority.\",\n\t\"Bahiana\": \"Bahiana is a condensed, rustic display font with a hand-cut, woodblock aesthetic, featuring irregular widths and sharp, angular counters. Its tall, rhythmic letterforms evoke a vibrant, folk-art mood that is both energetic and informal.\",\n\t\"Bahianita\": \"Bahianita is a rustic, condensed display font with a hand-cut, woodblock aesthetic featuring irregular, angular strokes and a playful, rhythmic energy. Its tall, narrow letterforms and blocky terminals give it a bold, artisanal feel suitable for expressive headlines.\",\n\t\"Bai Jamjuree\": \"Bai Jamjuree is a modern, geometric sans-serif font with a clean and professional aesthetic. It features a medium weight with distinct, squared-off letterforms and open counters, giving it a balanced and highly legible appearance.\",\n\t\"Bakbak One\": \"Bakbak One is a heavy, extra-bold sans-serif display font with a modern and impactful feel. It features thick, geometric strokes and tight spacing, making it ideal for strong headlines and branding.\",\n\t\"Ballet\": \"Ballet is an elegant, high-contrast Spencerian script font featuring dramatic, sweeping flourishes and a sophisticated, formal mood. Its delicate hairlines and bold downstrokes create a rhythmic, calligraphic aesthetic reminiscent of classical 19th-century penmanship.\",\n\t\"Baloo 2\": \"Baloo 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bulbous curves and a high x-height, making it highly legible and approachable for casual designs.\",\n\t\"Baloo Bhai 2\": \"Baloo Bhai 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bulbous letterforms and a generous x-height, making it highly legible and approachable.\",\n\t\"Baloo Bhaijaan 2\": \"Baloo Bhaijaan 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bubbly letterforms and a generous x-height, making it highly legible and approachable.\",\n\t\"Baloo Bhaina 2\": \"Baloo Bhaina 2 is a friendly, rounded sans-serif font with a playful and modern feel, featuring soft terminals and a generous x-height that ensures high legibility.\",\n\t\"Baloo Chettan 2\": \"Baloo Chettan 2 is a friendly, rounded sans-serif font with a medium weight and a playful, modern feel. Its soft terminals and generous curves give it a warm, approachable character that is highly legible.\",\n\t\"Baloo Da 2\": \"Baloo Da 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bulbous letterforms and a consistent stroke weight that gives it a warm, approachable character.\",\n\t\"Baloo Paaji 2\": \"Baloo Paaji 2 is a friendly, rounded sans-serif font with a playful and modern feel, featuring soft terminals and a generous x-height that ensures high legibility.\",\n\t\"Baloo Tamma 2\": \"Baloo Tamma 2 is a friendly, rounded sans-serif font with a playful yet modern feel. It features soft, bulbous terminals and a generous x-height, making it highly legible and approachable.\",\n\t\"Baloo Tammudu 2\": \"Baloo Tammudu 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bulbous terminals and a generous x-height, making it highly legible and approachable.\",\n\t\"Baloo Thambi 2\": \"Baloo Thambi 2 is a friendly, rounded sans-serif font with a playful and modern feel. It features soft, bulbous terminals and a generous x-height, making it highly legible and approachable for casual or child-friendly designs.\",\n\t\"Balsamiq Sans\": \"Balsamiq Sans is a casual, handwritten-style sans-serif font with a playful and friendly mood. It features rounded terminals, irregular stroke widths, and a hand-drawn aesthetic that mimics the look of whiteboard markers or comic book lettering.\",\n\t\"Balthazar\": \"Balthazar is a contemporary serif typeface with a tall x-height and a classic, scholarly feel. It features sharp, wedge-like serifs and a slight vertical stress, giving it a refined yet approachable appearance suitable for long-form text.\",\n\t\"Bangers\": \"Bangers is a bold, high-energy display font inspired by mid-century comic book aesthetics, featuring thick, hand-drawn strokes and a slight italic lean. Its irregular edges and condensed letterforms create a loud, playful, and punchy mood perfect for headlines.\",\n\t\"Bankara Grotesk\": \"Bankara Grotesk is a low-resolution pixel font with a retro, digital aesthetic, featuring blocky, monospaced letterforms. Its jagged edges and minimalist construction evoke a nostalgic, early computing or 8-bit gaming mood.\",\n\t\"Barlow\": \"Barlow is a clean, low-contrast sans-serif font with a modern, utilitarian feel. It features slightly rounded corners and a grotesque-inspired structure that makes it highly legible and professional.\",\n\t\"Barlow Condensed\": \"Barlow Condensed is a modern, low-contrast sans-serif font with a clean, industrial feel and slightly rounded corners. Its narrow proportions and tall x-height make it highly legible and efficient for space-constrained designs.\",\n\t\"Barlow Semi Condensed\": \"Barlow Semi Condensed is a clean, low-contrast sans-serif font with a modern, utilitarian feel. Its slightly narrowed proportions and rounded corners give it a friendly yet professional appearance suitable for technical or informational displays.\",\n\t\"Barlowfold\": \"Barlowfold is a bold, decorative display font featuring a distorted, wavy aesthetic that gives it a liquid or psychedelic feel. Its irregular, hand-drawn outlines and melting letterforms create a playful, trippy, and unconventional mood.\",\n\t\"Barriecito\": \"Barriecito is a playful, hand-drawn display font featuring irregular, bold strokes and a whimsical, amateur aesthetic. Its uneven baselines and varying letter widths give it a spontaneous, energetic character suitable for informal designs.\",\n\t\"Barrio\": \"Barrio is a bold, hand-drawn display font with a playful and rhythmic feel, characterized by its irregular letter heights and organic, slightly wobbly strokes. Its amateur, street-art-inspired aesthetic gives it a vibrant, informal personality suitable for creative and energetic designs.\",\n\t\"Basement Grotesque\": \"A heavy, ultra-bold sans-serif display font with a brutalist and contemporary feel, featuring tight letter spacing and high-impact, blocky letterforms.\",\n\t\"Basic\": \"This is a bold, sans-serif display font with a hand-drawn, organic feel characterized by slightly irregular, rough edges. It conveys a casual and approachable mood while maintaining high legibility through its thick, uniform stroke weight.\",\n\t\"Baskervville\": \"Baskervville is a classic transitional serif font featuring high contrast between thick and thin strokes, sharp serifs, and a sophisticated, academic mood. Its elegant proportions and traditional structure make it ideal for formal body text and literary applications.\",\n\t\"Baskervville Sc\": \"Baskervville SC is a classic transitional serif font featuring high stroke contrast and sharp, elegant serifs that convey a formal and academic mood. Its refined proportions and traditional structure make it ideal for sophisticated editorial and book design.\",\n\t\"Battambang\": \"Battambang is a clean, traditional serif font with a medium weight and a formal, academic mood. It features sharp, flat serifs and a high x-height, making it highly legible for body text and professional documents.\",\n\t\"Baumans\": \"Baumans is a geometric, sans-serif display font with a modern, technical feel, characterized by its rounded corners and distinctive open counters. Its uniform stroke weight and futuristic aesthetic make it ideal for headlines and creative branding.\",\n\t\"Bayon\": \"Bayon is a bold, condensed sans-serif display font with a modern, industrial feel, featuring high-contrast thick strokes and tight spacing for a powerful visual impact.\",\n\t\"Bbb Karrik\": \"A bold, geometric sans-serif font with a modern and sturdy feel, featuring unique, slightly flared terminals and a high x-height for strong legibility.\",\n\t\"Bbh Bartle\": \"Bbh Bartle is an ultra-bold, wide display sans-serif font with a futuristic, industrial feel. It features heavy, blocky letterforms with rounded outer corners and distinctive horizontal gaps in characters like 'B' and 'E', giving it a high-tech, stencil-like appearance.\",\n\t\"Bbh Bogle\": \"Bbh Bogle is a bold, condensed sans-serif display font with a modern and impactful feel. It features thick, uniform strokes and tight letter spacing, making it ideal for strong headlines and branding.\",\n\t\"Bbh Hegarty\": \"Bbh Hegarty is an ultra-bold, geometric sans-serif display font with a modern and impactful feel. It features tight letter spacing, thick blocky strokes, and distinctive angular cuts on characters like the 't' and 'y'.\",\n\t\"Bbh Sans Bartle\": \"This is an ultra-bold, extended sans-serif display font with a heavy, industrial feel. Its extremely wide proportions and thick strokes create a powerful, modern aesthetic suitable for high-impact headlines.\",\n\t\"Bbh Sans Bogle\": \"This is a bold, condensed sans-serif display font with a modern and impactful feel. It features tall, narrow letterforms with clean lines and tight spacing, making it ideal for strong headlines and branding.\",\n\t\"Bbh Sans Hegarty\": \"This is an ultra-bold, heavy sans-serif display font with a modern and impactful feel. It features tight letter spacing, thick strokes, and distinctive geometric counters, particularly visible in the lowercase 'a' and 'g'.\",\n\t\"Bdo Grotesk\": \"BDO Grotesk is a clean, modern sans-serif font with a medium weight and a professional, neutral mood. It features geometric shapes and open apertures, making it highly legible and versatile for corporate or digital interfaces.\",\n\t\"Be Vietnam Pro\": \"Be Vietnam Pro is a clean, modern neo-grotesque sans-serif font featuring a medium weight and a professional, neutral mood. It is characterized by its high x-height, open apertures, and geometric letterforms that ensure excellent legibility for both display and body text.\",\n\t\"Beast\": \"This is a heavy, ultra-bold display font with a digital, pixelated aesthetic and rounded corners. Its blocky, fragmented structure creates a modern, tech-inspired, and playful mood.\",\n\t\"Beau Rivage\": \"Beau Rivage is an elegant, decorative script font featuring fluid, calligraphic strokes and high-contrast line weights. Its sophisticated and romantic mood is defined by sweeping flourishes, ornate capital letters, and a graceful, rhythmic flow.\",\n\t\"Bebas Neue\": \"Bebas Neue is a bold, condensed sans-serif display font characterized by its clean lines and tall, narrow letterforms. It conveys a modern, impactful, and authoritative mood, making it ideal for headlines and professional branding.\",\n\t\"Beiruti\": \"Beiruti is a friendly, rounded sans-serif font with a medium weight and a soft, approachable mood. It features smooth, organic curves and circular terminals that give it a modern yet playful appearance.\",\n\t\"Belanosima\": \"Belanosima is a bold, geometric sans-serif font with a friendly and modern feel, characterized by its soft, rounded terminals and high-contrast circular forms. Its thick strokes and clean lines give it a playful yet professional appearance suitable for headlines and branding.\",\n\t\"Belgrano\": \"Belgrano is a classic serif typeface with a sturdy, medium weight and a professional, authoritative mood. It features sharp, triangular serifs and a large x-height, making it highly legible for both display and text use.\",\n\t\"Bellefair\": \"Bellefair is an elegant, high-contrast serif font with a tall x-height and delicate, sharp terminals that evoke a sophisticated and classic feel. Its slender proportions and graceful curves make it ideal for luxury branding and editorial headlines.\",\n\t\"Belleza\": \"Belleza is an elegant sans-serif font with high-contrast strokes and flared terminals that give it a sophisticated, fashion-inspired feel. Its classic proportions and delicate curves evoke a sense of luxury and timeless beauty.\",\n\t\"Bellota\": \"Bellota is a friendly, low-contrast sans-serif font featuring playful, rounded terminals and unique spurred details. Its light weight and open curves give it a modern, whimsical, and approachable feel.\",\n\t\"Bellota Text\": \"Bellota Text is a friendly, low-contrast sans-serif font featuring rounded terminals and a playful, modern aesthetic. Its open counters and gentle curves give it a soft, approachable feel while maintaining excellent legibility for body text.\",\n\t\"Benchnine\": \"BenchNine is a condensed sans-serif font with a modern, clean aesthetic, featuring slightly rounded terminals and a tall x-height that gives it a friendly yet efficient feel.\",\n\t\"Benne\": \"Benne is a classic serif font with a medium weight and a scholarly, traditional feel. It features sharp, wedge-like serifs and a high stroke contrast that gives it an elegant, calligraphic quality.\",\n\t\"Bentham\": \"Bentham is a classic, high-contrast serif font with a traditional and scholarly feel, featuring sharp, triangular serifs and elegant, flowing curves. Its medium weight and refined proportions evoke the aesthetic of 19th-century book typography and academic publishing.\",\n\t\"Berkshire Swash\": \"Berkshire Swash is a bold, semi-sweet display font that blends a classic flair with whimsical, decorative flourishes. Its heavy weight and elegant swashes give it a charming, storybook feel that is both sophisticated and approachable.\",\n\t\"Berzulis Pizius\": \"This is a bold, playful display font featuring thick, rounded strokes and an abstract, almost calligraphic style. Its unconventional letterforms and fluid, interlocking curves create a whimsical and artistic mood.\",\n\t\"Besley\": \"Besley is a robust slab-serif font that combines a classic, authoritative feel with modern clarity, featuring thick, blocky serifs and a high x-height. Its sturdy construction and balanced proportions make it both highly legible and visually impactful for editorial use.\",\n\t\"Bespoke Sans\": \"Bespoke Sans is a clean, humanist sans-serif font with a medium weight that balances modern professionalism with a friendly, approachable mood. It features open apertures and subtle calligraphic influences, such as the angled terminals on the 's' and 'e', which enhance its readability and elegant character.\",\n\t\"Bespoke Serif\": \"Bespoke Serif is a classic, elegant serif font with a medium weight and a sophisticated, timeless mood. It features sharp, wedge-shaped serifs and a high-contrast stroke width that gives it a refined, editorial appearance.\",\n\t\"Bespoke Slab\": \"Bespoke Slab is a contemporary slab-serif typeface featuring a medium weight and a clean, professional aesthetic. It is characterized by its sturdy, rectangular serifs and open apertures, giving it a balanced and highly legible appearance suitable for both editorial and branding purposes.\",\n\t\"Bespoke Stencil\": \"Bespoke Stencil is a modern, medium-weight sans-serif display font characterized by its clean, geometric letterforms and distinct stencil-style gaps. Its minimalist aesthetic and industrial influence create a sophisticated yet functional mood suitable for contemporary branding.\",\n\t\"Betania Patmos\": \"A playful, monolinear script font with a friendly and informal mood, featuring rounded terminals and distinct, looped connections that mimic a schoolbook cursive style.\",\n\t\"Betania Patmos Gdl\": \"This is a simple, mono-line scrip t font designed for educational use, featuring up righ t lowercase letters with uniform weigh t and extended base line connections.\",\n\t\"Betania Patmos In\": \"A light-weight, casual script typeface with a friendly, monolinear stroke and a handwritten feel. It features rounded terminals and connected lower-case letters that create a flowing, approachable, and playful aesthetic.\",\n\t\"Betania Patmos In Gdl\": \"A monolinear, school-script style font with a playful and educational mood, featuring rounded terminals and distinct cursive-like connecting loops on the baseline.\",\n\t\"Beth Ellen\": \"Beth Ellen is a casual, handwritten script font with a bold weight and a personal, nostalgic feel. It features irregular, expressive strokes and a slight slant that mimics authentic penmanship.\",\n\t\"Bevan\": \"Bevan is a bold, heavy-weight slab serif display font that reimagines traditional 19th-century letterforms with a modern, high-impact feel. Its thick, blocky serifs and ultra-wide strokes create a powerful, sturdy presence suitable for headlines and posters.\",\n\t\"Bevellier\": \"Bevellier is a bold, condensed sans-serif font with a friendly and modern feel, characterized by its soft, rounded terminals and smooth, organic curves.\",\n\t\"Bhutuka Expanded One\": \"Bhutuka Expanded One is a wide, monolinear slab-serif font with a light weight and an airy, modern feel. Its extremely horizontal proportions and flat, rectangular serifs give it a distinct architectural and technical appearance.\",\n\t\"Bianzhidai\": \"This is a decorative, low-resolution pixel or bitmap font with a retro, digital aesthetic. Its characters are constructed from a coarse grid of dots, creating a textured, woven appearance that feels both nostalgic and experimental.\",\n\t\"Big Shoulders\": \"Big Shoulders is a condensed, sans-serif display font with a tall x-height and a modern, industrial feel. Its narrow proportions and bold weight make it ideal for high-impact headlines and space-efficient layouts.\",\n\t\"Big Shoulders Display\": \"Big Shoulders Display is a tall, condensed sans-serif font with a modern, industrial feel. It features high x-heights and narrow proportions, making it ideal for bold, space-efficient headlines.\",\n\t\"Big Shoulders Inline\": \"Big Shoulders Inline is a tall, condensed sans-serif display font featuring a distinctive triple-line decorative effect. Its narrow proportions and architectural structure give it a modern, industrial feel suitable for bold headlines.\",\n\t\"Big Shoulders Inline Display\": \"A tall, condensed sans-serif display font featuring a distinctive triple-line inline effect that creates a rhythmic, architectural feel. Its narrow proportions and geometric structure give it a modern, industrial, and high-impact aesthetic.\",\n\t\"Big Shoulders Inline Text\": \"A tall, condensed sans-serif display font featuring a distinctive triple-line inline effect that creates a rhythmic, architectural feel. Its narrow proportions and geometric structure give it a modern, industrial, and high-impact aesthetic.\",\n\t\"Big Shoulders Stencil\": \"Big Shoulders Stencil is a tall, condensed sans-serif display font with an industrial, utilitarian feel. It features a bold weight and distinct stencil-style gaps in the letterforms, giving it a modern, architectural aesthetic.\",\n\t\"Big Shoulders Stencil Display\": \"This is a tall, condensed sans-serif stencil font with a modern, industrial feel. It features high-contrast vertical strokes and clean, geometric gaps that give it a bold, architectural presence.\",\n\t\"Big Shoulders Stencil Text\": \"This is a tall, condensed sans-serif stencil font with a modern, industrial feel. It features narrow letterforms with clean, vertical cuts that create a rhythmic, utilitarian aesthetic.\",\n\t\"Big Shoulders Text\": \"Big Shoulders Text is a condensed sans-serif font with a tall x-height and a modern, industrial feel. Its narrow proportions and clean, geometric lines make it highly efficient for space-saving headlines while maintaining a bold, authoritative presence.\",\n\t\"Bigelow Rules\": \"Bigelow Rules is an eccentric, condensed display font with a whimsical and slightly spooky mood, featuring irregular stroke widths and playful, curly flourishes. Its hand-drawn, Victorian-inspired aesthetic gives it a unique, storybook character that is both charming and mysterious.\",\n\t\"Bigshot One\": \"Bigshot One is a bold, high-contrast display serif font with a playful and slightly irregular character. It features heavy, blocky serifs and unique, expressive terminals that give it a hand-drawn, vintage poster aesthetic.\",\n\t\"Bilbo\": \"Bilbo is a casual, handwritten script font with a playful and whimsical mood, featuring irregular, brush-like strokes and a slight italic lean. Its condensed letterforms and varying line weights give it a personal, informal character suitable for creative storytelling.\",\n\t\"Bilbo Swash Caps\": \"Bilbo Swash Caps is an elegant, handwritten script font featuring a light weight and a rhythmic, calligraphic flow. It conveys a friendly and personal mood through its decorative swashes and slightly condensed, upright letterforms.\",\n\t\"Biorhyme\": \"BioRhyme is a bold, slab-serif display font with a wide stance and a modern, mechanical feel. It features heavy, rectangular serifs and large open counters, giving it a sturdy and highly legible presence.\",\n\t\"Biorhyme Expanded\": \"BioRhyme Expanded is a bold, wide-set slab serif font with a modern, mechanical feel and distinctively flat, heavy serifs. Its generous horizontal proportions and uniform stroke weight give it a stable, authoritative presence suitable for display use.\",\n\t\"Birthstone\": \"Birthstone is an elegant, formal script font featuring fluid, calligraphic strokes with a medium weight and a classic, sophisticated mood. Its notable features include a strong italic slant, sharp terminals, and graceful loops that give it a hand-lettered, high-end feel.\",\n\t\"Birthstone Bounce\": \"Birthstone Bounce is an elegant, medium-weight script font with a playful, rhythmic energy. It features flowing, interconnected letters with varied baselines and decorative flourishes that give it a hand-lettered, celebratory feel.\",\n\t\"Biryani\": \"Biryani is a clean, geometric sans-serif typeface with a modern and professional feel, featuring monolinear strokes and open apertures. Its design is characterized by a high x-height and flat terminals, making it highly legible for both display and body text.\",\n\t\"Bitcount\": \"Bitcount is a retro-style pixel or dot-matrix display font composed of uniform circular points arranged on a grid. It evokes a nostalgic, digital aesthetic reminiscent of early computing and electronic signage.\",\n\t\"Bitcount Grid Double\": \"This is a retro-style pixel or dot-matrix display font, where each character is constructed from a grid of distinct, circular dots. It conveys a technical, digital, and nostalgic aesthetic reminiscent of early computer screens or LED signage.\",\n\t\"Bitcount Grid Double Ink\": \"This is a retro-style pixel or dot-matrix display font, where each character is constructed from a grid of distinct, solid black circles. It has a technical, digital aesthetic reminiscent of early computer screens or LED signage.\",\n\t\"Bitcount Grid Single\": \"A retro-style pixel or dot-matrix display font where each character is constructed from a grid of uniform, circular dots. It conveys a technical, digital, and nostalgic aesthetic reminiscent of early computing and LED signage.\",\n\t\"Bitcount Grid Single Ink\": \"A technical pixel-style display font where each character is constructed from a grid of distinct, circular dots. It has a retro-digital, monospaced appearance that feels both mechanical and playful.\",\n\t\"Bitcount Ink\": \"Bitcount Ink is a playful, pixel-inspired display font where each character is constructed from a grid of large, uniform circles. It has a retro-digital, lo-fi aesthetic that mimics early computer graphics or dot-matrix printing.\",\n\t\"Bitcount Prop Double\": \"A retro-inspired pixel or dot-matrix display font composed of distinct circular points, creating a technical, digital, and nostalgic aesthetic. The letterforms are bold and structured, mimicking low-resolution screen typography with a modern, clean execution.\",\n\t\"Bitcount Prop Double Ink\": \"This is a pixel-style display font where each character is constructed from a grid of large, distinct circles. It has a playful, retro-tech aesthetic with a bold weight and a unique 'double' dot structure that gives it a textured, mechanical feel.\",\n\t\"Bitcount Prop Single\": \"A retro-style pixel or dot-matrix display font composed of individual circular points, creating a digital, tech-focused aesthetic. Its proportional spacing and uniform dot size give it a clean, legible look reminiscent of early computer interfaces and LED signage.\",\n\t\"Bitcount Prop Single Ink\": \"This is a pixel-style display font where each character is constructed from a grid of distinct, circular dots. It has a retro, digital aesthetic that mimics early computer displays or dot-matrix printing.\",\n\t\"Bitcount Single\": \"Bitcount Single is a retro-style pixel or dot-matrix display font composed of individual circular points. It has a technical, digital aesthetic reminiscent of early computer displays and LED signage.\",\n\t\"Bitcount Single Ink\": \"Bitcount Single Ink is a retro-style pixel or dot-matrix display font composed of individual circular points. It conveys a nostalgic, digital, and technical mood, reminiscent of early computer displays or LED signage.\",\n\t\"Bitter\": \"Bitter is a contemporary slab serif typeface designed for high legibility on screens, featuring thick, blocky serifs and a balanced weight that feels both sturdy and professional. Its large x-height and subtle curves give it a warm, approachable character while maintaining a clean, modern aesthetic.\",\n\t\"Biz Udgothic\": \"BIZ UDGothic is a clean, highly legible sans-serif font with a modern, professional feel, featuring a medium weight and a condensed width. Its design prioritizes clarity and accessibility, with open counters and uniform stroke thicknesses that make it ideal for business and technical documentation.\",\n\t\"Biz Udmincho\": \"BIZ UDMincho is a high-contrast serif font with a condensed, elegant structure that conveys a professional and classic mood. It features sharp, triangular serifs and a tall x-height, making it highly legible for business and academic contexts.\",\n\t\"Biz Udpgothic\": \"A clean, professional sans-serif font with a medium weight and a modern, highly legible appearance. It features uniform stroke widths and open counters, making it ideal for clear communication and business contexts.\",\n\t\"Biz Udpmincho\": \"A clean and professional serif font with a classic Mincho style, featuring high contrast between thick and thin strokes and sharp, triangular serifs. It conveys a formal and highly legible tone, making it ideal for business documents and academic texts.\",\n\t\"Black And White Picture\": \"This is a decorative display font with a hand-drawn, distressed aesthetic, featuring irregular ink-splatter effects and rounded terminals. Its bold, whimsical style evokes a playful yet slightly eerie mood, reminiscent of vintage comic books or horror-themed illustrations.\",\n\t\"Black Han Sans\": \"Black Han Sans is a heavy, ultra-bold sans-serif display font with a modern, impactful feel. It features thick, blocky strokes and tight counters, making it ideal for high-visibility headlines and signage.\",\n\t\"Black Ops One\": \"Black Ops One is a heavy, military-inspired stencil display font with a rugged, industrial feel. Its blocky, angular letterforms and distinct stencil gaps create a bold, authoritative look suitable for high-impact headings.\",\n\t\"Blaka\": \"Blaka is a bold, ultra-heavy display font featuring a jagged, hand-cut aesthetic with sharp, irregular geometric angles. Its aggressive, blocky construction creates a raw, energetic mood reminiscent of street art or paper cutouts.\",\n\t\"Blaka Hollow\": \"Blaka Hollow is a bold, decorative display font with a heavy, blocky structure and a distinctive hollowed-out, stencil-like appearance. Its sharp angles and irregular, hand-cut aesthetic give it a raw, urban, and energetic feel.\",\n\t\"Blaka Ink\": \"Blaka Ink is a bold, heavy display font with a jagged, hand-cut aesthetic that blends graffiti influences with a modern, edgy vibe. Its sharp, irregular angles and blocky letterforms create a high-impact, aggressive look suitable for urban or experimental designs.\",\n\t\"Blinker\": \"Blinker is a clean, modern sans-serif typeface with a tall x-height and a slightly condensed structure. Its geometric forms and uniform stroke weight give it a professional, industrial feel that is highly legible for both headlines and body text.\",\n\t\"Bodoni Moda\": \"Bodoni Moda is a high-contrast, Didone-style serif font that exudes elegance and luxury. It features extreme variation between thick and thin strokes, vertical stress, and flat, unbracketed serifs, making it a classic choice for high-end fashion and editorial design.\",\n\t\"Bodoni Moda Sc\": \"Bodoni Moda SC is a classic Didone-style serif font characterized by extreme contrast between thick and thin strokes and flat, unbracketed serifs. It exudes an elegant, high-fashion aesthetic with a sophisticated and formal mood.\",\n\t\"Bokor\": \"Bokor is a heavy, blackletter-inspired display font with a gothic and medieval feel, featuring sharp, angular strokes and a dense, blocky structure. Its bold, calligraphic style evokes a sense of antiquity and drama, making it ideal for thematic or decorative headings.\",\n\t\"Boldonse\": \"Boldonse is an ultra-bold, condensed sans-serif display font with a modern, impactful feel. It features tight letter spacing and thick, uniform strokes that create a powerful, blocky aesthetic suitable for headlines.\",\n\t\"Bona Nova\": \"Bona Nova is a classic serif typeface with a refined, elegant mood, featuring sharp, triangular serifs and a high contrast between thick and thin strokes. Its graceful proportions and traditional structure give it a sophisticated, scholarly appearance suitable for editorial design.\",\n\t\"Bona Nova Sc\": \"Bona Nova SC is an elegant, classical serif font featuring a small caps design with sharp, refined serifs and a high-contrast stroke weight. It conveys a sophisticated and scholarly mood, characterized by its traditional proportions and graceful, calligraphic influence.\",\n\t\"Bonbance\": \"Bonbance is a bold, retro-inspired display serif font with a playful, groovy mood, featuring soft, rounded terminals and high-contrast strokes that evoke a 1970s aesthetic.\",\n\t\"Bonbon\": \"Bonbon is a playful, decorative script font featuring whimsical curls, floral-inspired counters in the 'o's, and a bouncy, hand-drawn aesthetic. Its medium-weight strokes and ornate flourishes give it a charming, retro-inspired look perfect for creative and informal designs.\",\n\t\"Bonheur Royale\": \"Bonheur Royale is an elegant, formal script font featuring fluid, calligraphic strokes and dramatic flourishes. Its high-contrast lines and slanted posture evoke a sophisticated, romantic mood suitable for invitations and luxury branding.\",\n\t\"Bonny\": \"Bonny is an elegant, high-contrast serif font with a condensed structure and a sophisticated, classic feel. It features sharp, delicate serifs and a distinctive, sweeping terminal on the lowercase 'y' that adds a touch of graceful flair.\",\n\t\"Boogaloo\": \"Boogaloo is a playful, retro-style display font with a bouncy, hand-lettered feel inspired by 1960s Latin American music culture. It features thick, irregular strokes and a slight slant that give it a rhythmic, energetic, and informal personality.\",\n\t\"Borel\": \"Borel is a casual, monolinear script font with a friendly and approachable mood, featuring rounded terminals and a distinct, upright cursive style. Its uniform stroke weight and playful loops give it a modern, hand-drawn appearance suitable for informal designs.\",\n\t\"Boris\": \"Boris is a playful, hand-drawn display font featuring irregular, bold strokes and a whimsical, childlike aesthetic. Its uneven baselines and organic, slightly wobbly letterforms give it a friendly and informal personality.\",\n\t\"Boska\": \"Boska is an elegant, high-contrast serif display font that exudes a sophisticated and modern editorial feel. It features sharp, hairline serifs and dramatic transitions between thick and thin strokes, giving it a luxurious and fashionable appearance.\",\n\t\"Boucl\u00E9es\": \"Boucl\u00E9es is a whimsical, monolinear display font characterized by its continuous, looping script style that mimics a single piece of wire or thread. Its playful and decorative aesthetic features exaggerated curls and a rhythmic, flowing structure that gives it a handcrafted, artistic feel.\",\n\t\"Bowlby One\": \"Bowlby One is an ultra-bold, heavy-weight display sans-serif font with a playful, slightly irregular aesthetic. Its thick strokes and tight counters give it a loud, impactful presence reminiscent of vintage poster lettering.\",\n\t\"Bowlby One Sc\": \"Bowlby One SC is a heavy, ultra-bold display sans-serif font with a rugged, hand-drawn feel and slightly irregular edges. Its chunky, small-caps design conveys a playful yet impactful mood, making it ideal for headlines and posters.\",\n\t\"Boxing\": \"This is an ultra-bold, wide slab-serif display font with a heavy, industrial feel. It features rounded corners and extremely thick strokes that create a powerful, retro-sport aesthetic.\",\n\t\"Bpmf Huninn\": \"A soft, rounded sans-serif font with a medium weight that conveys a friendly and approachable mood. Its clean, geometric strokes and distinctly circular terminals provide a modern, playful aesthetic suitable for casual applications.\",\n\t\"Bpmf Iansui\": \"A light-weight, handwritten-style sans-serif font that conveys a casual and friendly mood through its slightly uneven stroke widths and organic, rounded forms.\",\n\t\"Bpmf Zihi Kai Std\": \"A refined serif font with Kai-style calligraphic influences, featuring moderate stroke contrast and tall, slender proportions that evoke a classic, scholarly mood.\",\n\t\"Braah One\": \"Braah One is a bold, heavy-weight display sans-serif font with a playful and energetic mood, featuring unique flared terminals and slightly irregular, hand-drawn-inspired curves.\",\n\t\"Brawler\": \"Brawler is a sturdy, medium-weight serif font with a classic yet rugged feel, featuring sharp, wedge-shaped serifs and a high x-height for excellent readability. Its slightly condensed proportions and strong horizontal terminals give it a professional and authoritative presence.\",\n\t\"Bree Serif\": \"Bree Serif is a friendly, slab-serif typeface with a modern and playful feel, characterized by its upright, rhythmic structure and distinctive, rounded letterforms. Its bold weight and unique details, like the curved 'e' and 'f', give it a charming and approachable personality.\",\n\t\"Bricolage Grotesque\": \"Bricolage Grotesque is a modern sans-serif font with a clean, approachable feel, featuring a medium weight and distinctive, slightly quirky letterforms like the double-story 'g'. It blends a classic grotesque structure with contemporary, friendly details, making it versatile for both display and body text.\",\n\t\"Briem Hand\": \"Briem Hand is a casual, calligraphic script font with a medium weight that mimics natural handwriting. It features a slight italic slant and organic, slightly irregular strokes that give it a personal and approachable feel.\",\n\t\"Britney\": \"Britney is an elegant, high-contrast display serif font with a strong italic slant and a sophisticated, fashion-forward mood. It features unique inline detailing on the thick downstrokes and graceful, sweeping curves that give it a luxurious and modern calligraphic feel.\",\n\t\"Bruno Ace\": \"Bruno Ace is a modern, geometric sans-serif display font with a futuristic, high-tech aesthetic. It features wide, squared-off letterforms with smooth, rounded outer corners and sharp internal angles, giving it a clean and aerodynamic appearance.\",\n\t\"Bruno Ace Sc\": \"Bruno Ace SC is a modern, wide-set sans-serif display font with a futuristic, high-tech aesthetic. It features geometric, squared-off letterforms with smooth rounded corners and a consistent stroke weight, giving it a clean and industrial feel.\",\n\t\"Brygada 1918\": \"Brygada 1918 is a classic, elegant serif font with a scholarly and historical feel, featuring high contrast between thick and thin strokes. Its design is characterized by sharp, flat serifs and graceful, rounded terminals that give it a refined and authoritative appearance.\",\n\t\"Bubblegum Sans\": \"Bubblegum Sans is a playful, casual display font featuring rounded, bouncy letterforms with a hand-drawn feel. Its irregular strokes and soft edges create a friendly, whimsical mood perfect for children's content or informal designs.\",\n\t\"Bubbler One\": \"Bubbler One is a light-weight, sans-serif display font with a clean, modern aesthetic. It features elongated vertical proportions and smooth, circular curves that give it a sophisticated yet approachable feel.\",\n\t\"Buda\": \"Buda is a light-weight, elegant display serif font featuring high contrast between thick and thin strokes and a slightly irregular, hand-drawn quality. Its tall x-height and delicate, elongated letterforms evoke a sophisticated yet whimsical and artistic mood.\",\n\t\"Buenard\": \"Buenard is a contemporary serif typeface with a classic feel, featuring a medium weight and distinct, slightly chiseled terminals. Its balanced proportions and moderate contrast give it a professional yet warm and approachable mood.\",\n\t\"Bungee\": \"Bungee is a heavy, ultra-bold display sans-serif font with a playful, urban feel, characterized by its thick strokes and rounded corners. Its compact, blocky letterforms are inspired by vintage signage and are designed to excel in vertical or high-impact horizontal layouts.\",\n\t\"Bungee Hairline\": \"Bungee Hairline is an ultra-thin, monolinear display sans-serif with a modern, architectural feel. It features wide, geometric letterforms with rounded corners and a distinctively airy, minimalist aesthetic.\",\n\t\"Bungee Inline\": \"Bungee Inline is a heavy, rounded display sans-serif with a bold, industrial feel, characterized by a thin white line running through the center of each letter. Its thick, blocky structure and urban aesthetic make it ideal for high-impact signage and playful, modern branding.\",\n\t\"Bungee Outline\": \"Bungee Outline is a bold, heavy-weight display sans-serif font featuring a hollow, outlined structure with rounded corners. Its industrial, urban aesthetic is inspired by vintage signage, giving it a playful yet sturdy and modern feel.\",\n\t\"Bungee Shade\": \"Bungee Shade is a heavy, all-caps display sans-serif with a bold, industrial feel, featuring a prominent 3D drop shadow and outlined letterforms. Its rounded corners and blocky structure evoke a playful yet urban, retro-signage aesthetic.\",\n\t\"Bungee Spice\": \"Bungee Spice is a heavy, ultra-bold display sans-serif font with a playful, urban feel, featuring rounded corners and a compact, blocky structure. Its thick strokes and uniform width give it a high-impact, industrial look reminiscent of vintage signage.\",\n\t\"Bungee Tint\": \"Bungee Tint is a heavy, ultra-bold display sans-serif font with rounded corners and a playful, urban feel. Its thick, blocky letterforms and compact spacing give it a strong, impactful presence suitable for signage and headlines.\",\n\t\"Butcherman\": \"Butcherman is a heavy, horror-themed display font featuring jagged, irregular edges and a \\\"dripping\\\" aesthetic that evokes a sense of gore and suspense. Its thick, distorted letterforms create a raw, aggressive mood perfect for slasher films or macabre designs.\",\n\t\"Butterfly Kids\": \"Butterfly Kids is a whimsical, decorative script font featuring thin, monolinear strokes and playful, curly flourishes. Its hand-drawn, textured edges and bouncy baseline create a charming and youthful mood.\",\n\t\"Bvllet\": \"Bvllet is an ultra-bold, futuristic display font featuring heavy, geometric strokes and a distinct tech-inspired aesthetic. Its characters are defined by sharp angles, stencil-like gaps, and a high-contrast, blocky structure that conveys a sense of speed and industrial power.\",\n\t\"Bytesized\": \"A minimalist, ultra-low-resolution pixel font with a retro, digital aesthetic. Its blocky, abstract letterforms are constructed from a very small grid, creating a nostalgic and tech-focused mood.\",\n\t\"Cabin\": \"Cabin is a clean, humanist sans-serif font with a modern and friendly feel, featuring subtle rounded terminals and a medium weight that ensures excellent legibility. Its balanced proportions and open counters give it a professional yet approachable aesthetic suitable for both web and print.\",\n\t\"Cabin Condensed\": \"Cabin Condensed is a clean, humanist sans-serif font with a narrow width and medium weight, offering a modern and approachable feel. Its design features subtle curves and open apertures, making it highly legible and efficient for space-constrained layouts.\",\n\t\"Cabin Sketch\": \"Cabin Sketch is a playful, hand-drawn display font that features a textured, scribbled-in appearance within its sans-serif letterforms. Its irregular outlines and sketchy internal hatching give it a casual, creative, and DIY aesthetic.\",\n\t\"Cabinet Grotesk\": \"Cabinet Grotesk is a clean, modern sans-serif font with a geometric influence and a professional, minimalist mood. It features a light-to-medium weight with distinctive angled terminals on characters like the 't' and 'e', giving it a sharp, contemporary edge.\",\n\t\"Cactus Classical Serif\": \"Cactus Classical Serif is an elegant, old-style serif font with a light-to-medium weight and a sophisticated, academic mood. It features delicate, bracketed serifs, high stroke contrast, and distinctive calligraphic touches like the teardrop terminal on the 'f'.\",\n\t\"Caesar Dressing\": \"Caesar Dressing is a bold, decorative display font with a rustic, hand-chiseled aesthetic inspired by ancient Greek or Roman stone inscriptions. Its jagged, irregular edges and angular letterforms create a primitive, historical mood that is both playful and dramatic.\",\n\t\"Cagliostro\": \"Cagliostro is a distinctive display sans-serif font inspired by early 20th-century Art Deco lettering, featuring elegant, high-contrast strokes and unique, playful terminal flourishes. Its sophisticated yet whimsical mood is defined by its geometric foundations and hand-lettered feel.\",\n\t\"Cairo\": \"Cairo is a contemporary sans-serif typeface featuring a geometric structure with wide, open counters and a clean, modern aesthetic. Its design balances soft curves with sharp, square terminals, creating a professional yet approachable look suitable for both headlines and body text.\",\n\t\"Cairo Play\": \"Cairo Play is a modern, geometric sans-serif font with a clean and friendly appearance, featuring open apertures and a medium weight that balances clarity with a contemporary feel.\",\n\t\"Cal Sans\": \"Cal Sans is a bold, geometric sans-serif display font that exudes a modern and clean aesthetic. It features tight letter spacing and circular curves, making it ideal for impactful headlines and contemporary branding.\",\n\t\"Caladea\": \"Caladea is a modern serif font with a classic, professional feel, featuring elegant curves and sharp, triangular serifs. It has a balanced weight and high readability, making it suitable for both body text and formal headings.\",\n\t\"Calistoga\": \"Calistoga is a bold, heavy-weight display serif font with a cheerful, retro feel, featuring rounded terminals and high-contrast strokes that evoke vintage signage and mid-century advertising.\",\n\t\"Calligraffitti\": \"Calligraffitti is a casual script font that blends traditional calligraphy with a modern, urban graffiti influence. It features fluid, hand-drawn strokes with a slight slant and expressive loops, creating a relaxed yet stylish aesthetic.\",\n\t\"Cambay\": \"Cambay is a clean, modern sans-serif font with a balanced weight and a friendly, approachable mood. It features open apertures and geometric influences, making it highly legible for both display and body text.\",\n\t\"Cambo\": \"Cambo is a modern serif typeface with a sturdy, elegant feel, featuring high-contrast strokes and distinct, sharp serifs. Its generous proportions and clean lines make it highly readable and sophisticated, suitable for both body text and display use.\",\n\t\"Candal\": \"Candal is a bold, heavy-weight sans-serif display font with a playful and informal personality. It features unique, slightly irregular curves and asymmetrical counters that give it a hand-drawn, energetic feel.\",\n\t\"Cantarell\": \"Cantarell is a contemporary humanist sans-serif font with a clean, approachable feel, featuring open apertures and slightly condensed letterforms. Its design balances a modern digital aesthetic with subtle calligraphic influences, making it highly legible for screen use.\",\n\t\"Cantata One\": \"Cantata One is a high-contrast, elegant serif display font with a classic, sophisticated feel. It features sharp, thin serifs and dramatic variations in stroke weight, making it ideal for large-scale editorial and luxury branding.\",\n\t\"Cantora One\": \"Cantora One is a friendly, semi-serif display font with a medium-bold weight that features organic, hand-lettered qualities and subtle calligraphic flares. Its slightly irregular strokes and soft curves create a warm, approachable mood suitable for headlines and branding.\",\n\t\"Caprasimo\": \"Caprasimo is a bold, high-contrast display serif font with a playful, retro 1970s aesthetic. It features soft, rounded terminals and chunky, bulbous letterforms that give it a friendly and expressive personality.\",\n\t\"Capriola\": \"Capriola is a friendly, sans-serif display font featuring rounded terminals and unique, handwriting-inspired gestures. Its medium weight and playful, rhythmic curves give it a modern yet approachable personality.\",\n\t\"Caramel\": \"This is an elegant, calligraphic script font with a hand-drawn feel, featuring high-contrast strokes and a sophisticated, flowing aesthetic. Its slanted, brush-like characters and expressive flourishes evoke a sense of classic luxury and artistic flair.\",\n\t\"Carattere\": \"Carattere is an elegant, formal script font with a classic calligraphic feel, featuring high-contrast strokes and fluid, sweeping flourishes. Its slanted, cursive style conveys a sense of sophisticated craftsmanship and traditional beauty.\",\n\t\"Cardo\": \"Cardo is a classic, scholarly serif font with an Old Style aesthetic, featuring elegant calligraphic strokes and a high-contrast weight. Its sophisticated and traditional feel is characterized by sharp serifs and a timeless, academic mood.\",\n\t\"Carlito\": \"Carlito is a clean, modern sans-serif typeface with a friendly and professional feel, featuring open counters and slightly rounded terminals. It is designed for high readability in body text, serving as a metric-compatible alternative to Calibri.\",\n\t\"Carme\": \"Carme is a clean, modern sans-serif typeface with a medium weight and a professional, approachable mood. It features open apertures and slightly condensed proportions, making it highly legible for both display and body text.\",\n\t\"Carrois Gothic\": \"Carrois Gothic is a clean, modern sans-serif typeface with a regular weight and a neutral, professional mood. It features open apertures and a high x-height, making it highly legible and well-suited for user interfaces and digital displays.\",\n\t\"Carrois Gothic Sc\": \"Carrois Gothic SC is a clean, modern sans-serif font featuring a small caps design with a light-to-medium weight. Its geometric structure and generous spacing create a professional, minimalist aesthetic suitable for clear information display.\",\n\t\"Carter One\": \"Carter One is a bold, casual display font with a hand-painted feel, featuring thick strokes and slightly irregular, rounded terminals. Its heavy weight and friendly, retro-inspired aesthetic make it ideal for high-impact headlines and informal branding.\",\n\t\"Cascadia Code\": \"Cascadia Code is a modern, monospaced sans-serif font designed for legibility and a clean, technical aesthetic. It features a medium weight with open apertures and distinct, rounded terminals that give it a friendly yet professional feel.\",\n\t\"Cascadia Mono\": \"Cascadia Mono is a modern, monospaced sans-serif font with a clean and technical aesthetic, featuring distinct, rounded letterforms and a medium weight that ensures high legibility for coding and terminal use.\",\n\t\"Castoro\": \"Castoro is a classic, scholarly serif font with a medium weight and a formal, academic mood. It features elegant, slightly flared serifs and a high stroke contrast that gives it a refined, traditional appearance suitable for long-form text.\",\n\t\"Castoro Titling\": \"Castoro Titling is an elegant, high-contrast serif font with a classic, scholarly feel, featuring sharp terminals and a refined, light-to-medium weight. Its all-caps design and traditional proportions make it ideal for sophisticated headlines and formal editorial use.\",\n\t\"Catamaran\": \"Catamaran is a contemporary sans-serif typeface featuring a clean, geometric structure with a friendly and approachable mood. It is characterized by its balanced proportions, open apertures, and subtle calligraphic touches in the terminals.\",\n\t\"Caudex\": \"Caudex is a classic serif typeface with a scholarly, medieval feel, featuring irregular, hand-carved edges that mimic the look of ancient manuscripts. Its medium weight and calligraphic strokes create a formal yet organic aesthetic suitable for historical or literary contexts.\",\n\t\"Cause\": \"This is a friendly, handwritten sans-serif font with a medium weight and rounded terminals. Its casual, slightly irregular strokes give it a playful and approachable feel, reminiscent of marker or felt-tip pen writing.\",\n\t\"Caveat\": \"Caveat is a casual, handwritten script font with a natural, playful feel, featuring slightly irregular letterforms and a medium weight. Its organic strokes and subtle variations in baseline give it an authentic, personal touch suitable for informal notes and creative designs.\",\n\t\"Caveat Brush\": \"Caveat Brush is a bold, casual handwriting font with a playful and expressive mood, featuring thick, textured strokes that mimic the look of a felt-tip marker or brush. Its irregular letterforms and slight slant give it a natural, hand-drawn aesthetic suitable for informal designs.\",\n\t\"Cedarville Cursive\": \"Cedarville Cursive is a casual, handwritten script font with a light weight and a personal, authentic feel. It features irregular, flowing letterforms and a slight slant, mimicking natural penmanship for a friendly and approachable mood.\",\n\t\"Cesare\": \"Cesare is a bold, condensed serif display font that exudes a sophisticated and dramatic mood. It features high stroke contrast, sharp terminals, and elegant, elongated letterforms that give it a modern, high-fashion aesthetic.\",\n\t\"Ceviche One\": \"Ceviche One is a bold, expressive display font with a retro, 1960s-inspired aesthetic, featuring heavy, irregular strokes and sharp, angular terminals. Its playful and energetic mood is characterized by a slight italic slant and a hand-drawn, cutout feel.\",\n\t\"Chakra Petch\": \"Chakra Petch is a square-shaped, sans-serif display font with a distinct techno and futuristic feel, characterized by its chamfered corners and rigid, geometric structure.\",\n\t\"Changa\": \"Changa is a bold, modern sans-serif display font characterized by its square, blocky structure and short ascenders and descenders. Its unique, slightly rounded corners and wide proportions give it a sturdy, tech-oriented, and impactful appearance.\",\n\t\"Changa One\": \"Changa One is a heavy, extra-bold display sans-serif font with a modern, playful feel. It features short ascenders and descenders, blocky letterforms, and unique rounded interior counters that give it a distinct, chunky personality.\",\n\t\"Chango\": \"Chango is an ultra-bold, playful display font featuring rounded, bulbous letterforms and a heavy weight that gives it a friendly, cartoonish feel. Its soft edges and irregular, hand-drawn quality make it ideal for informal, high-impact designs.\",\n\t\"Chaos16\": \"Chaos16 is a low-resolution pixel font with a distorted, glitchy aesthetic that creates a sense of digital instability. Its irregular letterforms and jagged edges give it a raw, experimental, and chaotic mood suitable for retro-gaming or underground tech themes.\",\n\t\"Charis Sil\": \"Charis SIL is a classic serif font with a scholarly and highly legible feel, featuring moderate stroke contrast and sturdy, bracketed serifs. Its design is reminiscent of traditional book faces, offering a professional and timeless aesthetic suitable for long-form text.\",\n\t\"Charm\": \"Charm is an elegant, slanted script font with a hand-drawn feel, featuring fluid strokes and a classic, sophisticated mood. Its medium weight and graceful curves give it a timeless, calligraphic quality suitable for formal or decorative designs.\",\n\t\"Charmonman\": \"Charmonman is an elegant, formal script font with a light weight and a sophisticated, calligraphic feel. It features fluid, interconnected strokes and graceful loops, making it ideal for decorative or high-end design contexts.\",\n\t\"Chathura\": \"Chathura is a modern, ultra-condensed sans-serif font featuring a tall x-height and rounded terminals. Its narrow, geometric structure gives it a clean, minimalist, and space-efficient appearance.\",\n\t\"Chau Philomene One\": \"Chau Philomene One is a bold, condensed sans-serif display font with a friendly, casual mood. It features soft, rounded terminals and slightly irregular, hand-drawn qualities that give it a warm and approachable feel.\",\n\t\"Chaumont Script\": \"Chaumont Script is a bold, energetic brush script with a hand-lettered feel, featuring a strong rightward slant and rhythmic, disconnected strokes. Its casual yet confident style evokes a mid-century retro aesthetic, making it ideal for expressive headlines and signage.\",\n\t\"Chela One\": \"Chela One is a bold, condensed display font with a playful, brush-like quality and a slight tilt. Its thick, rounded strokes and casual, hand-drawn feel give it a friendly and energetic personality.\",\n\t\"Chelsea Market\": \"Chelsea Market is a playful, hand-drawn display font with a casual, bohemian feel, featuring irregular line weights and slightly rough, textured edges. Its whimsical, art-deco-inspired letterforms give it a friendly and artisanal character suitable for creative branding.\",\n\t\"Cherish\": \"Cherish is an expressive, hand-drawn script font featuring a textured, brush-stroke aesthetic with a dynamic, slanted rhythm. Its elegant yet raw energy is defined by high-contrast strokes and fluid, calligraphic flourishes that evoke a sense of personal, artistic flair.\",\n\t\"Cherry Bomb One\": \"Cherry Bomb One is a playful, ultra-bold display font featuring soft, rounded shapes and a bubbly, hand-drawn aesthetic. Its thick strokes and friendly, informal mood make it ideal for casual designs, children's content, or eye-catching headlines.\",\n\t\"Cherry Cream Soda\": \"Cherry Cream Soda is a bold, retro-inspired display font with a playful, mid-century aesthetic. It features thick, rounded strokes and unique, flared terminals that evoke the nostalgic feel of 1950s soda shop signage.\",\n\t\"Cherry Swash\": \"Cherry Swash is a playful slab-serif display font featuring decorative, curled swashes on the capital letters and a friendly, vintage-inspired charm. Its medium weight and rounded terminals give it a whimsical yet legible appearance suitable for creative branding.\",\n\t\"Chewy\": \"Chewy is a bold, playful display font featuring thick, rounded strokes and a hand-drawn, bubbly aesthetic. Its irregular letterforms and soft edges create a friendly, casual mood perfect for creative and child-oriented designs.\",\n\t\"Chicle\": \"Chicle is a bold, playful display font featuring soft, rounded terminals and a bouncy, organic rhythm. Its thick, bubble-like letterforms and slight irregularities give it a friendly, retro-inspired aesthetic.\",\n\t\"Chilanka\": \"Chilanka is a casual, handwritten display font with a playful and organic feel, featuring rounded terminals and a consistent monolinear stroke weight. Its informal, slightly irregular letterforms give it a friendly, personal touch reminiscent of natural felt-tip pen writing.\",\n\t\"Chillax\": \"Chillax is a modern, geometric sans-serif font with a clean and minimalist aesthetic, featuring a light stroke weight and perfectly circular curves. Its most distinctive feature is the stylized, curved 'x' that adds a unique, playful touch to its otherwise sophisticated and airy design.\",\n\t\"Chiron Goround Tc\": \"Chiron Goround Tc is a clean, monolinear sans-serif font featuring distinctively rounded stroke endings that create a friendly and approachable mood. Its geometric structure and medium weight make it highly legible and modern, suitable for both display and interface design.\",\n\t\"Chiron Hei Hk\": \"Chiron Hei HK is a clean, modern sans-serif font with a medium weight and a neutral, professional mood. It features open apertures and uniform stroke widths, making it highly legible for both display and body text.\",\n\t\"Chiron Sung Hk\": \"Chiron Sung HK is a classic serif font with a traditional, scholarly feel, featuring high-contrast strokes and sharp, triangular serifs. Its elegant, calligraphic influence is evident in the fluid curves and distinct terminals, making it well-suited for formal and literary contexts.\",\n\t\"Chivo\": \"Chivo is a grotesque sans-serif typeface with a clean, modern, and professional aesthetic. It features a medium weight with balanced proportions and high legibility, making it ideal for both headlines and body text.\",\n\t\"Chivo Mono\": \"Chivo Mono is a clean, monospaced sans-serif font with a modern, technical feel, featuring uniform stroke weights and distinct, square-shaped terminals. Its balanced proportions and high legibility make it ideal for coding and professional design contexts.\",\n\t\"Chocolate Classical Sans\": \"A clean, humanist sans-serif font with a medium weight that balances modern clarity with classical proportions. It features open apertures and a friendly, professional mood suitable for both display and body text.\",\n\t\"Chokokutai\": \"Chokokutai is a bold, geometric display font with a chiseled, woodcut aesthetic characterized by sharp, angular strokes and diamond-shaped counters. Its heavy weight and jagged, crystalline forms evoke a sense of traditional craftsmanship and rugged, architectural strength.\",\n\t\"Chonburi\": \"Chonburi is a bold, high-contrast display serif font that blends classic elegance with a modern, playful touch. It features distinctive curved terminals and sharp, wedge-like serifs that give it a unique, rhythmic personality.\",\n\t\"Choso\": \"Choso is an ultra-bold, experimental display font characterized by radical geometric abstraction and a brutalist aesthetic. Its letterforms are constructed from solid blocks, sharp triangles, and circular cutouts, prioritizing graphic impact and avant-garde form over traditional legibility.\",\n\t\"Chubbo\": \"Chubbo is a friendly, medium-weight serif font featuring rounded terminals and soft, bulbous curves that give it a playful and approachable character. Its distinctively thick, blunt serifs and large x-height create a modern, informal look suitable for display and branding.\",\n\t\"Cinzel\": \"Cinzel is a classic, all-caps serif typeface inspired by first-century Roman inscriptions, featuring elegant proportions and sharp, flared serifs. It conveys a sense of timeless authority and cinematic sophistication, making it ideal for titles and formal branding.\",\n\t\"Cinzel Decorative\": \"Cinzel Decorative is an elegant, all-caps serif font inspired by classical Roman inscriptions, featuring a sophisticated and cinematic feel. It is characterized by its sharp, flared serifs and ornate, sweeping swashes that add a sense of grandeur and timelessness.\",\n\t\"Clash Display\": \"Clash Display is a modern, geometric sans-serif font with a clean and sophisticated aesthetic. It features high-contrast strokes and distinctive, sharp terminals that give it a bold, contemporary edge suitable for headlines and branding.\",\n\t\"Clash Grotesk\": \"Clash Grotesk is a modern, high-contrast sans-serif font that blends neo-grotesque structures with sharp, distinctive terminals. It features a clean, sophisticated aesthetic with a medium weight that feels both professional and contemporary.\",\n\t\"Clicker Script\": \"Clicker Script is a light-weight, bouncy script font with a playful and feminine mood, featuring thin, hand-drawn strokes and elegant, loopy flourishes.\",\n\t\"Climate Crisis\": \"This is an ultra-bold, heavy display sans-serif font with an experimental, melting aesthetic. Its thick, blocky letterforms feature irregular, fluid counters and sharp horizontal slices that create a sense of urgency and environmental instability.\",\n\t\"Coaster Sans\": \"Coaster Sans is an ultra-heavy, geometric display sans-serif with a playful, retro-modern feel. It features extremely thick strokes, tiny square counters, and rounded terminals that give it a bold, blocky appearance.\",\n\t\"Coconat\": \"Coconat is an elegant, high-contrast serif font with a modern, sophisticated feel, featuring sharp, flared terminals and a distinct vertical axis. Its graceful curves and refined strokes give it a luxurious and contemporary aesthetic suitable for editorial design.\",\n\t\"Coda\": \"Coda is a bold, heavy-weight display sans-serif with a modern, industrial feel, characterized by its square proportions and slightly rounded corners. Its wide letterforms and thick strokes give it a strong, impactful presence suitable for headlines.\",\n\t\"Coda Caption\": \"Coda Caption is a heavy, ultra-bold display sans-serif font with a blocky, industrial feel. Its condensed letterforms and slightly rounded corners give it a modern, high-impact look suitable for headlines and signage.\",\n\t\"Codystar\": \"Codystar is a playful, decorative display font composed entirely of small, hand-drawn dots that form the outlines of each letter. Its light weight and stippled texture create a whimsical, airy feel reminiscent of marquee lights or constellations.\",\n\t\"Coiny\": \"Coiny is a heavy, rounded display font with a playful and friendly mood, featuring thick, bubble-like letterforms and soft, organic curves. Its informal, hand-drawn quality makes it ideal for casual branding and child-friendly designs.\",\n\t\"Combo\": \"Combo is a playful, hand-drawn display font featuring a tall x-height and irregular, organic strokes that give it a whimsical and informal personality. Its condensed letterforms and varying line weights create a rhythmic, casual feel suitable for creative and lighthearted designs.\",\n\t\"Comfortaa\": \"Comfortaa is a rounded geometric sans-serif font with a friendly, modern, and approachable feel. It features distinctively circular letterforms and soft, blunt terminals that create a clean and playful aesthetic.\",\n\t\"Comforter\": \"Comforter is a casual, brush-style script font with a hand-drawn feel, featuring expressive, fluid strokes and varying line weights. Its energetic and informal mood is characterized by sweeping curves and a slightly textured, ink-like finish.\",\n\t\"Comforter Brush\": \"Comforter Brush is a casual, expressive script font featuring a textured, hand-painted aesthetic with rough, dry-brush edges. Its energetic, slanted letterforms and varying stroke weights create a personal, artistic mood suitable for creative and informal designs.\",\n\t\"Comic Neue\": \"Comic Neue is a casual, marker-style sans-serif font that offers a refined and more legible take on the classic Comic Sans aesthetic. It features rounded terminals, a light-to-medium weight, and a friendly, approachable mood suitable for informal communication.\",\n\t\"Comic Relief\": \"Comic Relief is a casual, sans-serif display font with a friendly and informal mood, featuring rounded terminals and a hand-drawn aesthetic reminiscent of classic comic book lettering. Its medium weight and slightly irregular stroke widths give it a playful, approachable character while maintaining high legibility.\",\n\t\"Comico\": \"Comico is a bold, hand-drawn display font with a playful, comic-book aesthetic, featuring irregular, textured edges that mimic ink on paper. Its heavy weight and slightly uneven letterforms create a casual, energetic, and informal mood.\",\n\t\"Coming Soon\": \"Coming Soon is a casual, handwritten sans-serif font with a playful and friendly mood. It features irregular, slightly wobbly strokes and rounded terminals that mimic the look of natural felt-tip pen writing.\",\n\t\"Comme\": \"Comme is a clean, geometric sans-serif font with a modern and neutral aesthetic, featuring open apertures and a medium weight that ensures high legibility.\",\n\t\"Commissioner\": \"Commissioner is a low-contrast, humanist sans-serif font with a clean, modern aesthetic and a professional yet approachable mood. It features slightly flared stroke endings and open apertures, giving it a distinct, contemporary character suitable for both display and body text.\",\n\t\"Concert One\": \"Concert One is a rounded, heavy-weight sans-serif display font with a friendly and modern feel. Its thick, uniform strokes and soft terminals give it a bold yet approachable appearance, ideal for headlines and posters.\",\n\t\"Condenbitmap\": \"Condenbitmap is an ultra-condensed, pixelated display font with a retro, digital aesthetic. Its tall, narrow letterforms feature jagged, aliased edges that evoke early computer graphics and low-resolution screen displays.\",\n\t\"Condiment\": \"Condiment is a vintage-inspired brush script font with a medium weight and a retro, mid-century aesthetic. It features fluid, upright letterforms with subtle calligraphic flourishes and a friendly, casual mood.\",\n\t\"Contrail One\": \"Contrail One is a bold, sans-serif display font with a slight slant and rounded terminals, inspired by mid-century advertising and hand-painted signage. Its condensed proportions and soft edges give it a friendly yet energetic and aerodynamic feel.\",\n\t\"Convergence\": \"Convergence is a clean, humanist sans-serif font with a medium weight and a modern, professional feel. It features unique, slightly flared stroke endings and a large x-height that ensures excellent readability for both web and print.\",\n\t\"Cookie\": \"Cookie is a charming, vintage-inspired script font with a medium weight and a friendly, hand-drawn feel. It features elegant, flowing curves and a slight calligraphic touch, making it ideal for decorative and approachable designs.\",\n\t\"Cooper Hewitt\": \"Cooper Hewitt is a contemporary sans-serif typeface with a bold weight and a clean, geometric structure. It conveys a modern, professional, and authoritative mood through its balanced proportions and sharp, vertical terminals.\",\n\t\"Copse\": \"Copse is a slab-serif font with a medium weight that blends classic structure with a soft, friendly mood. It features rounded terminals and slightly irregular, hand-drawn edges that give it a warm, organic feel.\",\n\t\"Coral Pixels\": \"Coral Pixels is a bold, retro-style pixel font that mimics the blocky aesthetic of early video games. It features thick, chunky letterforms with a distinct digital, low-resolution feel.\",\n\t\"Corben\": \"Corben is a bold, display serif font with a classic yet friendly feel, featuring rounded terminals and high-contrast strokes. Its generous curves and vintage-inspired letterforms give it a warm, approachable, and slightly retro aesthetic.\",\n\t\"Corinthia\": \"Corinthia is an elegant, flowing script font with a hand-lettered feel, featuring delicate loops and a sophisticated, romantic mood. Its medium weight and rhythmic, cursive connections give it a classic yet personal appearance suitable for formal invitations or branding.\",\n\t\"Cormorant\": \"Cormorant is an elegant, high-contrast serif typeface that exudes a classic and sophisticated mood. It features exceptionally thin hairlines, sharp serifs, and fluid, calligraphic curves that make it ideal for luxurious display use.\",\n\t\"Cormorant Garamond\": \"Cormorant Garamond is an elegant, high-contrast serif typeface that exudes a classic and sophisticated mood. It features sharp, delicate serifs and fluid, calligraphic curves, making it ideal for formal and luxury applications.\",\n\t\"Cormorant Infant\": \"Cormorant Infant is an elegant, high-contrast serif font with a classic, scholarly feel. It features sharp, delicate serifs and distinctive 'infant' letterforms, such as the single-story 'a', which add a touch of refined simplicity to its sophisticated design.\",\n\t\"Cormorant Sc\": \"Cormorant SC is an elegant, high-contrast serif typeface featuring small caps and sharp, delicate terminals that evoke a classic, luxurious feel. Its refined strokes and traditional proportions make it ideal for sophisticated editorial design and formal branding.\",\n\t\"Cormorant Unicase\": \"Cormorant Unicase is an elegant, high-contrast serif font that blends uppercase and lowercase forms into a single height for a sophisticated, classical look. Its delicate hairlines and sharp serifs evoke a sense of luxury and timeless refinement.\",\n\t\"Cormorant Upright\": \"Cormorant Upright is an elegant, high-contrast serif display font with a classic, calligraphic feel. It features sharp, delicate serifs and fluid, upright letterforms that convey a sense of sophisticated luxury and formal grace.\",\n\t\"Cossette Texte\": \"A clean, geometric sans-serif typeface with a medium weight and a modern, professional feel. It features open apertures and a high x-height, ensuring excellent legibility for body text.\",\n\t\"Cossette Titre\": \"Cossette Titre is a bold, condensed sans-serif font with a modern and authoritative feel, featuring tall x-heights and clean, geometric lines. Its narrow proportions and uniform stroke weight make it ideal for high-impact headlines and editorial titling.\",\n\t\"Courgette\": \"Courgette is a medium-weight brush script font with a friendly, elegant feel, featuring a distinct italic slant and fluid, disconnected letterforms. Its low-contrast strokes and rounded terminals give it a modern, approachable look suitable for headlines and decorative text.\",\n\t\"Courier Prime\": \"Courier Prime is a monospaced slab serif font that offers a clean, professional, and cinematic feel, specifically optimized for screenplays. It features rounded terminals and a balanced weight that provides better legibility and a more polished look than traditional typewriter fonts.\",\n\t\"Cousine\": \"Cousine is a clean, monospaced sans-serif font with a functional and modern aesthetic. It features uniform stroke widths and generous spacing, making it highly legible for technical and coding environments.\",\n\t\"Coustard\": \"Coustard is a bold slab-serif font that combines a classic, sturdy structure with soft, rounded terminals, creating a friendly yet authoritative appearance. Its heavy weight and clear letterforms make it highly legible and well-suited for impactful headlines.\",\n\t\"Covered By Your Grace\": \"Covered By Your Grace is a casual, handwritten script font with a medium weight and a friendly, personal mood. It features irregular, marker-like strokes and a slight vertical orientation that gives it an authentic, hand-drawn appearance.\",\n\t\"Crafty Girls\": \"Crafty Girls is a playful, casual handwriting font with a medium weight and a whimsical, hand-drawn feel. It features irregular, rounded letterforms and a charmingly uneven baseline that gives it a friendly and creative personality.\",\n\t\"Creepster\": \"Creepster is a bold, horror-themed display font featuring irregular, jagged edges and a melting, slime-like aesthetic. Its heavy weight and eerie, distorted letterforms evoke a classic spooky or supernatural mood, perfect for Halloween-themed designs.\",\n\t\"Crete Round\": \"Crete Round is a warm, slab-serif typeface featuring rounded terminals and a sturdy structure that balances a classic feel with a friendly, modern approach. Its thick, blocky serifs and open counters make it highly legible and well-suited for both headlines and body text.\",\n\t\"Crimson Pro\": \"Crimson Pro is a classic, elegant serif typeface with a scholarly feel, featuring strong contrast and sharp, traditional serifs. Its balanced proportions and refined details make it highly legible and sophisticated, ideal for long-form reading and academic contexts.\",\n\t\"Crimson Text\": \"Crimson Text is a classic, old-style serif typeface with a sophisticated and scholarly feel, featuring elegant proportions and moderate contrast. Its design is characterized by traditional serifs and a high x-height, making it highly legible and ideal for book production and long-form reading.\",\n\t\"Croissant One\": \"Croissant One is a sophisticated display serif font featuring high contrast between thick and thin strokes and elegant, rounded terminals. Its fluid, calligraphic curves and upright posture evoke a classic yet romantic Parisian aesthetic.\",\n\t\"Crushed\": \"Crushed is a playful, condensed display font featuring a mix of lowercase and uppercase letterforms with a hand-drawn, slightly irregular feel. Its tall, narrow proportions and tapered strokes give it a whimsical yet modern character suitable for headlines and creative branding.\",\n\t\"Cuprum\": \"Cuprum is a narrow, condensed sans-serif font with a modern and efficient feel, featuring slightly rounded terminals and a tall x-height. Its clean, vertical structure makes it highly legible and space-saving, suitable for both headlines and body text.\",\n\t\"Cute Font\": \"This is a bold, rounded sans-serif display font with a friendly and modern aesthetic. It features soft, pill-shaped terminals and a uniform stroke weight that gives it a playful, approachable character.\",\n\t\"Cutive\": \"Cutive is a classic slab-serif font with a typewriter-inspired aesthetic, featuring rounded terminals and a medium weight that balances vintage charm with modern readability.\",\n\t\"Cutive Mono\": \"Cutive Mono is a monospaced typewriter-style font featuring a classic slab serif design with a clean, scholarly aesthetic. Its uniform stroke weight and wide spacing evoke a vintage mechanical feel while remaining highly legible for modern digital use.\",\n\t\"Dai Banna Sil\": \"Dai Banna SIL is a classic serif font with a medium weight and a formal, scholarly mood. It features sharp, wedge-like serifs and a high stroke contrast that gives it a traditional, calligraphic feel.\",\n\t\"Damion\": \"Damion is a casual, medium-weight script font with a retro, mid-century feel, featuring smooth, rounded strokes and a slight slant that evokes hand-painted signage.\",\n\t\"Dancing Script\": \"Dancing Script is a lively, casual script font with a bouncy baseline and fluid, interconnected letters that evoke a friendly and informal mood. Its varying stroke weights and elegant loops give it a hand-drawn, rhythmic quality reminiscent of mid-20th century popular signage.\",\n\t\"Danfo\": \"Danfo is an ultra-bold, slab-serif display font with a playful, retro-modern aesthetic, featuring heavy block-like forms and distinctive rounded negative spaces. Its chunky, high-contrast design gives it a bold, graphic presence suitable for impactful headlines.\",\n\t\"Dangrek\": \"Dangrek is a bold, heavy-weight display font with a friendly and informal mood, characterized by its rounded terminals and slightly irregular, hand-drawn feel. Its thick strokes and condensed proportions give it a strong, playful presence suitable for headlines and creative branding.\",\n\t\"Darker Grotesque\": \"Darker Grotesque is a contemporary sans-serif font with a light weight and a tall x-height, offering a clean, sophisticated, and modern aesthetic. Its slightly condensed proportions and open apertures give it a sleek, professional look suitable for minimalist designs.\",\n\t\"Darumadrop One\": \"Darumadrop One is a bold, playful display font featuring a hand-drawn aesthetic with irregular, textured edges that mimic ink on paper. Its heavy weight and rounded, slightly uneven letterforms create a friendly, casual, and energetic mood.\",\n\t\"Datatype\": \"Datatype is a clean, monospaced sans-serif font that conveys a technical and modern aesthetic. Its uniform stroke weight and wide letter spacing evoke the precision of digital coding and classic terminal displays.\",\n\t\"David Libre\": \"David Libre is a classic serif font with a formal, calligraphic feel, featuring high stroke contrast and sharp, wedge-shaped serifs. Its elegant, traditional aesthetic makes it well-suited for academic or literary contexts.\",\n\t\"Dawning Of A New Day\": \"Dawning of a New Day is a light-weight, informal script font that mimics casual, monolinear handwriting with a personal and whimsical feel. It features tall, loopy ascenders and a relaxed, flowing rhythm that gives it an authentic, hand-drawn appearance.\",\n\t\"Days One\": \"Days One is a bold, wide sans-serif display font with a modern, geometric feel and slightly rounded terminals that give it a friendly yet impactful presence. Its thick strokes and large x-height make it highly legible and ideal for headlines or branding.\",\n\t\"Defekt\": \"Defekt is a bold, experimental display font with a futuristic, glitch-inspired aesthetic, featuring fragmented letterforms and sharp, geometric angles. Its heavy weight and disjointed structure create a high-contrast, industrial mood that prioritizes abstract visual impact over traditional legibility.\",\n\t\"Dekko\": \"Dekko is a casual, handwritten display font with a friendly and informal mood. It features rounded terminals, irregular stroke widths, and a slight slant that gives it a playful, personal touch.\",\n\t\"Dela Gothic One\": \"Dela Gothic One is an ultra-heavy, flat-topped sans-serif display font that exudes a bold, industrial, and stable feel. Its thick strokes and condensed counters make it ideal for high-impact headings and posters.\",\n\t\"Delicious Handrawn\": \"A casual, medium-weight handwritten font with a friendly and organic feel, featuring rounded terminals and slightly irregular letterforms that mimic natural pen strokes.\",\n\t\"Delius\": \"Delius is a friendly, comic-style handwriting font featuring rounded terminals and a casual, monolinear stroke weight. Its playful and informal appearance mimics high-quality marker lettering, making it ideal for approachable and creative designs.\",\n\t\"Delius Swash Caps\": \"Delius Swash Caps is a whimsical, handwritten display font featuring a light weight and a playful, friendly mood. It is characterized by its rounded terminals and elegant, curly swashes on the uppercase letters that give it a charming, storybook quality.\",\n\t\"Delius Unicase\": \"Delius Unicase is a friendly, handwritten display font featuring rounded terminals and a playful, casual mood. Its unique unicase design blends uppercase and lowercase forms into a single height, creating a whimsical and approachable aesthetic.\",\n\t\"Della Respira\": \"Della Respira is a classic serif typeface with a calligraphic feel, featuring elegant, slightly flared terminals and a medium weight. Its design evokes a sense of historical sophistication and breathability, making it ideal for literary or formal contexts.\",\n\t\"Dem Mo Mono\": \"Dem Mo Mono is a monospaced, geometric sans-serif font with a technical, industrial feel, characterized by its octagonal letterforms and uniform stroke weight. Its rigid, angular construction and lack of curves give it a modern, digital aesthetic reminiscent of early computer displays or architectural blueprints.\",\n\t\"Denk One\": \"Denk One is a bold, condensed sans-serif display font with a friendly, hand-drawn feel. It features rounded terminals and slightly irregular stroke widths, giving it a casual yet impactful appearance suitable for headlines.\",\n\t\"Destra\": \"Destra is a bold, high-contrast serif display font that exudes a sophisticated and dramatic mood. It features sharp, wedge-like serifs and unique, aggressive letterforms, such as the notched 'R' and the sweeping curves of the 'S'.\",\n\t\"Devonshire\": \"Devonshire is a bold, brush-style script font with a casual and energetic feel, featuring high-contrast strokes and a hand-painted aesthetic. Its irregular letterforms and fluid, upright rhythm give it a distinctive, expressive personality suitable for creative display work.\",\n\t\"Dhurjati\": \"Dhurjati is a bold, heavy-weight sans-serif font with a modern, industrial feel, characterized by its square proportions and slightly rounded outer corners. Its thick strokes and compact letterforms give it a strong, stable presence suitable for headlines and display use.\",\n\t\"Didact Gothic\": \"Didact Gothic is a clean, geometric sans-serif font with a light-to-medium weight and a modern, educational feel. It features simple, open letterforms designed for high legibility, making it ideal for literacy and instructional materials.\",\n\t\"Diphylleia\": \"Diphylleia is an elegant, calligraphic serif font with a delicate, hand-drawn feel, featuring high-contrast strokes and fluid, organic terminals. Its slender weight and graceful curves evoke a poetic and sophisticated mood, reminiscent of traditional East Asian brushwork applied to Latin letterforms.\",\n\t\"Diplomata\": \"Diplomata is a bold, decorative display serif font with an engraved or 'inline' effect that gives it a classic, formal, and authoritative appearance. Its wide proportions and high-contrast strokes evoke a sense of traditional craftsmanship and prestige.\",\n\t\"Diplomata Sc\": \"Diplomata SC is a bold, decorative serif display font with an elegant, engraved feel, featuring high-contrast strokes and distinctive inline detailing. Its wide, majestic proportions and small caps style evoke a sense of formal prestige and classic Victorian-era craftsmanship.\",\n\t\"Dm Mono\": \"DM Mono is a clean, geometric monospaced sans-serif font with a modern and technical feel. It features uniform stroke weights and open apertures, making it highly legible for coding and digital interfaces.\",\n\t\"Dm Retrograde\": \"Dm Retrograde is a blocky, pixelated display font that evokes a nostalgic, 8-bit video game aesthetic. Its heavy weight and rigid, square-based construction create a bold, digital look suitable for retro-themed designs.\",\n\t\"Dm Sans\": \"DM Sans is a low-contrast, geometric sans-serif font that exudes a modern and clean aesthetic. Its balanced proportions and open apertures make it highly legible and versatile for both digital and print applications.\",\n\t\"Dm Serif Display\": \"DM Serif Display is a high-contrast, transitional serif font with a bold weight and a sophisticated, classic feel. It features sharp, delicate serifs and elegant teardrop terminals, making it ideal for impactful headlines and editorial design.\",\n\t\"Dm Serif Text\": \"DM Serif Text is a high-contrast transitional serif font with a classic, sophisticated feel, featuring sharp serifs and elegant, rounded terminals. Its bold weight and balanced proportions make it ideal for authoritative yet legible body text and headings.\",\n\t\"Do Hyeon\": \"Do Hyeon is a bold, heavy-weight sans-serif display font with a modern, industrial feel. It features unique, slightly rounded outer corners contrasted by sharp inner angles and a distinctive, high-waisted structure.\",\n\t\"Dokdo\": \"Dokdo is a bold, decorative display font with a raw, hand-drawn aesthetic characterized by jagged, irregular edges and a brush-like texture. Its primitive and energetic style gives it a rustic, organic feel that is both playful and expressive.\",\n\t\"Domine\": \"Domine is a classic serif typeface with a sturdy, medium weight and a professional, scholarly mood. It features sharp, wedge-like serifs and a high x-height, making it highly legible and well-suited for body text in digital and print media.\",\n\t\"Donegal One\": \"Donegal One is a medium-weight serif font with a classic, calligraphic feel, featuring distinctive chiseled terminals and sharp, angular serifs. Its high-contrast strokes and elegant curves give it a sophisticated yet approachable look suitable for display and editorial use.\",\n\t\"Dongle\": \"Dongle is a rounded, sans-serif display font with a playful and friendly mood, featuring soft terminals and a high x-height that gives it a modern, approachable look.\",\n\t\"Doppio One\": \"Doppio One is a sturdy, medium-weight sans-serif font with a modern and industrial feel, characterized by its slightly squared-off curves and high x-height. Its clean, open letterforms provide excellent legibility, making it well-suited for both digital interfaces and display headings.\",\n\t\"Dorsa\": \"Dorsa is an ultra-condensed sans-serif display font with a modern, sophisticated feel, characterized by its extreme verticality and thin, uniform stroke weight. Its elongated letterforms and tight spacing create a sleek, high-fashion aesthetic suitable for headlines and editorial design.\",\n\t\"Dosis\": \"Dosis is a modern, monoline sans-serif font characterized by its soft, rounded terminals and clean, geometric structure. Its open forms and friendly, approachable mood make it highly legible and versatile for contemporary digital designs.\",\n\t\"Dotgothic16\": \"Dotgothic16 is a retro-style pixel or bitmap font that mimics the low-resolution aesthetic of early computer displays and video games. It features a monolinear weight and blocky, aliased edges, evoking a nostalgic, digital, and technical mood.\",\n\t\"Doto\": \"Doto is a retro-style dot matrix display font composed of uniform square pixels, creating a digital, lo-fi aesthetic. Its minimalist, grid-based structure evokes a nostalgic, tech-inspired mood reminiscent of early computing and electronic signage.\",\n\t\"Dr Sugiyama\": \"Dr Sugiyama is an expressive, calligraphic script font featuring dramatic stroke contrasts and fluid, hand-drawn curves. Its elegant yet eccentric style is characterized by exaggerated flourishes and a vintage, brush-like aesthetic.\",\n\t\"Drabina\": \"Drabina is an ultra-bold, experimental display font with a futuristic, industrial feel, characterized by its heavy geometric blocks and unique diagonal cutouts. Its abstract, stencil-like construction creates a rhythmic, mechanical aesthetic that prioritizes graphic impact over traditional legibility.\",\n\t\"Droide Anthro Light\": \"A clean, geometric sans-serif font with a light weight and a modern, minimalist aesthetic. It features open apertures, circular curves, and a high x-height, giving it a sophisticated and airy feel.\",\n\t\"Dt Getai Grotesk Display\": \"A bold, heavy-weight sans-serif display font that blends a modern, geometric structure with playful, decorative flourishes like curled terminals and ink traps. It projects a quirky yet confident personality, making it ideal for high-impact headlines and creative branding.\",\n\t\"Dt Nightingale\": \"Dt Nightingale is an elegant, high-contrast serif font with a classic yet whimsical feel, featuring sharp, delicate serifs and unique star-shaped tittles over the 'i's. Its slender strokes and graceful curves evoke a sense of sophisticated storytelling and vintage charm.\",\n\t\"Duru Sans\": \"Duru Sans is a clean, low-contrast sans-serif font with a modern and approachable feel. It features slightly flared stroke endings and open apertures, giving it a distinct, humanist quality that ensures high legibility.\",\n\t\"Dynalight\": \"Dynalight is a fluid, vintage-inspired script font with a high-contrast, italicized slant that evokes the speed and elegance of mid-century automotive emblems. Its graceful, sweeping curves and sharp terminals create a sophisticated yet energetic aesthetic.\",\n\t\"Dynapuff\": \"DynaPuff is a playful, rounded display font with a friendly and casual mood, featuring soft, bubble-like letterforms and a hand-drawn aesthetic. Its bold weight and irregular, bouncy baseline give it a cheerful, animated character suitable for children's media or informal designs.\",\n\t\"Eagle Lake\": \"Eagle Lake is a flowing, calligraphic script font with a medieval or fantasy feel, featuring elegant, tapered strokes and sharp, hook-like terminals. Its rhythmic, hand-drawn quality evokes a sense of classic storytelling and historical charm.\",\n\t\"East Sea Dokdo\": \"East Sea Dokdo is a bold, expressive display font with a hand-painted, calligraphic feel, featuring rough, textured edges and irregular stroke widths. Its energetic and organic style conveys a sense of raw, artistic movement and traditional brushwork.\",\n\t\"Eater\": \"Eater is a heavy, decorative display font with a dark, macabre aesthetic, featuring jagged, thorn-like protrusions and irregular, distressed edges. Its aggressive and unsettling design makes it ideal for horror-themed projects or metal music branding.\",\n\t\"Eb Garamond\": \"EB Garamond is a classic, elegant old-style serif font characterized by its high contrast, delicate serifs, and a timeless, scholarly feel. It features organic, calligraphic-inspired strokes and a sophisticated aesthetic that makes it ideal for formal body text and traditional publishing.\",\n\t\"Economica\": \"Economica is a condensed sans-serif font with a modern, utilitarian feel, featuring tall letterforms and slightly irregular, hand-drawn edges that add a touch of organic warmth.\",\n\t\"Eczar\": \"Eczar is a bold, expressive serif typeface with a calligraphic feel, featuring sharp, angular terminals and high-contrast strokes. Its rugged, chiseled appearance gives it a strong, authoritative presence that blends traditional craftsmanship with a modern, edgy personality.\",\n\t\"Edu Au Vic Wa Nt Arrows\": \"This is an educational, instructional font featuring hollow, outlined characters designed to teach handwriting. It includes directional arrows and starting dots within each letter to guide stroke order and direction, presented in a clean, monolinear script style.\",\n\t\"Edu Au Vic Wa Nt Dots\": \"This is an educational, instructional font designed for tracing, featuring letterforms constructed entirely from small black dots. It has a clean, sans-serif structure with a slight italic slant and includes hollow guide circles to indicate starting points for writing practice.\",\n\t\"Edu Au Vic Wa Nt Guides\": \"This is an educational, italicized sans-serif font designed for handwriting practice, featuring a light weight and clean, monolinear strokes. It is presented on a ruled background with baseline, midline, and top-line guides to assist in letter formation and alignment.\",\n\t\"Edu Au Vic Wa Nt Hand\": \"This is a light-weight, slanted handwriting font with a clean, educational feel, featuring simple monolinear strokes and a casual, approachable mood.\",\n\t\"Edu Au Vic Wa Nt Pre\": \"This is a light-weight, sans-serif font with a handwritten, educational style that features a slight italic slant and rounded terminals. It has a clean, friendly, and instructional feel, characteristic of primary school handwriting models.\",\n\t\"Edu Nsw Act Cursive\": \"This is a light-weight, educational script font featuring a clean, monolinear stroke and a slight italic slant. It mimics neat, modern handwriting with simple, unadorned letterforms designed for clarity and legibility.\",\n\t\"Edu Nsw Act Foundation\": \"This is a clean, monolinear sans-serif font designed for educational purposes, featuring a friendly and legible style with rounded terminals. Its upright, geometric structure and uniform stroke weight create a clear, instructional mood suitable for early handwriting development.\",\n\t\"Edu Nsw Act Hand Pre\": \"This is a clean, light-weight handwriting font designed for educational purposes, featuring simple, monolinear strokes and a clear, legible structure. It has a friendly and instructional mood, characterized by its upright posture and distinct, unjoined letterforms.\",\n\t\"Edu Qld Beginner\": \"This is a clean, monolinear sans-serif font designed to mimic neat handwriting, featuring a slight italic slant and rounded terminals. Its simple, friendly, and educational aesthetic is specifically tailored for legibility and teaching basic letter formations.\",\n\t\"Edu Qld Hand\": \"Edu Qld Hand is a clean, monolinear handwriting font with a slight italic slant, designed to mimic educational print styles. It features rounded terminals and a friendly, legible appearance that feels both personal and instructional.\",\n\t\"Edu Sa Beginner\": \"Edu SA Beginner is a friendly, casual sans-serif font that mimics neat, handwritten print. It features rounded terminals and a slight italicized slant, giving it a clear, approachable, and educational feel.\",\n\t\"Edu Sa Hand\": \"Edu Sa Hand is a clean, monolinear handwriting font with a friendly and educational feel, featuring slightly condensed letterforms and rounded terminals. Its upright, print-style characters are highly legible, making it ideal for instructional materials and casual, approachable designs.\",\n\t\"Edu Tas Beginner\": \"Edu TAS Beginner is a clean, monolinear sans-serif font with a friendly, educational feel, featuring a slight italic slant and rounded terminals. Its simple, clear letterforms are designed for legibility, mimicking a neat, hand-printed style suitable for primary education materials.\",\n\t\"Edu Vic Wa Nt Beginner\": \"This is a clean, monolinear handwriting font designed for educational purposes, featuring a slight italic slant and simple, unadorned letterforms. It has a friendly and legible appearance, mimicking the clear, upright style used in primary school handwriting instruction.\",\n\t\"Edu Vic Wa Nt Hand\": \"This is a clean, light-weight handwriting font with a slight italic slant, designed for educational clarity. It features simple, monolinear strokes and rounded terminals, giving it a friendly and approachable instructional feel.\",\n\t\"Edu Vic Wa Nt Hand Pre\": \"This is a light-weight, slanted handwriting font designed for educational purposes, featuring clean, monolinear strokes and a clear, legible print style. It conveys a formal yet approachable mood, mimicking the neat penmanship taught in primary schools.\",\n\t\"El Messiri\": \"El Messiri is an elegant, semi-serif typeface with a calligraphic feel, featuring high-contrast strokes and graceful, curved terminals. Its sophisticated and modern aesthetic is characterized by fluid, organic shapes that suggest a blend of traditional Arabic script influences with contemporary Latin letterforms.\",\n\t\"Elastic\": \"This is a clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features open apertures and circular forms, particularly evident in the 'a', 's', and 'c', giving it a balanced and highly legible appearance.\",\n\t\"Electrolize\": \"Electrolize is a modern, techno-inspired sans-serif font featuring a squarish, geometric structure with distinct chamfered corners. Its monolinear weight and industrial aesthetic give it a futuristic, high-tech feel suitable for digital displays.\",\n\t\"Elms Sans\": \"A clean, geometric sans-serif font with a medium-light weight that conveys a modern and professional mood. It features open apertures and uniform stroke widths, giving it a balanced and highly legible appearance.\",\n\t\"Elsie\": \"Elsie is a high-contrast, feminine serif font that blends classic Bodoni-style elegance with playful, decorative elements like soft ball terminals. Its delicate strokes and refined structure create a sophisticated yet whimsical mood, making it ideal for fashion and editorial design.\",\n\t\"Elsie Swash Caps\": \"Elsie Swash Caps is a decorative serif font with a high-contrast, feminine aesthetic, featuring elegant ball terminals and playful, curled swashes. It blends classic Bodoni-style structure with a whimsical, fashion-forward mood.\",\n\t\"Elstob\": \"Elstob is a classic serif typeface with a scholarly, medieval-inspired aesthetic, featuring sharp, wedge-like serifs and a high-contrast stroke weight. Its irregular, hand-cut feel gives it a historic and authoritative mood, suitable for academic or literary contexts.\",\n\t\"Emblema One\": \"Emblema One is a bold, stencil-style display font with a vintage, industrial feel, featuring heavy, italicized letterforms and distinct gaps that mimic traditional stencil markings. Its thick strokes and rounded terminals create a powerful, retro-modern aesthetic suitable for headlines and branding.\",\n\t\"Emilys Candy\": \"Emilys Candy is a whimsical, feminine display font featuring playful curls, heart-shaped dots over the 'i', and a hand-drawn, irregular texture. Its lighthearted and sweet aesthetic makes it ideal for projects requiring a touch of charm and personality.\",\n\t\"Encode Sans\": \"Encode Sans is a versatile, modern sans-serif font with a clean, geometric structure and a neutral, professional mood. It features open apertures and a balanced weight that ensures high legibility for both display and body text.\",\n\t\"Encode Sans Condensed\": \"Encode Sans Condensed is a clean, modern sans-serif font featuring a narrow, space-efficient design with a medium weight. Its geometric structure and open apertures give it a professional and highly legible appearance suitable for technical or corporate contexts.\",\n\t\"Encode Sans Expanded\": \"Encode Sans Expanded is a clean, modern sans-serif font featuring a wide, horizontal stretch and a medium weight. Its open apertures and geometric structure give it a highly legible and professional appearance suitable for technical or corporate branding.\",\n\t\"Encode Sans Sc\": \"Encode Sans SC is a clean, modern sans-serif font featuring a light-to-medium weight and a professional, geometric structure. Its small caps design provides a balanced, sophisticated look suitable for technical or corporate branding.\",\n\t\"Encode Sans Semi Condensed\": \"Encode Sans Semi Condensed is a clean, modern sans-serif font with a medium weight and a slightly narrowed width that enhances space efficiency. Its geometric structure and open apertures create a professional, highly legible appearance suitable for both digital and print interfaces.\",\n\t\"Encode Sans Semi Expanded\": \"A clean, modern sans-serif font with a light-to-medium weight and a slightly widened, semi-expanded stance. It features open apertures and a high x-height, giving it a professional and highly legible appearance suitable for technical or corporate contexts.\",\n\t\"Engagement\": \"Engagement is a casual, brush-style script font with a hand-drawn feel, featuring fluid, rhythmic strokes and a medium weight. Its informal yet elegant aesthetic is characterized by slightly irregular edges and a natural, calligraphic flow.\",\n\t\"Englebert\": \"Englebert is a playful, casual sans-serif display font inspired by 1950s advertising, featuring a light weight and distinctive, bouncy letterforms like the unique looped 'g'. Its tall x-height and slightly irregular, hand-drawn feel evoke a friendly and retro-modern aesthetic.\",\n\t\"Enriqueta\": \"Enriqueta is a robust slab-serif typeface that combines a classic, formal structure with modern, rounded terminals. Its heavy, blocky serifs and balanced proportions give it a sturdy and reliable feel suitable for both headlines and body text.\",\n\t\"Ephesis\": \"Ephesis is an elegant, fluid calligraphic script font with a light-to-medium weight and a sophisticated, romantic mood. It features sweeping, expressive flourishes, particularly in the capital letters, and a rhythmic, handwritten quality that feels both classic and personal.\",\n\t\"Epilogue\": \"Epilogue is a clean, modern sans-serif font with a geometric structure and a medium weight that feels balanced and professional. Its open counters and uniform stroke widths give it a contemporary, versatile look suitable for both headings and body text.\",\n\t\"Epunda Sans\": \"Epunda Sans is a clean, humanist sans-serif font with a medium weight and a modern, approachable feel. It features open apertures and subtle stroke variations that enhance readability and give it a friendly, professional character.\",\n\t\"Epunda Slab\": \"Epunda Slab is a clean, medium-weight slab serif font that balances a modern, professional feel with classic geometric structures. It features prominent, blocky serifs and open counters, making it highly legible and suitable for both editorial and display purposes.\",\n\t\"Erbarre\": \"Erbarre is a bold, condensed sans-serif display font with a rugged, hand-stamped aesthetic. Its irregular, distressed edges and heavy weight create a raw, industrial, and authoritative mood.\",\n\t\"Erica One\": \"Erica One is an ultra-bold, sans-serif display font with a playful and chunky personality, featuring extremely thick strokes and tiny negative spaces that give it a heavy, block-like appearance.\",\n\t\"Erode\": \"Erode is a sophisticated transitional serif font that balances classic elegance with modern sharpness, featuring high stroke contrast and distinct, wedge-shaped serifs. Its refined proportions and clean lines evoke a professional yet stylish mood suitable for editorial and branding purposes.\",\n\t\"Esteban\": \"Esteban is a classic serif font with a medium weight and a scholarly, calligraphic feel, characterized by its high stroke contrast and distinctively flared, sharp serifs. Its elegant and slightly irregular letterforms give it a unique, hand-crafted personality suitable for literary or editorial contexts.\",\n\t\"Estonia\": \"Estonia is a calligraphic display font with a hand-drawn, rustic feel, featuring irregular, textured edges that mimic ink on paper. Its elegant, slanted letterforms and varying stroke weights create a sophisticated yet organic and vintage mood.\",\n\t\"Euphoria Script\": \"Euphoria Script is an informal, playful script font with a light-to-medium weight and a bouncy, hand-lettered feel. It features elegant, unconnected letterforms with high-contrast strokes and expressive flourishes, giving it a modern yet romantic aesthetic.\",\n\t\"Ewert\": \"Ewert is a bold, decorative slab-serif display font with a classic circus or carnival aesthetic, featuring heavy block shadows and ornamental, bifurcated spurs at the midsection of each character.\",\n\t\"Excon\": \"Excon is a clean, geometric sans-serif font with a modern and professional feel, featuring high-contrast circular forms and sharp, precise terminals. Its medium weight and balanced proportions make it highly legible and versatile for both display and body text.\",\n\t\"Exile\": \"Exile is an ultra-bold, psychedelic display font featuring heavy, bulbous curves contrasted with sharp, blocky terminals. Its fluid, liquid-like shapes and high-contrast construction evoke a retro, 1960s-inspired aesthetic with a modern, experimental edge.\",\n\t\"Exo\": \"Exo is a contemporary geometric sans-serif font with a futuristic, technological feel, featuring distinctively rounded outer corners and sharp inner angles. Its medium weight and wide proportions give it a clean, architectural look suitable for modern digital interfaces.\",\n\t\"Exo 2\": \"Exo 2 is a contemporary geometric sans-serif font with a futuristic, technological feel, featuring subtle organic curves and a clean, legible structure. Its medium weight and balanced proportions give it a versatile, modern aesthetic suitable for both digital and print design.\",\n\t\"Expletus Sans\": \"Expletus Sans is a modern display sans-serif font featuring a medium weight and a unique, stencil-like aesthetic created by subtle gaps in its letterforms. Its clean lines and rhythmic breaks give it a sophisticated, architectural, and slightly futuristic feel.\",\n\t\"Explora\": \"Explora is an elegant, calligraphic script font featuring a strong italic slant and delicate, flowing strokes that evoke a sense of classic sophistication. Its high-contrast lines and expressive flourishes give it a refined, hand-lettered appearance suitable for formal invitations or decorative branding.\",\n\t\"Expose\": \"A clean, modern sans-serif font with a medium weight and a professional, neutral mood. It features open apertures and balanced proportions, making it highly legible and versatile for both display and body text.\",\n\t\"F1 8\": \"This is a bold, geometric sans-serif font with a modern and friendly feel, characterized by its thick strokes and soft, rounded terminals. Its perfectly circular forms and uniform line weight give it a clean, minimalist aesthetic suitable for contemporary branding.\",\n\t\"Fa 1\": \"This is a bold, geometric display font with a futuristic, industrial feel. It features heavy, uniform strokes with rounded terminals and distinct angular cutouts, particularly visible in the 'A' and '1'.\",\n\t\"Fablab\": \"Fablab is a bold, ultra-heavy display font with a playful, industrial aesthetic, featuring rounded terminals and unique bone-like negative space cutouts. Its chunky, stencil-inspired letterforms create a modern and experimental look suitable for creative branding.\",\n\t\"Faculty Glyphic\": \"Faculty Glyphic is a refined flared-serif or incised typeface that blends classical elegance with a modern, scholarly feel. It features sharp, triangular terminals and subtle stroke modulation, giving it a chiseled, stone-carved appearance.\",\n\t\"Fahkwang\": \"Fahkwang is a high-contrast sans-serif typeface with a modern, elegant feel, featuring distinct stroke variations that mimic traditional Thai calligraphy. Its clean lines and geometric structure give it a sophisticated, professional appearance suitable for both display and body text.\",\n\t\"Familjen Grotesk\": \"Familjen Grotesk is a clean, contemporary sans-serif font with a medium weight and a friendly, approachable mood. It features distinctive rounded terminals and a tall x-height, blending geometric precision with subtle humanist touches.\",\n\t\"Fanwood Text\": \"Fanwood Text is a classic, old-style serif font with a traditional and literary feel, featuring elegant, slightly irregular strokes and sharp serifs. Its medium weight and balanced proportions make it highly readable, evoking the timeless aesthetic of vintage book typography.\",\n\t\"Farro\": \"Farro is a distinctive sans-serif display font with a medium weight that features unique, slightly flared terminals and organic, hand-drawn curves. It conveys a modern yet approachable mood through its playful, humanist-inspired letterforms and subtle irregularities.\",\n\t\"Farsan\": \"Farsan is a casual, handwritten display font with a medium weight and a slightly condensed, upright structure. It features organic, marker-like strokes and rounded terminals that create a friendly, informal, and approachable mood.\",\n\t\"Fascinate\": \"Fascinate is a bold, Art Deco-inspired display font featuring high-contrast strokes and a playful, retro-glamour aesthetic. Its heavy, rounded letterforms and stylized curves evoke the sophisticated yet whimsical feel of 1920s and 30s cinema and advertising.\",\n\t\"Fascinate Inline\": \"Fascinate Inline is a bold, Art Deco-inspired display font featuring heavy, rounded letterforms with a distinctive white inline detail. Its high-contrast strokes and vintage aesthetic evoke a glamorous, retro-theatrical mood.\",\n\t\"Faster One\": \"Faster One is a high-energy display font featuring heavy, italicized sans-serif letterforms with horizontal speed lines trailing from the left. Its bold weight and aerodynamic aesthetic create a sense of rapid motion and velocity, making it ideal for racing or automotive themes.\",\n\t\"Fasthand\": \"Fasthand is a casual, brush-style script font with a medium weight and a textured, hand-drawn feel. Its energetic, slanted strokes and rough edges create a sense of urgency and personal, informal flair.\",\n\t\"Fauna One\": \"Fauna One is a contemporary serif typeface that blends traditional calligraphic roots with modern, clean lines. It features a medium weight with soft, rounded terminals and a high x-height, creating a friendly yet professional aesthetic suitable for long-form reading.\",\n\t\"Faustina\": \"Faustina is a transitional serif typeface with a medium weight and a classic, editorial feel. It features distinctively chiseled, angular serifs and a high x-height, giving it a sharp and legible appearance suitable for long-form reading.\",\n\t\"Federant\": \"Federant is a bold display font with a classic, calligraphic feel, featuring unique flared serifs and a high-contrast stroke weight. Its design blends historical blackletter influences with modern readability, resulting in a sturdy yet elegant aesthetic.\",\n\t\"Federo\": \"Federo is a high-contrast sans-serif display font with an Art Deco influence, featuring elegant, thin strokes paired with thick verticals for a sophisticated, vintage-modern look. Its unique character is defined by its slightly condensed proportions and distinctive, sharp terminal details.\",\n\t\"Felipa\": \"Felipa is an elegant calligraphic script font featuring a rhythmic, hand-written quality with sharp, angular terminals and a high-contrast stroke weight. Its upright posture and delicate flourishes evoke a sophisticated, classical mood suitable for formal invitations or decorative headings.\",\n\t\"Fenix\": \"Fenix is a serif typeface with a classic, calligraphic feel, featuring strong, angular serifs and a rhythmic contrast between thick and thin strokes. Its sturdy construction and elegant proportions give it a sophisticated yet approachable mood, suitable for both body text and display.\",\n\t\"Festive\": \"Festive is a decorative, hand-drawn script font with a whimsical and celebratory mood, featuring fluid, expressive strokes and elegant flourishes. Its varying line weights and organic, loopy letterforms give it a personalized, calligraphic feel perfect for invitations and holiday themes.\",\n\t\"Fff Tuoi Tre\": \"This is an ultra-bold, heavy display font with a playful, retro-modern feel, featuring tight kerning and distinctive geometric shapes. It is characterized by its thick, blocky strokes, tiny counters, and unique sharp-angled ascenders on the lowercase 't'.\",\n\t\"Figtree\": \"Figtree is a clean, geometric sans-serif font with a modern and friendly feel, featuring circular curves and a medium weight that ensures high legibility. Its balanced proportions and open apertures give it a crisp, professional appearance suitable for both web and print interfaces.\",\n\t\"Finger Paint\": \"Finger Paint is a playful, artistic display font that mimics the thick, textured strokes of wet paint applied by hand. Its irregular letterforms and visible brush-like streaks create a spontaneous, childlike, and informal mood.\",\n\t\"Finlandica\": \"Finlandica is a clean, modern sans-serif font with a medium weight and a functional, Nordic aesthetic. It features distinctive ink traps and sharp, geometric terminals that give it a crisp, contemporary feel.\",\n\t\"Fira Code\": \"Fira Code is a clean, monospaced sans-serif font designed for legibility, featuring a medium weight and a modern, technical aesthetic. It is characterized by its balanced proportions and distinct letterforms, such as the open 'a' and the dotted 'i', which enhance clarity for programming and data display.\",\n\t\"Fira Mono\": \"Fira Mono is a clean, monospaced sans-serif font with a modern and technical feel, featuring a medium weight and distinct, legible letterforms designed for coding and screen readability.\",\n\t\"Fira Sans\": \"Fira Sans is a clean, humanist sans-serif font with a modern and friendly feel, characterized by its open apertures and slightly rounded terminals. It features a medium weight with a high x-height, ensuring excellent legibility for both digital and print interfaces.\",\n\t\"Fira Sans Condensed\": \"Fira Sans Condensed is a clean, humanist sans-serif font with a narrow width and medium weight, offering a modern and highly legible appearance. It features open apertures and slightly rounded terminals, making it feel approachable yet professional.\",\n\t\"Fira Sans Extra Condensed\": \"Fira Sans Extra Condensed is a clean, modern sans-serif font with a highly narrow width and medium weight. It features open apertures and a tall x-height, making it efficient for space-saving layouts while maintaining excellent legibility.\",\n\t\"Fjalla One\": \"Fjalla One is a medium-contrast, condensed sans-serif display font with a bold, authoritative presence. Its narrow proportions and clean, modern lines make it highly impactful for headlines and large-scale typographic use.\",\n\t\"Fjord One\": \"Fjord One is a classic serif typeface with a sturdy, calligraphic feel, featuring prominent wedge-shaped serifs and a high x-height. Its elegant yet robust construction makes it well-suited for long-form reading and sophisticated editorial design.\",\n\t\"Flamenco\": \"Flamenco is a semi-serif display font with a light weight and a playful, rhythmic feel. It features rounded terminals and unique, elongated strokes that give it a graceful, hand-drawn quality.\",\n\t\"Flavors\": \"Flavors is a playful, hand-drawn display font featuring thick, irregular strokes and a splattered, ink-blot aesthetic. Its whimsical, organic shapes and surrounding decorative dots create a fun, casual, and slightly messy mood.\",\n\t\"Fleur De Leah\": \"Fleur De Leah is an elegant, formal script font featuring elaborate, flowing swashes and delicate floral leaf ornaments integrated into the capital letters. Its high-contrast strokes and romantic, calligraphic style evoke a sophisticated and vintage aesthetic.\",\n\t\"Fleuron\": \"Fleuron is a bold, geometric sans-serif display font with a modern, architectural feel, featuring unique stylized letterforms like the open 'u' and 'n' and a distinctive curved 'e'.\",\n\t\"Fliege Mono\": \"Fliege Mono is a clean, monospaced typeface with a light weight and a modern, technical feel. It features a mix of geometric and humanist elements, such as the distinct slab-like serifs on the 'l' and 'i' contrasted with the open, circular curves of the 'e' and 'o'.\",\n\t\"Flow Block\": \"Flow Block is an abstract, ultra-bold display font consisting of solid rectangular blocks that represent text without legible characters. It creates a minimalist, structural look ideal for wireframing or redacted-style graphic design.\",\n\t\"Flow Circular\": \"Flow Circular is an abstract, experimental display font featuring thick, solid horizontal bars with perfectly rounded terminals. It has a minimalist, modern, and utilitarian feel, designed primarily for wireframing and placeholder text to represent content without legible characters.\",\n\t\"Flow Rounded\": \"Flow Rounded is a minimalist, abstract display font featuring thick, solid horizontal bars with heavily rounded terminals. It creates a modern, structural, and non-textual aesthetic designed for wireframing and placeholder content.\",\n\t\"Flux\": \"Flux is a bold, experimental display font with a liquid-like, organic aesthetic, featuring heavy rounded strokes and bulbous terminals that create a futuristic and playful mood. Its unconventional letterforms, such as the disconnected 'F' and the fluid connections in the 'u' and 'x', give it a unique, high-energy visual identity.\",\n\t\"Fluxisch Else\": \"Fluxisch Else is a medium-weight sans-serif display font with a raw, hand-drawn aesthetic characterized by irregular, textured edges. It conveys a DIY, organic mood through its slightly uneven stroke widths and rustic, stamped appearance.\",\n\t\"Foldit\": \"Foldit is a bold, geometric display font with a modern, industrial feel, characterized by its angular 'folded' corners and stencil-like gaps. Its heavy weight and sharp, 45-degree cuts give it a futuristic and architectural appearance.\",\n\t\"Fondamento\": \"Fondamento is a calligraphic, humanist-style typeface inspired by foundational hand lettering, featuring a medium weight and a classic, scholarly mood. Its notable features include sharp, angled serifs, a slight italic lean, and fluid, rhythmic strokes that give it a hand-penned, historical feel.\",\n\t\"Fontdiner Swanky\": \"Fontdiner Swanky is a playful, retro display font with a 1950s lounge aesthetic, featuring irregular baselines and sharp, exaggerated triangular serifs. Its bouncy, whimsical rhythm and bold weight evoke a nostalgic, mid-century 'atomic age' charm.\",\n\t\"Forum\": \"Forum is an elegant, high-contrast serif font with a classic, Roman-inspired feel, featuring sharp serifs and graceful, circular curves. Its sophisticated and timeless aesthetic makes it ideal for editorial headlines and formal branding.\",\n\t\"Fragment Mono\": \"Fragment Mono is a clean, monospaced sans-serif font with a modern, technical aesthetic and a medium weight. It features uniform character widths and geometric shapes, conveying a sense of precision and clarity suitable for coding or minimalist design.\",\n\t\"Frakturmeta\": \"Frakturmeta is a bold blackletter display font that blends traditional Gothic calligraphy with sharp, geometric angles for a modern, edgy feel. Its heavy weight and broken strokes create a dramatic, historic mood with a contemporary, stylized twist.\",\n\t\"Francois One\": \"Francois One is a bold, condensed sans-serif font with a modern and sturdy feel, featuring slightly slanted terminals and a high x-height for strong legibility. Its clean, geometric structure makes it ideal for impactful headlines and display use.\",\n\t\"Frank Ruhl Libre\": \"Frank Ruhl Libre is a classic serif font with a high-contrast stroke weight, featuring sharp, elegant serifs and a sophisticated, literary mood. Its condensed proportions and traditional structure give it a timeless, authoritative appearance suitable for long-form text.\",\n\t\"Fraunces\": \"Fraunces is a high-contrast, Old Style serif typeface that blends classic elegance with a playful, contemporary spirit. It features distinctive soft, rounded terminals and sharp, angular serifs, creating a unique and expressive personality suitable for both display and editorial use.\",\n\t\"Freak Grotesk Next\": \"A bold, modern sans-serif typeface with a clean, grotesque style that features sharp, geometric terminals and a high-impact, authoritative presence. Its uniform stroke weight and tight spacing give it a contemporary, industrial feel suitable for headlines.\",\n\t\"Freckle Face\": \"Freckle Face is a playful, hand-drawn display font featuring heavy, irregular strokes and a rough, ink-blotted texture. Its bouncy baseline and organic, uneven letterforms create a whimsical and casual aesthetic.\",\n\t\"Fredericka The Great\": \"Fredericka the Great is a whimsical, hand-drawn display serif font featuring a unique cross-hatched sketch texture. Its irregular lines and vintage, storybook aesthetic give it a playful yet classic personality.\",\n\t\"Fredoka\": \"Fredoka is a friendly, geometric sans-serif font featuring perfectly rounded terminals and a clean, modern aesthetic. Its soft edges and balanced proportions give it a playful yet professional mood, making it highly legible for both headings and digital interfaces.\",\n\t\"Fredoka One\": \"Fredoka One is a bold, rounded sans-serif display font that exudes a friendly and playful mood. Its thick strokes and soft, circular terminals give it a modern, approachable look ideal for casual branding and headlines.\",\n\t\"Freehand\": \"Freehand is a casual, brush-style script font with a medium weight and a natural, handwritten feel. It features expressive, slightly irregular strokes and a rhythmic slant that conveys a sense of personal, informal elegance.\",\n\t\"Freeman\": \"Freeman is a bold, heavy-weight sans-serif display font with a friendly and approachable mood. It features slightly flared stroke ends and subtle organic curves that give it a hand-drawn, mid-century modern feel.\",\n\t\"Fresca\": \"Fresca is a friendly, casual sans-serif display font featuring slightly irregular, hand-lettered strokes and rounded terminals. Its playful, informal mood is emphasized by its bouncy baseline and organic, soft shapes.\",\n\t\"Frijole\": \"Frijole is a bold, playful display font featuring a hand-drawn, distressed aesthetic with irregular edges and decorative 'shaking' lines that suggest movement. Its chunky, slab-like letterforms create a fun, energetic, and informal mood suitable for casual or comic-style designs.\",\n\t\"Fruktur\": \"Fruktur is a bold, playful display font that reimagines traditional blackletter forms with soft, rounded edges and a hand-cut, organic feel. Its heavy weight and irregular, blocky shapes create a friendly yet striking aesthetic suitable for creative headlines.\",\n\t\"Ft88\": \"A bold, retro-style pixel font that evokes a nostalgic, 8-bit digital aesthetic. Its blocky, monospaced construction features sharp, square edges and a high-contrast, technical feel.\",\n\t\"Fugaz One\": \"Fugaz One is a bold, italicized sans-serif display font with a dynamic and energetic feel. It features geometric shapes combined with unique, playful curves, particularly in the lowercase letters, giving it a modern and fast-paced appearance.\",\n\t\"Fuggles\": \"Fuggles is a whimsical, handwritten script font featuring expressive, sweeping flourishes and a varying line weight that mimics natural ink strokes. Its playful and artistic mood is defined by large, looping descenders and an informal, calligraphic style.\",\n\t\"Funnel Display\": \"Funnel Display is a clean, geometric sans-serif font with a modern and approachable feel. It features open apertures and a medium weight, making it highly legible and well-suited for contemporary digital interfaces and branding.\",\n\t\"Funnel Sans\": \"Funnel Sans is a clean, geometric sans-serif font with a modern and approachable feel. It features open apertures, uniform stroke weights, and a high x-height, making it highly legible for both display and body text.\",\n\t\"Fustat\": \"Fustat is a clean, geometric sans-serif font with a modern and professional feel, featuring open apertures and a balanced weight that ensures high legibility. Its design is characterized by minimalist, circular curves and sharp terminals, making it suitable for both digital interfaces and print.\",\n\t\"Fuzzy Bubbles\": \"Fuzzy Bubbles is a playful, handwritten display font featuring rounded terminals and an irregular, organic stroke width that gives it a friendly and informal appearance. Its soft, bubbly shapes and slight tilt create a whimsical, childlike mood suitable for casual designs.\",\n\t\"Ga Maamli\": \"Ga Maamli is a bold, expressive display font with a hand-painted, calligraphic feel, featuring heavy strokes and sharp, flared terminals. Its irregular, organic shapes and high contrast give it a vibrant, rhythmic energy that feels both traditional and contemporary.\",\n\t\"Gabarito\": \"Gabarito is a geometric sans-serif font with a bold weight and a clean, modern aesthetic. It features distinct circular forms and high-contrast terminals, giving it a friendly yet professional appearance suitable for display and branding.\",\n\t\"Gabriela\": \"Gabriela is a feminine, elegant serif font featuring soft, rounded terminals and distinctive swash-like flourishes on letters like the 'G'. Its moderate contrast and graceful curves give it a classic yet approachable and romantic feel.\",\n\t\"Gaegu\": \"Gaegu is a playful, hand-drawn display font featuring irregular, rounded strokes that give it a casual and friendly appearance. Its uneven lines and childlike charm evoke a sense of warmth and spontaneity, making it ideal for informal designs.\",\n\t\"Gafata\": \"Gafata is a modern sans-serif typeface with a medium weight, featuring unique, slightly flared terminals and a tall x-height that gives it a friendly yet professional appearance. Its clean lines and subtle calligraphic touches make it highly legible and versatile for both display and body text.\",\n\t\"Gajraj One\": \"Gajraj One is an ultra-bold, blocky display font with a heavy, industrial feel and rounded corners that soften its massive presence. Its thick strokes and minimal negative space create a powerful, modern aesthetic suitable for impactful headlines.\",\n\t\"Galada\": \"Galada is a bold, decorative script font with a rhythmic, calligraphic feel, featuring high-contrast strokes and elegant, rounded flourishes. Its fluid, slanted letterforms and heavy weight create a sophisticated yet friendly mood, reminiscent of classic brush lettering.\",\n\t\"Galdeano\": \"Galdeano is a humanist sans-serif font with a medium weight and a friendly, organic feel. It features subtle calligraphic influences, such as flared stroke endings and slightly irregular, hand-drawn curves that give it a warm and approachable character.\",\n\t\"Galindo\": \"Galindo is a heavy, playful display font with a hand-drawn, blocky feel. It features irregular, slightly wobbly outlines and thick strokes that give it a friendly, casual, and energetic personality.\",\n\t\"Gambarino\": \"Gambarino is a high-contrast serif display font that blends classic elegance with modern sharpness, featuring distinctive wedge-shaped serifs and teardrop terminals. Its bold weight and sophisticated curves create a refined, editorial feel suitable for headlines and branding.\",\n\t\"Gambetta\": \"Gambetta is an elegant serif typeface that blends classic proportions with contemporary sharpness, featuring high stroke contrast and distinctive, pointed terminals. Its sophisticated and editorial mood is enhanced by unique details like the curved leg of the 'm' and the stylishly hooked 't'.\",\n\t\"Gamja Flower\": \"Gamja Flower is a playful, handwritten-style display font featuring rounded terminals and irregular, organic strokes that give it a friendly and casual feel. Its medium weight and slightly quirky letterforms evoke a sense of warmth and hand-drawn charm.\",\n\t\"Gantari\": \"Gantari is a clean, geometric sans-serif font with a modern and professional feel, featuring open apertures and a medium weight that ensures high legibility. Its balanced proportions and minimalist design make it versatile for both digital interfaces and print media.\",\n\t\"Gap Sans\": \"Gap Sans is a clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible for both display and body text.\",\n\t\"Gasoek One\": \"Gasoek One is an ultra-bold, heavy-weight display sans-serif with a modern, impactful feel. It features extremely thick strokes, tight counters, and a slightly condensed structure that gives it a powerful, blocky presence.\",\n\t\"Gayathri\": \"Gayathri is a gentle, thin-weight sans-serif font featuring rounded terminals and fluid, calligraphic curves that give it a friendly and modern appearance. Its design is characterized by soft, organic shapes and a high x-height, making it feel approachable and legible.\",\n\t\"Geist\": \"Geist is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform stroke weights and precise, open letterforms. Its square tittle on the 'i' and sharp terminals give it a technical, sophisticated feel suitable for digital interfaces.\",\n\t\"Geist Mono\": \"Geist Mono is a clean, modern monospaced sans-serif font with a medium weight and a technical, minimalist aesthetic. It features precise geometric shapes and generous spacing, making it highly legible for coding and professional design contexts.\",\n\t\"Gelasio\": \"Gelasio is a contemporary serif font with a classic, academic feel, featuring moderate stroke contrast and sharp, wedge-like serifs. Its balanced proportions and open counters provide excellent legibility, making it both professional and approachable.\",\n\t\"Gemunu Libre\": \"Gemunu Libre is a bold, condensed sans-serif font with a modern, industrial feel, characterized by its square proportions and slightly rounded corners. Its uniform stroke weight and compact structure give it a clean, technical appearance suitable for headlines and UI design.\",\n\t\"General Sans\": \"General Sans is a clean, geometric sans-serif font with a modern and professional aesthetic. It features a medium weight with balanced proportions and high legibility, characterized by its open apertures and uniform stroke thickness.\",\n\t\"Genos\": \"Genos is a modern, futuristic sans-serif display font featuring a bold weight and unique, angular letterforms with subtle, rough-hewn edges. Its wide proportions and tech-inspired aesthetic give it a strong, cinematic presence.\",\n\t\"Gentium Book Basic\": \"Gentium Book Basic is a classic serif typeface with a scholarly and elegant feel, featuring sharp, delicate serifs and a moderate stroke contrast. Its design is optimized for readability in long-form text, blending traditional calligraphic influences with a clean, professional aesthetic.\",\n\t\"Gentium Book Plus\": \"Gentium Book Plus is a classic serif typeface with a scholarly and elegant feel, featuring moderate stroke contrast and slightly flared terminals. Its design is optimized for readability in long-form text, combining traditional calligraphic influences with a clean, professional aesthetic.\",\n\t\"Gentium Plus\": \"Gentium Plus is a classic, elegant serif font with a scholarly feel, featuring sharp, calligraphic terminals and a high x-height for excellent readability. Its design balances traditional Roman proportions with subtle, organic curves, giving it a warm and sophisticated appearance.\",\n\t\"Geo\": \"Geo is a bold, ultra-geometric display font featuring a rigid, blocky structure with sharp 90-degree angles. Its minimalist, sans-serif design conveys a modern, architectural, and industrial aesthetic.\",\n\t\"Geologica\": \"Geologica is a clean, geometric sans-serif font with a modern and professional feel, featuring wide proportions and a medium-bold weight. Its design is characterized by open apertures and circular forms, making it highly legible and versatile for both display and body text.\",\n\t\"Geom\": \"A clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring perfectly circular forms and sharp, precise terminals. Its medium weight and balanced proportions convey a sense of clarity and contemporary sophistication.\",\n\t\"Georama\": \"Georama is a modern, geometric sans-serif font with a clean and professional feel, featuring wide proportions and distinctively curved terminals on letters like 'a' and 'm'. Its medium weight and open counters provide excellent legibility, making it suitable for both display and body text.\",\n\t\"Geostar\": \"Geostar is a geometric, monospaced display font with a retro-futuristic feel, characterized by its blocky, architectural structure and distinctive double-line vertical strokes. Its rigid, square proportions and minimalist aesthetic evoke a technical, sci-fi, or early computer-age mood.\",\n\t\"Geostar Fill\": \"Geostar Fill is a bold, geometric slab-serif display font with a retro-futuristic feel, characterized by its wide proportions and blocky, architectural letterforms. Its uniform stroke weight and sharp, rectangular serifs create a sturdy, mechanical aesthetic suitable for headlines and technical branding.\",\n\t\"Germania One\": \"Germania One is a bold display font that blends traditional German blackletter aesthetics with modern geometric simplicity. It features heavy, vertical strokes and distinctive angular terminals, creating a historic yet clean and legible appearance.\",\n\t\"Gfs Didot\": \"GFS Didot is a classic Neo-classical serif font characterized by extreme contrast between thick and thin strokes and flat, unbracketed serifs. It conveys an elegant, formal, and sophisticated mood, typical of the Didone style used in high-end publishing and fashion.\",\n\t\"Gfs Neohellenic\": \"GFS Neohellenic is a clean, monolinear sans-serif font with a classic, humanist feel, featuring subtle flared stroke endings that evoke a calligraphic touch. Its balanced proportions and open apertures create a modern yet timeless aesthetic suitable for both display and body text.\",\n\t\"Gideon Roman\": \"Gideon Roman is a classic serif typeface with a calligraphic feel, featuring elegant, high-contrast strokes and sharp, flared serifs. Its traditional proportions and refined details evoke a sense of timeless sophistication and literary authority.\",\n\t\"Gidole\": \"Gidole is a clean, modern sans-serif font featuring a regular weight and a minimalist, geometric aesthetic. Its design is characterized by open apertures and a tall x-height, giving it a professional and highly legible appearance.\",\n\t\"Gidugu\": \"Gidugu is a bold, heavy-weight display font with a modern, geometric feel, featuring thick strokes and subtle, sharp terminals that give it a sturdy and impactful presence.\",\n\t\"Gilda Display\": \"Gilda Display is an elegant, high-contrast serif font with a classic and sophisticated feel, featuring delicate hairlines and sharp, refined terminals. Its slender proportions and graceful curves make it ideal for luxury branding and editorial headlines.\",\n\t\"Girassol\": \"Girassol is a condensed display serif font with a hand-painted feel, featuring high contrast, sharp terminals, and a vintage, artisanal mood. Its tall, narrow proportions and decorative flourishes give it a distinct, elegant character inspired by Portuguese road signage.\",\n\t\"Give You Glory\": \"Give You Glory is a casual, handwritten display font with a playful and authentic feel, featuring irregular letter heights and a mix of print and cursive elements. Its thin, marker-like strokes and quirky, uneven baseline give it a personal, spontaneous charm.\",\n\t\"Glass Antiqua\": \"Glass Antiqua is a slender, Art Nouveau-inspired serif font featuring elegant, rounded terminals and a playful, vintage charm. Its tall x-height and distinctive, soft curves give it a whimsical yet sophisticated appearance reminiscent of early 20th-century design.\",\n\t\"Glegoo\": \"Glegoo is a modern slab-serif typeface with a balanced, monolinear weight and a clean, geometric structure. Its large x-height and sturdy, square serifs give it a friendly yet professional appearance suitable for both display and body text.\",\n\t\"Gloock\": \"Gloock is a high-contrast, modern serif display font with a sophisticated and fashion-forward mood. It features dramatic thick-to-thin transitions, sharp vertical stress, and elegant, flat-topped serifs that give it a bold yet refined editorial look.\",\n\t\"Gloria Hallelujah\": \"Gloria Hallelujah is a casual, marker-style handwriting font with a playful and youthful mood. It features irregular, rounded strokes and a medium weight that mimics the look of natural writing on a whiteboard or paper.\",\n\t\"Glory\": \"Glory is a clean, geometric sans-serif font with a modern and professional feel, featuring rounded terminals and a medium weight. Its balanced proportions and open apertures create a friendly yet sophisticated aesthetic suitable for both display and body text.\",\n\t\"Gluten\": \"Gluten is a playful, hand-drawn display font featuring thick, rounded strokes and irregular, organic edges that give it a soft and friendly appearance. Its bouncy baseline and informal, doughy shapes evoke a sense of warmth and casual creativity.\",\n\t\"Gnomon\": \"Gnomon is a bold, geometric sans-serif display font with a modern and impactful feel, featuring thick strokes and circular letterforms. Its heavy weight and clean, minimalist construction make it ideal for strong branding and headlines.\",\n\t\"Goblin One\": \"Goblin One is a heavy, wide display serif font with a bold and somewhat whimsical personality. It features sharp, triangular serifs and high-contrast strokes that give it a classic yet slightly eccentric, storybook-like appearance.\",\n\t\"Gochi Hand\": \"Gochi Hand is a playful, casual handwriting font with a medium-bold weight and rounded terminals that mimic the look of a felt-tip marker. Its irregular, expressive strokes and slightly bouncy baseline create a friendly, informal, and youthful mood.\",\n\t\"Goldman\": \"Goldman is a bold, futuristic display font featuring a square, blocky structure with rounded outer corners and sharp inner angles. Its wide proportions and industrial aesthetic give it a high-tech, sci-fi feel suitable for gaming or modern branding.\",\n\t\"Golos Text\": \"Golos Text is a versatile geometric sans-serif font with a clean, modern aesthetic and a medium weight. It features open apertures and balanced proportions, making it highly legible and professional for both digital and print interfaces.\",\n\t\"Google Sans\": \"A clean, geometric sans-serif font with a modern and approachable feel, featuring circular letterforms and open apertures for high legibility.\",\n\t\"Google Sans Code\": \"Google Sans Code is a clean, monospaced sans-serif font with a modern and professional aesthetic. It features geometric letterforms, consistent stroke weights, and generous spacing, making it highly legible for programming and technical environments.\",\n\t\"Google Sans Flex\": \"A clean, geometric sans-serif font with a modern and approachable feel, featuring open counters and uniform stroke weights. Its balanced proportions and minimalist design convey a sense of clarity and professional simplicity.\",\n\t\"Gorditas\": \"Gorditas is a playful, heavy-weight display font featuring chunky, hand-drawn letterforms with a friendly, informal mood. Its most distinctive feature is the heart-shaped tittle over the lowercase 'i', which adds a whimsical and charming touch to its bold, rounded aesthetic.\",\n\t\"Gothic A1\": \"Gothic A1 is a versatile, neo-grotesque sans-serif font with a clean, modern aesthetic and balanced proportions. Its neutral design and wide range of weights make it highly legible and suitable for both body text and headlines.\",\n\t\"Gotu\": \"Gotu is a refined, contemporary serif typeface featuring high stroke contrast and elegant, calligraphic-inspired terminals. Its open counters and balanced proportions create a sophisticated, airy feel suitable for both display and body text.\",\n\t\"Goudy Bookletter 1911\": \"Goudy Bookletter 1911 is a classic Old Style serif font with a warm, literary feel, featuring elegant calligraphic details and distinctive diamond-shaped dots. Its medium weight and graceful proportions evoke a sense of early 20th-century craftsmanship and timeless sophistication.\",\n\t\"Gowun Batang\": \"Gowun Batang is a delicate serif font with a classic, calligraphic feel, featuring organic, slightly irregular strokes that evoke a warm, hand-drawn quality. Its light weight and elegant proportions create a soft, approachable mood suitable for literary or traditional designs.\",\n\t\"Gowun Dodum\": \"Gowun Dodum is a clean, humanist sans-serif font with a friendly and approachable mood, featuring rounded terminals and a consistent, light-to-medium stroke weight. Its design balances modern simplicity with a subtle hand-drawn quality, making it highly legible and warm.\",\n\t\"Graduate\": \"Graduate is a bold, blocky slab-serif display font that evokes a classic collegiate or athletic aesthetic. It features heavy, geometric letterforms with distinct octagonal corners and thick, uniform strokes that convey a sense of tradition and strength.\",\n\t\"Grand Hotel\": \"Grand Hotel is a condensed upright script font with a vintage, mid-century aesthetic inspired by 1930s signage. It features monolinear strokes, rounded terminals, and a playful yet elegant personality that evokes a classic bakery or cafe feel.\",\n\t\"Grandiflora One\": \"Grandiflora One is an elegant, light-weight serif font with a delicate, classic feel, featuring high-contrast strokes and distinctive ball terminals that add a touch of refined sophistication.\",\n\t\"Grandstander\": \"Grandstander is a playful, hand-drawn sans-serif display font with a friendly and informal mood. It features irregular, slightly wobbly strokes and rounded terminals that give it a casual, comic-book-like aesthetic.\",\n\t\"Grape Nuts\": \"Grape Nuts is a casual, handwritten script font with a medium weight and a playful, energetic mood. It features irregular, fluid strokes and a slight slant that give it a personal, hand-drawn appearance.\",\n\t\"Grave Presse\": \"This is an ultra-bold, heavy sans-serif display font with a modern and impactful feel. It features tight letter spacing and thick, blocky strokes that create a powerful, commanding presence.\",\n\t\"Gravitas One\": \"Gravitas One is a heavy, high-contrast display serif font modeled after the 'Fat Face' style, featuring thick vertical strokes and very thin horizontal hairlines. It conveys a bold, classic, and authoritative mood, making it ideal for headlines and advertising.\",\n\t\"Great Vibes\": \"Great Vibes is a beautifully flowing script font with an elegant, formal mood, featuring looping ascenders and descenders that give it a hand-lettered, calligraphic feel. Its high-contrast strokes and fluid connections make it ideal for sophisticated designs like invitations and branding.\",\n\t\"Grechen Fuemen\": \"Grechen Fuemen is a casual, handwritten script font with a fluid, calligraphic feel and a medium weight. Its expressive, sweeping strokes and organic curves create a personal and artistic mood, reminiscent of ink on paper.\",\n\t\"Grenze\": \"Grenze is a bold, hybrid serif font that blends blackletter influences with contemporary geometry, featuring sharp, angular terminals and a high-contrast, architectural feel. Its heavy weight and chiseled appearance evoke a sense of strength and historical drama while remaining highly legible.\",\n\t\"Grenze Gotisch\": \"Grenze Gotisch is a bold blackletter-inspired display font that blends medieval gothic aesthetics with modern, angular geometry. It features sharp, chiseled edges and high-contrast strokes, creating a dramatic and authoritative mood.\",\n\t\"Grey Qo\": \"Grey Qo is an elegant, calligraphic script font featuring fluid, expressive strokes and a high-contrast weight that evokes a sense of sophisticated, hand-lettered artistry. Its sweeping flourishes and rhythmic, cursive flow give it a classic yet dynamic personality suitable for formal invitations or decorative branding.\",\n\t\"Griffy\": \"Griffy is a whimsical, decorative display font featuring irregular, hand-drawn strokes and playful spiral flourishes. Its jagged edges and eccentric letterforms evoke a spooky yet charming Tim Burton-esque aesthetic, perfect for fantasy or holiday-themed designs.\",\n\t\"Grith\": \"Grith is an ultra-bold, condensed sans-serif display font with a powerful, industrial feel. It features heavy, blocky letterforms with subtle distressed edges and tight spacing, creating a rugged and impactful aesthetic.\",\n\t\"Gruppo\": \"Gruppo is a clean, minimalist sans-serif display font with a light weight and a modern, airy feel. It features wide, geometric letterforms with distinctive open counters and a subtle tech-inspired aesthetic.\",\n\t\"Gudea\": \"Gudea is a clean, functional sans-serif font with a modern and professional feel, featuring condensed proportions and open apertures for high legibility. Its uniform stroke weight and geometric structure make it versatile for both technical documentation and digital interfaces.\",\n\t\"Gugi\": \"Gugi is a bold, futuristic display font featuring ultra-rounded corners and a monolinear stroke weight that creates a playful, tech-oriented aesthetic. Its unique design uses geometric, capsule-like shapes and circular dots to replace traditional letterforms, giving it a distinctively modern and experimental look.\",\n\t\"Gulzar\": \"Gulzar is a bold, high-contrast serif font with a classic and elegant feel, featuring sharp, angular serifs and distinctive calligraphic flourishes. Its thick vertical strokes and tapered curves give it a sophisticated, traditional appearance suitable for formal headings.\",\n\t\"Gupter\": \"Gupter is a classic serif font with a medium weight that exudes a professional and scholarly mood. It features sharp, wedge-shaped serifs and a high stroke contrast, giving it a refined and traditional appearance suitable for long-form reading.\",\n\t\"Gurajada\": \"Gurajada is a bold, display-style sans-serif font with a friendly and slightly informal mood, characterized by its thick strokes and unique, blocky terminal shapes.\",\n\t\"Gveret Levin\": \"Gveret Levin is a playful, informal handwriting font with a casual, italicized lean and rounded stroke terminals. Its medium weight and organic, handwritten letterforms convey a friendly and personal mood.\",\n\t\"Gwendolyn\": \"Gwendolyn is an elegant, formal script font featuring fluid, calligraphic strokes with high contrast between thick and thin lines. Its sweeping flourishes and delicate loops evoke a classic, romantic, and sophisticated mood.\",\n\t\"Habibi\": \"Habibi is a high-contrast serif font with a classic, elegant feel, featuring sharp, flat serifs and distinctive circular dots on the 'i' that suggest a calligraphic influence.\",\n\t\"Hachi Maru Pop\": \"Hachi Maru Pop is a playful, rounded display font with a charming, hand-drawn aesthetic reminiscent of 1970s and 80s Japanese 'kawaii' handwriting. It features soft, monolinear strokes and circular terminals, creating a friendly and nostalgic mood.\",\n\t\"Hahmlet\": \"Hahmlet is a classic serif typeface with a medium weight that blends traditional elegance with modern clarity. It features sharp, wedge-like serifs and a subtle calligraphic influence, giving it a sophisticated and literary mood.\",\n\t\"Halant\": \"Halant is a refined serif typeface with a classic, scholarly feel, featuring sharp, wedge-shaped serifs and high-contrast strokes. Its elegant proportions and open counters give it a sophisticated and highly legible appearance suitable for editorial design.\",\n\t\"Halibut\": \"This is a high-contrast serif display font with a sophisticated and sharp aesthetic. It features extremely thin hairlines paired with thick stems and distinctive, oversized triangular serifs that give it a modern, edgy personality.\",\n\t\"Hammersmith One\": \"Hammersmith One is a bold, low-contrast sans-serif font with a sturdy, handmade feel inspired by traditional British lettering. It features distinctive quirks like the diamond-shaped tittle on the 'i' and slightly flared stroke endings, giving it a modern yet approachable personality.\",\n\t\"Hanalei\": \"Hanalei is a bold, decorative display font with a playful, tropical mood, featuring letterforms constructed from segmented bamboo stalks. Its hand-drawn, organic aesthetic and thick outlines make it ideal for tiki-themed designs or island-inspired branding.\",\n\t\"Hanalei Fill\": \"Hanalei Fill is a bold, decorative display font with a tropical, tiki-inspired aesthetic, featuring letterforms constructed from thick, segmented bamboo-like shapes. Its irregular, hand-carved appearance evokes a playful, exotic mood perfect for island-themed designs.\",\n\t\"Handjet\": \"Handjet is a modular, pixel-based display font with a retro-digital aesthetic, characterized by its blocky, grid-like construction and tall x-height. Its uniform stroke weight and jagged edges evoke a nostalgic, lo-fi tech feel reminiscent of early computer graphics or dot-matrix printing.\",\n\t\"Handlee\": \"Handlee is a casual, handwritten-style font with a friendly and personal feel, featuring slightly irregular letterforms and rounded terminals. Its medium weight and gentle curves give it a natural, humanistic appearance that is both legible and approachable.\",\n\t\"Hanken Grotesk\": \"Hanken Grotesk is a clean, geometric sans-serif typeface with a modern and versatile feel. It features balanced proportions, open apertures, and a medium weight that ensures excellent legibility for both display and body text.\",\n\t\"Hanuman\": \"Hanuman is a sturdy, traditional serif font with a classic and formal feel, featuring thick, blocky slab-like serifs and a consistent stroke weight. Its tall x-height and clear, open counters provide excellent legibility, making it suitable for both body text and headlines.\",\n\t\"Happy Monkey\": \"Happy Monkey is a playful, monolinear sans-serif display font with a friendly, hand-drawn feel. It features rounded terminals and a slightly irregular, whimsical structure that gives it a casual and cheerful personality.\",\n\t\"Harmattan\": \"Harmattan is a clean, humanist sans-serif font with a friendly and approachable mood, featuring subtle calligraphic influences in its stroke endings. Its medium weight and open counters ensure high legibility, making it suitable for both body text and display use.\",\n\t\"Hauora\": \"Hauora is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform line weight and open apertures. Its balanced proportions and circular curves convey a sense of clarity and professional elegance.\",\n\t\"Havana\": \"Havana is a casual, monoline script font with a playful and hand-drawn feel, featuring rounded terminals and a rhythmic, upright cursive flow. Its uniform line weight and loopy letterforms give it a friendly, approachable, and modern aesthetic.\",\n\t\"Headland One\": \"Headland One is a classic serif typeface with a sturdy, medium weight and a professional yet approachable mood. It features distinct, slightly asymmetrical serifs and a high x-height, making it highly legible for both headlines and body text.\",\n\t\"Hedvig Letters Sans\": \"A clean, modern sans-serif typeface with a regular weight and a friendly, approachable mood. It features open apertures and a high x-height, making it highly legible for both display and body text.\",\n\t\"Hedvig Letters Serif\": \"Hedvig Letters Serif is a classic, high-contrast serif font with a sophisticated and literary feel, featuring sharp, wedge-shaped serifs and elegant, open letterforms. Its balanced proportions and traditional structure make it highly legible and suitable for formal editorial or academic contexts.\",\n\t\"Heebo\": \"Heebo is a clean, neo-grotesque sans-serif font with a modern and highly legible appearance. It features uniform stroke weights and geometric shapes, giving it a crisp, professional feel suitable for both digital and print interfaces.\",\n\t\"Henny Penny\": \"Henny Penny is a whimsical display font with a playful, storybook mood, featuring irregular letterforms and decorative, curved serifs. Its hand-drawn quality and bouncy baseline give it a charming, informal character suitable for children's themes.\",\n\t\"Hepta Slab\": \"Hepta Slab is a contemporary slab serif typeface featuring a light weight and high contrast between its thin strokes and prominent, blocky serifs. It blends a classic, academic feel with modern geometric precision, resulting in a clean and sophisticated aesthetic.\",\n\t\"Herr Von Muellerhoff\": \"Herr Von Muellerhoff is an elegant, traditional calligraphic script font featuring a strong slant and fluid, sweeping flourishes. Its delicate, varying line weights and ornate loops evoke a sense of classic sophistication and formal handwriting.\",\n\t\"Hershey Noailles Times\": \"A monospaced serif font with a technical, typewriter-like aesthetic, featuring uniform stroke weights and prominent slab-style serifs. Its narrow proportions and clean lines evoke a classic, functional mood reminiscent of early computer plotting or architectural lettering.\",\n\t\"Hi Melody\": \"Hi Melody is a playful, handwritten display font with a casual and friendly mood. It features irregular, monolinear strokes, rounded terminals, and a charmingly unrefined aesthetic that mimics natural felt-tip pen writing.\",\n\t\"Hikasami\": \"A clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform stroke weights and perfectly circular curves in letters like 'a' and 'm'.\",\n\t\"Hina Mincho\": \"Hina Mincho is a classic serif font with a delicate, old-style feel, featuring high contrast between thick and thin strokes and rounded terminals. Its elegant and slightly antique aesthetic evokes a sense of traditional craftsmanship and literary sophistication.\",\n\t\"Hind\": \"Hind is a clean, open-source sans-serif typeface featuring a large x-height and monolinear stroke weights, giving it a modern and highly legible appearance. Its geometric structure and flat terminals create a professional, neutral mood suitable for both UI design and body text.\",\n\t\"Hind Guntur\": \"Hind Guntur is a clean, modern sans-serif typeface with a medium weight and a professional, utilitarian mood. It features open counters, monolinear strokes, and flat terminals that ensure high legibility for both UI and body text.\",\n\t\"Hind Madurai\": \"Hind Madurai is a clean, open-source sans-serif typeface with a modern and functional aesthetic. It features monolinear stroke weights and flat terminal ends, making it highly legible for both UI design and body text.\",\n\t\"Hind Mysuru\": \"Hind Mysuru is a clean, modern sans-serif typeface with a medium weight and a professional, neutral mood. It features open counters and monolinear strokes, making it highly legible for both UI design and body text.\",\n\t\"Hind Siliguri\": \"Hind Siliguri is a clean, modern sans-serif typeface featuring a medium weight and a humanist feel. Its open counters and monolinear strokes create a highly legible and professional appearance suitable for both UI and body text.\",\n\t\"Hind Vadodara\": \"Hind Vadodara is a clean, open-source sans-serif typeface with a modern, humanist feel and a medium weight. It features flat stroke endings and a large x-height, making it highly legible and professional for both digital and print interfaces.\",\n\t\"Holtwood One Sc\": \"Holtwood One SC is a heavy, slab-serif display font with an ultra-bold weight and a rugged, athletic feel. Its thick, blocky letterforms and small caps style evoke a classic, industrial aesthetic suitable for impactful headlines.\",\n\t\"Homemade Apple\": \"Homemade Apple is a casual, handwritten script font with a charming, personal feel, featuring a slight slant and a textured, ink-on-paper aesthetic. Its irregular strokes and flowing connections evoke a nostalgic, homey mood, making it ideal for projects that require a touch of authenticity and warmth.\",\n\t\"Homenaje\": \"Homenaje is a narrow, condensed sans-serif font with a modern, industrial feel, featuring unique angular terminals and a tall x-height. Its tight spacing and geometric construction make it ideal for impactful headlines and display use.\",\n\t\"Honk\": \"Honk is an ultra-bold, blocky display font with a playful, industrial feel, featuring heavy geometric letterforms and chamfered corners. Its extremely thick strokes and minimal negative space create a loud, high-impact aesthetic suitable for headlines.\",\n\t\"Hooskai Chamfered Square\": \"A bold, geometric display font with a futuristic, industrial feel, featuring blocky letterforms and distinct chamfered (clipped) corners. Its uniform stroke weight and square architecture give it a high-tech, sci-fi aesthetic.\",\n\t\"Hoover\": \"Hoover is a bold, slab-serif display font with a strong collegiate or athletic feel, characterized by its blocky, octagonal letterforms and heavy, squared-off serifs. Its rigid, geometric construction gives it a sturdy and authoritative appearance, reminiscent of traditional varsity lettering.\",\n\t\"Host Grotesk\": \"Host Grotesk is a clean, modern sans-serif font with a geometric influence, featuring uniform stroke weights and open apertures that create a professional and highly legible appearance. Its neutral, minimalist aesthetic makes it versatile for both digital interfaces and contemporary branding.\",\n\t\"Huab\": \"Huab is an ultra-bold, experimental display font featuring massive, pill-shaped letterforms with minimal negative space. Its playful, bubbly aesthetic is defined by rounded terminals and a heavy, monolithic weight that prioritizes graphic impact over legibility.\",\n\t\"Hubballi\": \"Hubballi is a monolinear sans-serif display font with a friendly, modern feel, characterized by its rounded terminals and wide, circular letterforms. Its uniform stroke weight and open counters create a clean, approachable aesthetic suitable for headlines and branding.\",\n\t\"Hubot Sans\": \"Hubot Sans is a modern, geometric sans-serif font with a clean and technical feel, featuring wide proportions and distinct, squared-off terminals. Its balanced weight and open counters give it a robotic yet approachable aesthetic, making it ideal for digital interfaces and branding.\",\n\t\"Huninn\": \"Huninn is a friendly, rounded sans-serif font with a medium weight and a soft, approachable mood. Its most notable features are the perfectly circular stroke endings and smooth curves, giving it a clean and modern yet playful appearance.\",\n\t\"Hurricane\": \"Hurricane is a fluid, expressive script font with a hand-drawn, calligraphic feel, featuring a strong rightward slant and varying stroke weights. Its energetic, organic lines and textured edges evoke a sense of motion and personal, informal elegance.\",\n\t\"Iansui\": \"Iansui is a handwritten-style font with a casual, organic feel, featuring irregular stroke widths and slightly wobbly lines that mimic ink on paper. It combines elements of a slab serif with a playful, personal touch, making it appear friendly and informal.\",\n\t\"Ibarra Real Nova\": \"Ibarra Real Nova is an elegant, classic serif font with a refined and scholarly mood, featuring sharp, delicate serifs and a high-contrast stroke weight. Its design is rooted in 18th-century Spanish typography, characterized by graceful curves and a timeless, formal aesthetic.\",\n\t\"Ibm Plex Mono\": \"IBM Plex Mono is a clean, monospaced sans-serif font that balances a technical, industrial aesthetic with modern readability. It features distinct, geometric letterforms with sharp terminals and a medium weight, conveying a professional and functional mood.\",\n\t\"Ibm Plex Sans\": \"IBM Plex Sans is a clean, neutral grotesque sans-serif font that balances engineered precision with friendly, open curves. It features a medium weight and a modern, professional aesthetic with distinct, legible letterforms.\",\n\t\"Ibm Plex Sans Arabic\": \"A clean, modern sans-serif font with a neutral and professional tone, featuring balanced proportions and a medium weight that ensures high legibility.\",\n\t\"Ibm Plex Sans Condensed\": \"A clean, modern sans-serif font with a narrow, condensed width and a medium weight. It features a neutral, technical aesthetic with sharp terminals and open apertures, making it highly legible for functional and corporate use.\",\n\t\"Ibm Plex Sans Devanagari\": \"A clean, modern sans-serif typeface with a neutral yet engineered feel, featuring open apertures and a balanced weight that ensures high legibility. Its professional and technical aesthetic is defined by a harmonious blend of geometric and grotesque design elements.\",\n\t\"Ibm Plex Sans Hebrew\": \"A clean, modern sans-serif typeface with a neutral and professional tone, featuring open apertures and a balanced, medium weight for high legibility.\",\n\t\"Ibm Plex Sans Jp\": \"A clean, neutral grotesque sans-serif font with a medium weight that balances industrial precision with a modern, professional feel. It features open apertures and a high x-height, ensuring excellent legibility for both technical and corporate applications.\",\n\t\"Ibm Plex Sans Kr\": \"A clean, modern sans-serif typeface with a medium weight that balances industrial precision with humanistic touches. It features open apertures and a neutral, professional mood suitable for high-readability technical and corporate environments.\",\n\t\"Ibm Plex Sans Thai\": \"A clean, modern sans-serif typeface with a neutral and professional tone, featuring a medium weight and balanced geometric proportions. It conveys a sense of technical precision and clarity, making it highly legible for both display and body text.\",\n\t\"Ibm Plex Sans Thai Looped\": \"A clean, modern sans-serif font with a medium weight that balances industrial precision with approachable, open letterforms. It features a neutral yet sophisticated tone, characterized by its high legibility and balanced proportions.\",\n\t\"Ibm Plex Serif\": \"IBM Plex Serif is a contemporary, medium-weight serif font that balances a professional, technical mood with classic readability. It features sharp, rectangular serifs and distinct, open letterforms that provide a clean and structured appearance.\",\n\t\"Iceberg\": \"Iceberg is a bold, geometric display font with a cold, industrial feel, featuring sharp 45-degree angles and a modular, blocky construction. Its monolinear strokes and lack of curves give it a futuristic, chiseled appearance reminiscent of digital or architectural design.\",\n\t\"Iceland\": \"Iceland is a modern, geometric display font with a cold, futuristic feel, characterized by its sharp, angular cuts and modular, square-based letterforms. Its monolinear weight and unique diagonal terminals give it a high-tech, architectural appearance suitable for digital and sci-fi contexts.\",\n\t\"Idiqlat\": \"Idiqlat is a bold, chiseled slab-serif display font with a rustic, historical mood. It features heavy, squared-off serifs and uneven, hand-carved edges that give it a strong, archaic, or lithic appearance.\",\n\t\"Im Fell Double Pica\": \"This is a classic old-style serif font with a historic, hand-inked feel, characterized by its irregular edges and high-contrast strokes. It conveys a scholarly and antique mood, reminiscent of 17th-century printing and vintage manuscripts.\",\n\t\"Im Fell Double Pica Sc\": \"This is a classic, old-style serif font featuring small caps and a weathered, hand-inked texture that evokes a 17th-century historical feel. Its irregular edges and varying stroke weights give it an authentic, antique appearance suitable for vintage or scholarly designs.\",\n\t\"Im Fell Dw Pica\": \"This is a classic serif font with a vintage, hand-inked feel, featuring irregular edges and a slightly weathered texture. It conveys a sense of historical authenticity and scholarly charm, reminiscent of 17th-century typesetting.\",\n\t\"Im Fell Dw Pica Sc\": \"This is a classic, old-style serif font in small caps, featuring a weathered, hand-inked texture that evokes a historical, 17th-century printing press aesthetic. Its irregular edges and varying stroke weights give it an authentic, antique feel suitable for vintage or scholarly designs.\",\n\t\"Im Fell English\": \"IM Fell English is a classic serif font with a vintage, hand-inked feel, characterized by its irregular, slightly distressed edges and traditional letterforms. It evokes a sense of historical authenticity and scholarly charm, reminiscent of 17th-century typesetting.\",\n\t\"Im Fell English Sc\": \"This is a classic serif font in a small caps style, featuring a weathered, hand-inked texture that evokes a historic, 17th-century printing aesthetic. Its irregular edges and varying stroke weights give it an authentic, antique feel suitable for vintage or scholarly designs.\",\n\t\"Im Fell French Canon\": \"This is a classic serif font with a historic, hand-inked feel, featuring irregular edges and high-contrast strokes that evoke 17th-century printing. Its elegant yet rustic appearance gives it a scholarly and vintage mood, characterized by its distinctive long serifs and organic letterforms.\",\n\t\"Im Fell French Canon Sc\": \"This is a classic serif font in a small caps style, featuring a vintage, hand-inked aesthetic with irregular edges and high-contrast strokes. It conveys a historic, scholarly mood, reminiscent of 17th-century typography and traditional letterpress printing.\",\n\t\"Im Fell Great Primer\": \"IM Fell Great Primer is a classic, old-style serif font with a rustic, hand-inked feel, characterized by its irregular edges and historical, scholarly mood. Its medium weight and slightly distressed texture evoke the charm of 17th-century letterpress printing.\",\n\t\"Im Fell Great Primer Sc\": \"This is a classic, old-style serif font featuring small caps and a weathered, hand-inked texture that evokes a historical, 17th-century printing aesthetic. Its irregular edges and varying stroke weights give it an authentic, antique feel suitable for vintage or scholarly designs.\",\n\t\"Imbue\": \"Imbue is an elegant, high-contrast serif display font with an extremely condensed structure and a sophisticated, fashion-forward mood. It features sharp, flat serifs and dramatic verticality, making it ideal for editorial headlines and luxury branding.\",\n\t\"Imperial Script\": \"Imperial Script is an elegant, formal calligraphic font featuring high-contrast strokes and elaborate, swirling flourishes. Its slanted, traditional Spencerian style evokes a sense of classic sophistication and luxury.\",\n\t\"Imprima\": \"Imprima is a clean, humanist sans-serif font with a friendly and legible character, featuring a medium weight and generous spacing. Its design is characterized by subtle, organic curves and a high x-height, making it well-suited for both digital and print body text.\",\n\t\"Inclusive Sans\": \"Inclusive Sans is a clean, contemporary neo-grotesque sans-serif font with a medium weight and a friendly, highly legible mood. It features distinct letterforms designed for accessibility, such as the footed 'I' and open apertures, ensuring clarity and ease of reading.\",\n\t\"Inconsolata\": \"Inconsolata is a clean, monospaced sans-serif font designed for legibility, featuring a medium weight and a modern, technical aesthetic. It is characterized by its balanced proportions, subtle terminal curves, and distinct letterforms that make it ideal for coding and high-readability contexts.\",\n\t\"Inder\": \"Inder is a clean, humanist sans-serif font with a medium weight and a friendly, modern feel. It features open counters and slightly rounded terminals that enhance its readability and approachable character.\",\n\t\"Indie Flower\": \"Indie Flower is a carefree, handwritten display font with a medium weight and rounded edges that give it a friendly, casual feel. Its bubbly letterforms and irregular strokes create a playful, DIY aesthetic reminiscent of natural penmanship.\",\n\t\"Ingrid Darling\": \"Ingrid Darling is a whimsical, hand-drawn script font with a medium weight and a playful, romantic mood. It features elegant loops, irregular stroke widths, and a charmingly imperfect, handwritten quality that gives it a personal and vintage feel.\",\n\t\"Inika\": \"Inika is a bold, slab-serif display font with a hand-carved or woodcut feel, featuring irregular, blocky edges and thick strokes. Its rustic and organic aesthetic gives it a friendly, artisanal mood that is both sturdy and expressive.\",\n\t\"Inknut Antiqua\": \"Inknut Antiqua is a robust, old-style serif font featuring heavy, angular serifs and a tall x-height that gives it a scholarly yet commanding presence. Its chiseled, calligraphic details evoke a sense of traditional craftsmanship and literary classicism.\",\n\t\"Inria Sans\": \"Inria Sans is a contemporary humanist sans-serif font that balances a clean, professional aesthetic with subtle, elegant curves. It features a medium weight and open apertures, conveying a sense of modern clarity and academic sophistication.\",\n\t\"Inria Serif\": \"Inria Serif is a contemporary serif typeface with a balanced, scholarly feel, featuring sharp, flat serifs and a moderate stroke contrast. Its tall x-height and open apertures give it a clean, legible appearance that blends traditional elegance with modern utility.\",\n\t\"Inspiration\": \"Inspiration is an elegant, fluid script font with a hand-drawn, calligraphic feel, featuring high-contrast strokes and expressive, looping flourishes. Its whimsical and airy aesthetic conveys a sense of creativity and informal sophistication.\",\n\t\"Instrument Sans\": \"Instrument Sans is a clean, modern neo-grotesque sans-serif with a medium weight and a professional, utilitarian mood. It features tight apertures and a high x-height, giving it a precise and contemporary appearance suitable for both display and body text.\",\n\t\"Instrument Serif\": \"Instrument Serif is an elegant, high-contrast display serif font with a condensed width and a sophisticated, modern-classic feel. It features sharp, delicate serifs and tall x-heights, making it ideal for editorial headlines and refined branding.\",\n\t\"Intel One Mono\": \"Intel One Mono is a clean, modern monospaced typeface designed for maximum legibility, featuring a medium weight and distinct, expressive letterforms like the hooked 'l' and 't'. Its balanced, technical aesthetic makes it highly functional for coding while maintaining a friendly, approachable feel.\",\n\t\"Inter\": \"Inter is a clean, modern neo-grotesque sans-serif font featuring a tall x-height and neutral aesthetic designed for high legibility on screens. Its balanced weight and precise geometric shapes convey a professional, functional, and highly versatile mood.\",\n\t\"Inter Tight\": \"Inter Tight is a clean, modern neo-grotesque sans-serif font featuring a medium weight and a neutral, professional mood. It is characterized by its tall x-height, geometric letterforms, and notably condensed letter spacing designed for high-density layouts.\",\n\t\"Iosevka Charon\": \"Iosevka Charon is a slim, monospace slab-serif font featuring a technical and modern aesthetic with distinctive narrow proportions. Its clean lines and subtle serifs provide a structured, utilitarian look suitable for coding and high-density information displays.\",\n\t\"Iosevka Charon Mono\": \"A sleek and modern monospaced sans-serif font featuring a condensed width and a very clean, technical aesthetic. Its tall x-height and slightly rounded edges give it a sophisticated, programmable appearance that is functional yet approachable.\",\n\t\"Irish Grover\": \"Irish Grover is a whimsical, bold display font with a playful and rustic feel, featuring irregular, hand-drawn letterforms and flared terminals. Its bouncy baseline and chunky, uneven strokes evoke a sense of charm and festive energy, reminiscent of traditional Celtic or storybook aesthetics.\",\n\t\"Island Moments\": \"Island Moments is an elegant, light-weight script font with a hand-drawn, calligraphic feel, featuring fluid strokes and a slightly distressed, organic texture. Its breezy, informal style evokes a sense of relaxed sophistication and personal touch.\",\n\t\"Istok Web\": \"Istok Web is a clean, modern sans-serif typeface with a balanced weight and a professional, highly legible appearance. It features subtle calligraphic touches, such as the angled terminals on the 's' and 't', which add a unique character to its otherwise functional and geometric design.\",\n\t\"Italiana\": \"Italiana is an elegant, high-contrast serif font inspired by traditional Italian calligraphy, featuring thin horizontal strokes and thick verticals. Its sophisticated and classic aesthetic makes it ideal for luxury branding and editorial headlines.\",\n\t\"Italianno\": \"Italianno is an elegant, calligraphic script font with a formal and romantic mood, featuring fluid, slanted strokes and delicate flourishes. Its high-contrast lines and graceful loops give it a sophisticated, handwritten appearance suitable for invitations and luxury branding.\",\n\t\"Itim\": \"Itim is a casual, handwritten display font with a friendly and playful mood, featuring rounded terminals and a slightly irregular, marker-like stroke weight. Its informal, sans-serif structure gives it a personal, approachable feel suitable for creative and child-friendly designs.\",\n\t\"Jacquard 12\": \"Jacquard 12 is a pixelated blackletter display font that combines a medieval, gothic aesthetic with a retro, low-resolution digital feel. Its blocky, stepped edges and heavy weight create a bold, decorative look reminiscent of early computer graphics or woven textiles.\",\n\t\"Jacquard 12 Charted\": \"Jacquard 12 Charted is a pixelated, blackletter-style display font that mimics the appearance of traditional embroidery or weaving patterns. Its blocky, grid-based construction gives it a vintage, handcrafted feel while maintaining the ornate, gothic structure of classic Fraktur calligraphy.\",\n\t\"Jacquard 24\": \"Jacquard 24 is a pixelated blackletter display font that combines a medieval, gothic aesthetic with a digital, lo-fi feel. Its heavy weight and jagged, stepped edges evoke a sense of vintage computer graphics or embroidered textile patterns.\",\n\t\"Jacquard 24 Charted\": \"Jacquard 24 Charted is a pixelated blackletter display font that mimics the appearance of traditional embroidery or weaving patterns. It features a heavy weight and a gothic, historical aesthetic, characterized by its blocky, stepped edges and ornate, calligraphic letterforms.\",\n\t\"Jacquarda Bastarda 9\": \"Jacquarda Bastarda 9 is a low-resolution pixel font that mimics the ornate, calligraphic style of medieval blackletter script. It features high-contrast strokes and decorative flourishes, blending a gothic, historical aesthetic with a retro digital feel.\",\n\t\"Jacquarda Bastarda 9 Charted\": \"This is a pixelated, blackletter-style display font designed on a grid, evoking a vintage, needlepoint or cross-stitch aesthetic. It combines gothic calligraphic forms with a low-resolution, 'charted' digital look, creating a unique blend of medieval and retro-computing moods.\",\n\t\"Jacques Francois\": \"Jacques Francois is a classic old-style serif font with a refined, scholarly mood, featuring moderate stroke contrast and elegant, slightly flared serifs. Its design evokes a sense of historical tradition and formal clarity, making it well-suited for body text and academic publications.\",\n\t\"Jacques Francois Shadow\": \"Jacques Francois Shadow is a classic, elegant serif display font featuring an inline or 'shadow' effect that gives it a three-dimensional, engraved appearance. Its high-contrast strokes and traditional letterforms evoke a sophisticated, historical feel suitable for formal headings and titles.\",\n\t\"Jaini\": \"Jaini is a bold display font with a calligraphic, hand-drawn feel, featuring heavy strokes and sharp, angular terminals that evoke a traditional or historical aesthetic. Its unique diamond-shaped tittles and organic, slightly irregular curves give it a distinctive and expressive personality.\",\n\t\"Jaini Purva\": \"Jaini Purva is a bold display font with a calligraphic, blackletter-inspired style, featuring sharp, angular terminals and diamond-shaped dots. Its heavy weight and traditional, manuscript-like aesthetic give it a formal yet distinctive and historic feel.\",\n\t\"Jakob\": \"Jakob is a bold, condensed sans-serif font with a modern and impactful feel, featuring clean lines and a high x-height. Its sturdy, geometric construction makes it ideal for headlines and display purposes where a strong visual presence is required.\",\n\t\"Jaldi\": \"Jaldi is a contemporary sans-serif font with a friendly, approachable mood, featuring rounded terminals and a slight calligraphic influence in its stroke endings. Its medium weight and open counters provide excellent legibility, making it feel both modern and functional.\",\n\t\"Jaro\": \"Jaro is a heavy, blocky display font with a retro-digital or athletic feel, characterized by its thick strokes and distinctively chamfered, octagonal corners. Its bold, geometric construction gives it a powerful and modern industrial aesthetic.\",\n\t\"Jersey 10\": \"Jersey 10 is a bold, pixelated display font that evokes a retro, 8-bit aesthetic with its blocky, low-resolution construction. Its heavy weight and jagged edges give it a nostalgic, digital feel reminiscent of classic video games and early computer graphics.\",\n\t\"Jersey 10 Charted\": \"Jersey 10 Charted is a bold, pixelated display font with a retro, athletic aesthetic reminiscent of classic video games and sports jerseys. Its blocky, low-resolution structure and heavy weight create a nostalgic, digital feel.\",\n\t\"Jersey 15\": \"Jersey 15 is a bold, pixelated display font that evokes a retro, 8-bit aesthetic with its blocky, low-resolution construction. Its heavy weight and jagged edges give it a nostalgic, digital feel reminiscent of early video games and athletic jersey numbering.\",\n\t\"Jersey 15 Charted\": \"Jersey 15 Charted is a bold, pixelated display font with a retro, athletic aesthetic reminiscent of vintage scoreboard or jersey lettering. Its blocky, sans-serif structure and jagged edges evoke a nostalgic, digital feel suitable for sports-themed or gaming designs.\",\n\t\"Jersey 20\": \"Jersey 20 is a bold, pixelated display font that evokes a retro, 8-bit aesthetic reminiscent of classic video games and digital scoreboards. Its blocky, low-resolution construction gives it a nostalgic and playful feel, making it ideal for sports-themed or tech-inspired designs.\",\n\t\"Jersey 20 Charted\": \"This is a bold, blocky display font with a pixelated, retro aesthetic reminiscent of early digital displays or sports jerseys. It features a unique 'charted' effect where the characters are overlaid on a fine grid, giving it a technical, structured, and nostalgic feel.\",\n\t\"Jersey 25\": \"Jersey 25 is a bold, pixelated display font that evokes a retro, athletic aesthetic reminiscent of vintage video games and sports jerseys. Its blocky, low-resolution construction gives it a nostalgic and digital feel, making it ideal for high-impact, thematic headings.\",\n\t\"Jersey 25 Charted\": \"This is a bold, pixelated display font with a retro, athletic aesthetic, featuring blocky letterforms that evoke vintage sports jerseys and early digital graphics. Its heavy weight and jagged, stair-stepped edges create a nostalgic, high-impact look suitable for gaming or team branding.\",\n\t\"Jetbrains Mono\": \"JetBrains Mono is a clean, modern monospaced typeface featuring a tall x-height and simplified letterforms designed for maximum legibility. Its balanced weight and geometric structure create a professional, technical aesthetic ideal for coding and digital interfaces.\",\n\t\"Jim Nightshade\": \"Jim Nightshade is a dark, expressive display font with a hand-drawn, calligraphic feel, featuring irregular, jagged edges and sharp, elongated terminals. Its narrow, condensed letterforms and ink-blot texture evoke a mysterious, gothic, or slightly eerie mood.\",\n\t\"Joan\": \"Joan is a classic serif font with a medium weight, featuring sharp, chiseled serifs and a high-contrast stroke that gives it an elegant, scholarly feel. Its most notable feature is the dramatic, sweeping descender on the 'J' and the angular, calligraphic terminals on the lowercase letters.\",\n\t\"Jockey One\": \"Jockey One is a bold, sans-serif display font with a sporty and industrial feel, characterized by its heavy weight and distinctive angled, chamfered corners. Its condensed structure and geometric shapes give it a modern, high-impact appearance suitable for headlines and athletic branding.\",\n\t\"Jolly Lodger\": \"Jolly Lodger is a playful, hand-drawn display font with a spooky, retro vibe, featuring irregular, jagged strokes and a tall, condensed structure. Its whimsical yet slightly eerie aesthetic makes it reminiscent of vintage horror movie posters or mid-century cartoon titles.\",\n\t\"Jomhuria\": \"Jomhuria is a bold, heavy-weight display font with a dark, authoritative presence, featuring sharp, angular terminals and a diamond-shaped tittle that evoke a traditional calligraphic feel. Its dense, compact letterforms and high contrast give it a powerful, monumental aesthetic suitable for headlines.\",\n\t\"Jomolhari\": \"Jomolhari is a classic serif font with a traditional, scholarly feel, featuring high stroke contrast and elegant, slightly flared terminals. Its tall x-height and sharp, refined serifs give it a formal yet legible appearance suitable for long-form text.\",\n\t\"Josefin Sans\": \"Josefin Sans is a geometric sans-serif font with an elegant, vintage-inspired feel, characterized by its distinctively low x-height and sharp, clean lines. Its balanced proportions and minimalist aesthetic give it a modern yet classic look suitable for sophisticated branding and headlines.\",\n\t\"Josefin Slab\": \"Josefin Slab is a distinctive slab-serif typeface that blends vintage geometric proportions with a modern, elegant feel. It features a light weight, high x-height, and unique details like the slanted crossbar on the 'e' and the low-waisted 'S'.\",\n\t\"Jost\": \"Jost is a clean, geometric sans-serif font that exudes a modern and functional mood, inspired by 1920s German typography. It features perfectly circular forms, balanced stroke weights, and sharp, precise terminals that give it a professional yet accessible appearance.\",\n\t\"Joti One\": \"Joti One is a bold, playful display font featuring irregular, hand-drawn shapes and sharp, angular terminals that give it a whimsical, cartoon-like energy. Its heavy weight and unique, slightly distorted letterforms make it ideal for creative headlines and informal designs.\",\n\t\"Jua\": \"Jua is a playful, heavy-weight display font featuring rounded terminals and a hand-drawn, brush-like aesthetic. Its irregular edges and soft curves give it a friendly, casual, and retro-inspired feel.\",\n\t\"Judson\": \"Judson is a classic serif font with a scholarly and elegant feel, featuring sharp, wedge-shaped serifs and a moderate contrast in stroke weight. Its tall x-height and open counters give it a refined, traditional appearance suitable for editorial and academic contexts.\",\n\t\"Julee\": \"Julee is a casual, handwritten display font with a calligraphic feel, featuring fluid, rhythmic strokes and a slight italic slant. Its medium weight and organic, slightly irregular letterforms create a friendly and personal mood.\",\n\t\"Julius Sans One\": \"Julius Sans One is a clean, geometric sans-serif display font with a light stroke weight and an elegant, modern feel. It features wide proportions and a high-contrast structure that gives it a sophisticated, architectural appearance.\",\n\t\"Junge\": \"Junge is a slim, elegant serif typeface with a classic feel, featuring delicate, flared serifs and a high-contrast stroke weight that gives it a refined, literary appearance.\",\n\t\"Junicode Vf\": \"Junicode VF is a classic, scholarly serif font with an elegant, historic feel, featuring high-contrast strokes and sharp, traditional serifs. Its design evokes a sense of academic prestige and timelessness, suitable for formal and literary contexts.\",\n\t\"Jura\": \"Jura is a clean, sans-serif typeface with a modern, industrial feel, characterized by its square proportions and rounded corners. Its monolinear weight and open letterforms give it a futuristic yet approachable aesthetic.\",\n\t\"Just Another Hand\": \"Just Another Hand is a casual, narrow handwriting font with a playful and informal mood. It features irregular, hand-drawn strokes with a medium weight and tall, condensed letterforms that mimic natural felt-tip pen writing.\",\n\t\"Just Me Again Down Here\": \"A casual, handwritten script font with a medium weight and a playful, personal feel. It features irregular letter heights and organic, marker-like strokes that give it an authentic, doodled appearance.\",\n\t\"K2d\": \"K2D is a modern, geometric sans-serif font featuring soft, rounded terminals and a clean, friendly appearance. Its balanced proportions and open curves give it a contemporary and approachable feel suitable for both display and body text.\",\n\t\"Kablammo\": \"Kablammo is a bold, chaotic display font with a playful, hand-drawn aesthetic inspired by 90s cartoons. It features irregular, blobby letterforms adorned with whimsical dots, spikes, and cutouts that create a high-energy, experimental look.\",\n\t\"Kadwa\": \"Kadwa is a bold, slab-serif typeface with a sturdy and contemporary feel, featuring thick, blocky serifs and high-contrast strokes. Its wide proportions and geometric construction give it a strong, authoritative presence suitable for headlines and display use.\",\n\t\"Kaisei Decol\": \"Kaisei Decol is a decorative serif font that blends traditional elegance with a playful, hand-drawn feel, featuring unique flared terminals and a medium weight. Its organic curves and distinct personality give it a warm, classic yet approachable mood.\",\n\t\"Kaisei Harunoumi\": \"Kaisei Harunoumi is a refined serif font that blends traditional elegance with a modern, clean aesthetic. It features high-contrast strokes and delicate, sharp serifs that evoke a sense of classic sophistication and literary charm.\",\n\t\"Kaisei Opti\": \"Kaisei Opti is a refined serif font that blends classic elegance with modern clarity, featuring high contrast between thick and thin strokes and distinctive, slightly flared terminals. Its balanced proportions and clean lines evoke a sophisticated yet approachable mood, making it suitable for both editorial and display use.\",\n\t\"Kaisei Tokumin\": \"Kaisei Tokumin is a classic serif font with a medium weight that blends traditional elegance with a slightly rustic, hand-carved feel. It features sharp, triangular serifs and high-contrast strokes, giving it a sophisticated yet approachable personality.\",\n\t\"Kalam\": \"Kalam is a casual, handwritten script font with a medium weight that mimics the organic flow of a felt-tip pen. Its slightly slanted, informal letterforms create a friendly and personal mood, featuring rounded terminals and natural variations in stroke width.\",\n\t\"Kalnia\": \"Kalnia is a high-contrast display serif font with a sophisticated, modern-vintage feel, featuring sharp wedge serifs and elegant, bulbous terminals. Its dramatic stroke variation and unique letterforms, like the curved 'K' and 'a', give it a stylish and rhythmic personality.\",\n\t\"Kalnia Glaze\": \"Kalnia Glaze is an elegant, high-contrast serif display font featuring a distinctive 'inline' or 'glaze' effect that creates a sense of depth and dimension. Its sophisticated, classic aesthetic is defined by sharp serifs, graceful curves, and a refined, decorative feel.\",\n\t\"Kameron\": \"Kameron is a sturdy slab-serif typeface with a classic, professional feel, featuring wide proportions and prominent, flat serifs. Its balanced weight and open counters make it highly legible and suitable for both editorial body text and formal headings.\",\n\t\"Kanchenjunga\": \"Kanchenjunga is a clean, humanist sans-serif font with a medium weight and a modern, approachable feel. It features open apertures and subtle calligraphic influences, particularly visible in the curved terminals of the 'j' and 'g'.\",\n\t\"Kanit\": \"Kanit is a modern, geometric sans-serif font with a bold weight and a clean, technical feel. It features unique angled terminal cuts and a loopless Thai-inspired structure that gives it a contemporary and professional appearance.\",\n\t\"Kantumruy Pro\": \"Kantumruy Pro is a clean, modern sans-serif font with a light-to-medium weight and a professional, approachable mood. It features open apertures and a tall x-height, ensuring excellent legibility for both display and body text.\",\n\t\"Kapakana\": \"Kapakana is an elegant, formal script font featuring high-contrast strokes and a sophisticated, calligraphic feel. Its fluid, slanted letterforms are characterized by ornate flourishes and delicate loops, evoking a sense of classic luxury and traditional craftsmanship.\",\n\t\"Karantina\": \"Karantina is a bold, ultra-condensed display font with a modern, industrial feel, featuring sharp, angular terminals and a high-impact, vertical presence.\",\n\t\"Karla\": \"Karla is a grotesque sans-serif font with a modern, quirky personality, characterized by its unique letterforms and slightly irregular spacing. It features a clean, medium weight that balances professional clarity with a friendly, approachable feel.\",\n\t\"Karma\": \"Karma is an elegant, medium-weight serif font with a classic and scholarly feel, featuring distinctive rounded terminals and slightly flared, wedge-shaped serifs. Its open counters and balanced proportions give it a sophisticated yet approachable appearance suitable for body text and titles.\",\n\t\"Katibeh\": \"Katibeh is a bold display font with a calligraphic, headline-style feel, featuring high contrast and flared, wedge-like serifs. Its elegant yet sturdy design evokes a sense of traditional craftsmanship and formal sophistication.\",\n\t\"Kaushan Script\": \"Kaushan Script is a rustic, calligraphic brush font with a natural, hand-written feel and energetic, upright strokes. It features a medium weight with high contrast and slightly irregular letterforms that give it a modern, casual, and artistic personality.\",\n\t\"Kavivanar\": \"Kavivanar is a calligraphic, handwriting-style display font with a distinct slant and rhythmic, fluid strokes. It features sharp, chiseled terminals and varying line weights that give it a traditional yet expressive and artistic feel.\",\n\t\"Kavoon\": \"Kavoon is a bold, playful display font featuring thick, irregular strokes and rounded terminals that give it a friendly, hand-drawn feel. Its heavy weight and expressive, slightly whimsical shapes make it ideal for casual branding and attention-grabbing headlines.\",\n\t\"Kay Pho Du\": \"Kay Pho Du is a high-contrast serif font with a classic, elegant feel, featuring tall x-heights and sharp, slab-like serifs. Its narrow proportions and clean lines give it a sophisticated and formal appearance suitable for editorial design.\",\n\t\"Kdam Thmor Pro\": \"Kdam Thmor Pro is a modern, condensed sans-serif font with a strong, industrial feel, featuring squared-off curves and a uniform stroke weight. Its tall x-height and clean, geometric structure give it a bold and functional appearance suitable for display use.\",\n\t\"Keania One\": \"Keania One is a bold, stencil-style display font with a modern, industrial feel, featuring heavy, rounded letterforms and distinct vertical gaps. Its thick strokes and condensed structure give it a strong, authoritative presence suitable for headlines and branding.\",\n\t\"Kedebideri\": \"A clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform line weight and open apertures. Its tall x-height and circular curves give it a friendly yet professional appearance suitable for clear communication.\",\n\t\"Kelly Slab\": \"Kelly Slab is a geometric slab-serif display font that combines a technical, industrial feel with unique angular cuts and square proportions. Its rigid, blocky structure and uniform stroke weight give it a modern, architectural appearance suitable for headlines.\",\n\t\"Kenia\": \"Kenia is a bold, stencil-style display font with a modern, artistic feel, characterized by its thick, rounded strokes and unique negative space gaps. Its playful yet structured design features soft curves and a distinct lack of sharp corners, making it ideal for creative branding and headlines.\",\n\t\"Khand\": \"Khand is a modern, compact sans-serif typeface featuring a modular, architectural structure with flat terminals and a high x-height. Its narrow proportions and clean, monolinear strokes give it a professional and efficient appearance suitable for headlines and UI design.\",\n\t\"Khula\": \"Khula is a clean, modern sans-serif typeface with a neutral and professional mood. It features open apertures, a tall x-height, and monolinear strokes that ensure excellent legibility for both display and body text.\",\n\t\"Kihim\": \"Kihim is an ultra-bold, italicized display font featuring a deconstructed, geometric aesthetic composed of thick, blocky strokes. Its aggressive slant and fragmented letterforms create a high-energy, industrial, and futuristic mood.\",\n\t\"Kings\": \"This is a bold, italicized display font with a calligraphic, hand-drawn feel, featuring sharp, angular strokes and a dramatic, expressive mood. Its irregular edges and varying line weights give it a dynamic, historical, and slightly aggressive aesthetic.\",\n\t\"Kirang Haerang\": \"Kirang Haerang is a playful, hand-drawn display font featuring irregular, textured edges and a bold weight. Its whimsical, uneven strokes give it a casual and friendly personality, reminiscent of ink or marker lettering.\",\n\t\"Kite One\": \"Kite One is a casual, monolinear sans-serif font with a handwritten feel, featuring a slight italic slant and rounded terminals that give it a friendly and approachable mood. Its tall x-height and open letterforms ensure clarity while maintaining a playful, informal aesthetic.\",\n\t\"Kiwi Maru\": \"Kiwi Maru is a friendly, rounded serif font that blends a classic Mincho-style structure with soft, circular terminals. Its medium weight and playful, organic curves give it a warm, approachable, and slightly whimsical feel.\",\n\t\"Klee One\": \"Klee One is a graceful, handwritten-style font that blends the elegance of traditional Japanese calligraphy with a modern, clean aesthetic. It features delicate, thin strokes with subtle variations in pressure, creating a calm and organic feel.\",\n\t\"Knewave\": \"Knewave is a bold, energetic display font with a hand-painted, brush-stroke aesthetic. Its heavy weight, slight italic slant, and rounded, irregular edges give it a dynamic, playful, and rebellious feel.\",\n\t\"Kobata\": \"Kobata is a bold, experimental display font that combines rigid, pixel-like blocks with large, perfect circles for a high-contrast, geometric aesthetic. Its abstract construction creates a playful yet modern digital feel, blurring the line between typography and graphic pattern.\",\n\t\"Kodchasan\": \"Kodchasan is a casual, monolinear sans-serif font with rounded terminals that give it a friendly and modern appearance. Its wide, geometric letterforms and high x-height create a clean, legible look suitable for informal digital interfaces.\",\n\t\"Kode Mono\": \"Kode Mono is a modern, monospaced sans-serif font with a distinct digital and industrial feel, characterized by its geometric, angular letterforms and chamfered corners. Its clean, technical aesthetic makes it ideal for coding environments and futuristic design projects.\",\n\t\"Koh Santepheap\": \"Koh Santepheap is a classic serif typeface with a formal and traditional feel, featuring sharp, bracketed serifs and a moderate stroke contrast. Its tall x-height and clean proportions give it a professional, highly legible appearance suitable for body text and editorial use.\",\n\t\"Koho\": \"KoHo is a modern, geometric sans-serif font with a clean and technical feel, featuring unique rounded corners and a slightly squarish structure. Its balanced weight and open counters give it a friendly yet professional appearance suitable for both digital and print interfaces.\",\n\t\"Kola\": \"Kola is a bold, ultra-modern display font featuring heavy, rounded strokes and a stencil-like aesthetic with distinct gaps in the letterforms. Its playful yet futuristic mood is defined by soft terminals and a minimalist, geometric construction.\",\n\t\"Kolker Brush\": \"Kolker Brush is a dynamic, expressive script font featuring heavy, textured brushstrokes that convey a sense of raw energy and hand-painted artistry. Its dramatic slants and irregular, ink-splattered edges give it a bold, cinematic, and slightly aggressive mood.\",\n\t\"Konkhmer Sleokchher\": \"Konkhmer Sleokchher is a bold, geometric sans-serif font with a modern and sturdy feel, featuring clean lines and uniform stroke widths. Its high-contrast, blocky appearance gives it a strong, authoritative presence suitable for headlines and display use.\",\n\t\"Kosugi\": \"Kosugi is a clean, low-contrast Gothic (sans-serif) font with a modern and functional feel. It features rounded terminals and open apertures, providing excellent legibility for both digital and print interfaces.\",\n\t\"Kosugi Maru\": \"Kosugi Maru is a friendly, rounded sans-serif font with a medium weight and a soft, approachable mood. Its most notable features are the perfectly circular terminals and smooth, uniform stroke widths that give it a clean and modern appearance.\",\n\t\"Kotta One\": \"Kotta One is a contemporary serif font with a calligraphic feel, featuring high stroke contrast and sharp, wedge-like serifs. Its slightly condensed proportions and elegant, rhythmic curves give it a sophisticated yet approachable personality.\",\n\t\"Koulen\": \"Koulen is a bold, condensed sans-serif display font with a strong, industrial feel. It features thick, uniform strokes and tight spacing, giving it a modern and impactful presence suitable for headlines.\",\n\t\"Kranky\": \"Kranky is a playful, hand-drawn display font featuring irregular, wobbly strokes and a charmingly amateurish, \\\"cranky\\\" aesthetic. Its uneven baselines and varying letter widths create a whimsical, informal mood suitable for children's books or quirky branding.\",\n\t\"Kreon\": \"Kreon is a sturdy, slab-serif typeface with a modern, editorial feel, featuring low-contrast strokes and distinctively angled, blocky serifs. Its balanced proportions and open counters give it a clean, reliable appearance suitable for both headlines and body text.\",\n\t\"Kristi\": \"Kristi is a casual, hand-drawn script font with a personal, felt-tip pen aesthetic. It features tall, slender letterforms with irregular strokes and a playful, spontaneous energy.\",\n\t\"Krona One\": \"Krona One is a low-contrast, sans-serif display typeface with an extended width and a modern, geometric feel. Its wide proportions and clean lines give it a bold, high-visibility presence suitable for headlines and branding.\",\n\t\"Krub\": \"Krub is a clean, modern sans-serif font with a light weight and a friendly, approachable mood. It features rounded terminals and a high x-height, giving it a contemporary and legible appearance suitable for both digital and print media.\",\n\t\"Kufam\": \"Kufam is a contemporary sans-serif font with a medium weight that blends geometric structures with subtle, organic curves. Its unique, slightly irregular stroke endings and open counters give it a friendly, modern, and approachable feel.\",\n\t\"Kulim Park\": \"Kulim Park is a clean, geometric sans-serif font with a modern and approachable feel, featuring open apertures and subtle rounded terminals. Its balanced proportions and medium weight make it highly legible and versatile for both display and body text.\",\n\t\"Kumar One\": \"Kumar One is a bold, high-contrast display font featuring a unique blend of slab serifs and sharp, angular geometric cuts. Its heavy weight and industrial, mechanical feel give it a strong, authoritative presence.\",\n\t\"Kumar One Outline\": \"Kumar One Outline is a bold, decorative display font featuring a hollow, outlined structure with a distinct industrial and geometric feel. Its design is characterized by sharp, 45-degree angled corners and vertical stress, giving it a modern, architectural appearance.\",\n\t\"Kumbh Sans\": \"Kumbh Sans is a clean, geometric sans-serif font with a modern and professional feel. It features a medium weight with balanced proportions and open apertures, making it highly legible for both display and body text.\",\n\t\"Kurale\": \"Kurale is an elegant serif typeface with a classic, literary feel, featuring moderate stroke contrast and distinctive, slightly curved terminals. Its tall x-height and open counters give it a sophisticated yet approachable appearance suitable for editorial design.\",\n\t\"La Belle Aurore\": \"La Belle Aurore is a casual, handwritten script font with a light-to-medium weight and a charming, personal feel. It features fluid, slightly irregular strokes and elegant loops that give it an authentic, ink-on-paper aesthetic.\",\n\t\"Labrada\": \"Labrada is a distinctive serif font with a hand-carved or chiseled aesthetic, featuring irregular, angular edges and high-contrast strokes. Its rugged, organic feel gives it a historic yet expressive personality, suitable for editorial or display use.\",\n\t\"Lacquer\": \"Lacquer is a bold, expressive display font with a raw, hand-drawn aesthetic that mimics the look of thick ink or spray paint. Its irregular, textured edges and uneven strokes create a gritty, urban mood that feels both spontaneous and rebellious.\",\n\t\"Laila\": \"Laila is a friendly, informal serif typeface featuring rounded terminals and a brush-like quality that gives it a soft, contemporary feel. Its medium weight and fluid, organic curves create a warm and approachable mood suitable for display and body text.\",\n\t\"Lakki Reddy\": \"Lakki Reddy is a bold, expressive display font with a hand-drawn, calligraphic feel, featuring irregular stroke widths and sharp, flared terminals. Its whimsical and energetic personality is defined by organic, slightly jagged shapes that give it a unique, artisanal character.\",\n\t\"Lalezar\": \"Lalezar is a bold, heavy-weight display font with a playful and modern feel, featuring thick, rounded strokes and unique, slightly irregular letterforms that give it a hand-drawn, retro-inspired character.\",\n\t\"Lancelot\": \"Lancelot is a classic serif display font with a medieval, calligraphic influence, featuring high stroke contrast and elegant, sharp terminals. Its tall x-height and ornate curves evoke a sense of historical sophistication and romanticism.\",\n\t\"Langar\": \"Langar is a bold, informal display font featuring a hand-drawn, chiseled aesthetic with irregular, angular edges. Its heavy weight and organic, slightly rustic feel give it a friendly yet strong personality suitable for expressive headings.\",\n\t\"Lateef\": \"Lateef is a calligraphic serif font with a medium weight that blends traditional Arabic script aesthetics with Latin letterforms. It features fluid, organic curves and sharp, wedge-like serifs, creating a graceful and scholarly mood.\",\n\t\"Lato\": \"Lato is a humanist sans-serif typeface that balances a professional, stable structure with warm, rounded details. Its semi-rounded corners and open proportions create a friendly yet modern aesthetic suitable for both body text and display.\",\n\t\"Lavishly Yours\": \"Lavishly Yours is an elegant, formal script font featuring elaborate flourishes and a high-contrast stroke weight that evokes a sense of classic sophistication. Its flowing, interconnected letters and decorative swashes make it ideal for romantic or high-end designs like wedding invitations.\",\n\t\"Lavoir\": \"Lavoir is a bold, geometric sans-serif font with a modern and clean aesthetic, featuring perfectly circular forms and sharp, precise angles. Its heavy weight and minimalist design give it a strong, authoritative presence suitable for high-impact branding.\",\n\t\"Lct Ciburial\": \"Lct Ciburial is a clean, geometric sans-serif font with a medium weight that conveys a modern and professional mood. It features circular letterforms, such as the 'C' and 'u', and distinctive perfectly round dots on the 'i', giving it a balanced and approachable appearance.\",\n\t\"Lct Iptex\": \"Lct Iptex is a monospaced, slab-serif typeface with a technical, typewriter-inspired aesthetic and a medium weight. Its design features rigid, blocky serifs and uniform stroke widths, conveying a clean, functional, and modern industrial mood.\",\n\t\"League Gothic\": \"League Gothic is a condensed, sans-serif display typeface with a bold weight and a strong, authoritative presence. Its tall, narrow letterforms and clean lines give it a classic, industrial feel that is both modern and timeless.\",\n\t\"League Script\": \"League Script is a thin, monolinear script font that mimics elegant, fluid handwriting with a modern and airy feel. It features long, sweeping descenders and delicate loops, giving it a graceful and personal aesthetic.\",\n\t\"League Spartan\": \"League Spartan is a bold, geometric sans-serif font that exudes a modern and confident mood. It features a high x-height, uniform stroke widths, and distinctively sharp, clean lines that make it highly legible and impactful for display use.\",\n\t\"Leckerli One\": \"Leckerli One is a bold, casual script font with a cheerful and handmade feel, featuring thick, fluid strokes and irregular, rounded letterforms. Its bouncy rhythm and brush-like quality give it a friendly, informal personality suitable for display use.\",\n\t\"Ledger\": \"Ledger is a multi-purpose serif typeface with a formal, classic feel, featuring high contrast between thick and thin strokes and sharp, wedge-like serifs. Its large x-height and open counters make it highly legible and suitable for editorial or financial documentation.\",\n\t\"Lekton\": \"Lekton is a clean, monospaced-inspired sans-serif font with a light weight and a technical, modern aesthetic. It features open apertures and distinct, angular terminals that evoke the precision of a typewriter or architectural blueprint.\",\n\t\"Lemon\": \"Lemon is a bold, heavy-weight display font with a playful, retro-inspired script style. It features soft, rounded terminals and a slight italic slant that gives it a friendly and energetic personality.\",\n\t\"Lemonada\": \"Lemonada is a modern, semi-condensed display font with a friendly, calligraphic feel, featuring fluid strokes and distinctive flared terminals. Its elegant yet playful aesthetic is characterized by a slight italic lean and a harmonious balance between traditional Arabic script influences and contemporary Latin letterforms.\",\n\t\"Lexend\": \"Lexend is a clean, geometric sans-serif font with a modern and highly legible appearance, featuring wide character spacing and open counters. Its balanced weight and simple, low-contrast strokes create a friendly yet professional mood designed for optimal readability.\",\n\t\"Lexend Deca\": \"Lexend Deca is a clean, geometric sans-serif font with a modern and highly legible appearance. It features low-contrast strokes, open counters, and a balanced weight that creates a friendly yet professional mood.\",\n\t\"Lexend Exa\": \"Lexend Exa is a clean, geometric sans-serif font featuring an exceptionally wide stance and generous character spacing. Its modern, airy aesthetic is designed for maximum readability and a balanced, expansive feel.\",\n\t\"Lexend Giga\": \"Lexend Giga is a modern, geometric sans-serif font characterized by its exceptionally wide proportions and generous letter spacing. Its clean lines and open counters create a highly legible, airy, and contemporary aesthetic.\",\n\t\"Lexend Mega\": \"Lexend Mega is a clean, geometric sans-serif font featuring wide character spacing and a modern, highly legible aesthetic. Its balanced weight and open letterforms create a professional yet approachable mood, specifically designed to improve reading proficiency.\",\n\t\"Lexend Peta\": \"Lexend Peta is a clean, geometric sans-serif font featuring an exceptionally wide, expanded structure and generous letter spacing. Its low-contrast strokes and open apertures create a modern, highly legible, and airy aesthetic.\",\n\t\"Lexend Tera\": \"Lexend Tera is an ultra-wide, geometric sans-serif font with a clean, modern aesthetic. Its expansive letter spacing and low-contrast strokes create a highly legible, airy feel designed to improve reading proficiency.\",\n\t\"Lexend Zetta\": \"Lexend Zetta is an ultra-wide, geometric sans-serif font with a clean, modern aesthetic and low-contrast strokes. Its expansive letter spacing and open counters are designed for maximum readability and a bold, contemporary feel.\",\n\t\"Libertinus Keyboard\": \"This display font features classic serif characters enclosed within rounded rectangular frames that mimic the appearance of physical computer keyboard keys. The design is functional and technical, using high-contrast black and white to create a clear, instructional aesthetic.\",\n\t\"Libertinus Math\": \"Libertinus Math is a classic, scholarly serif font with a medium weight and a formal, academic mood. It features sharp, well-defined serifs and a balanced stroke contrast, making it highly legible for technical and mathematical documentation.\",\n\t\"Libertinus Mono\": \"Libertinus Mono is a classic monospaced serif font that combines a scholarly, typewriter-inspired aesthetic with elegant, sharp serifs. Its balanced weight and traditional proportions give it a professional and highly legible appearance suitable for technical or academic contexts.\",\n\t\"Libertinus Sans\": \"Libertinus Sans is a humanist sans-serif font with a classic, scholarly feel, featuring subtle stroke modulation and flared terminals that evoke a calligraphic influence.\",\n\t\"Libertinus Serif\": \"Libertinus Serif is a classic, elegant serif typeface with a traditional academic feel, featuring moderate stroke contrast and sharp, well-defined serifs. Its balanced proportions and clear letterforms evoke a sense of formality and timeless readability.\",\n\t\"Libertinus Serif Display\": \"Libertinus Serif Display is a classic, elegant serif font with a light-to-medium weight and high contrast between thick and thin strokes. It features sharp, refined serifs and a sophisticated, academic mood suitable for formal headings and titles.\",\n\t\"Libre Barcode 128\": \"This is a functional barcode display font consisting of vertical black bars of varying widths and spacing. It is a technical, utilitarian typeface designed specifically for machine readability and industrial applications.\",\n\t\"Libre Barcode 128 Text\": \"This is a specialized display font that combines a functional Code 128 barcode with human-readable sans-serif text positioned directly underneath. The style is industrial and utilitarian, featuring high-contrast vertical bars of varying widths paired with a clean, monospaced-style typeface for clarity.\",\n\t\"Libre Barcode 39\": \"Libre Barcode 39 is a specialized display font that encodes alphanumeric characters into a standard Code 39 barcode format, featuring a series of vertical black bars of varying widths. It has a purely functional, industrial aesthetic designed for machine readability rather than human legibility.\",\n\t\"Libre Barcode 39 Extended\": \"This is a specialized barcode display font consisting of vertical black bars of varying widths and spacing. It has a purely functional, industrial aesthetic designed for machine readability rather than human legibility.\",\n\t\"Libre Barcode 39 Extended Text\": \"This is a functional barcode display font featuring the Code 39 standard, characterized by vertical black bars of varying widths. It includes human-readable sans-serif text centered beneath each encoded character for clarity and technical utility.\",\n\t\"Libre Barcode 39 Text\": \"This is a specialized display font that combines a standard Code 39 barcode with human-readable sans-serif text positioned directly underneath. It features a utilitarian, industrial aesthetic with high-contrast vertical bars and clean, widely spaced capital letters.\",\n\t\"Libre Barcode Ean13 Text\": \"This is a specialized barcode font that combines standard EAN-13 vertical bars with a clean, sans-serif human-readable text at the bottom. It features a technical, industrial aesthetic designed for functional retail and inventory scanning.\",\n\t\"Libre Baskerville\": \"Libre Baskerville is a classic serif font with a traditional, elegant feel, featuring high contrast between thick and thin strokes and sharp, refined serifs. It conveys a sense of academic authority and timelessness, making it highly legible for long-form body text.\",\n\t\"Libre Bodoni\": \"Libre Bodoni is a classic serif font characterized by high contrast between thick and thin strokes and flat, unbracketed serifs. It conveys an elegant, sophisticated, and timeless mood, making it ideal for editorial and high-end branding.\",\n\t\"Libre Caslon Condensed\": \"Libre Caslon Condensed is a classic serif typeface with a narrow, space-saving design and high stroke contrast. It conveys a sophisticated and traditional mood, featuring sharp serifs and elegant, elongated letterforms.\",\n\t\"Libre Caslon Display\": \"Libre Caslon Display is an elegant, high-contrast serif font that exudes a classic and sophisticated mood. It features sharp, delicate serifs and a dramatic difference between thick and thin strokes, making it ideal for refined editorial headlines.\",\n\t\"Libre Caslon Text\": \"Libre Caslon Text is a classic, elegant serif font with a medium weight and a sophisticated, scholarly mood. It features sharp serifs, high stroke contrast, and traditional proportions that make it highly legible for long-form body text.\",\n\t\"Libre Franklin\": \"Libre Franklin is a clean, versatile sans-serif typeface with a classic, utilitarian feel and a medium weight. It features a high x-height and open apertures, making it highly legible and professional for both display and body text.\",\n\t\"Licorice\": \"Licorice is a casual, handwritten script font with a fluid, rhythmic motion and a medium weight. It features expressive, loopy letterforms and a slightly textured, ink-like finish that gives it a personal and artistic feel.\",\n\t\"Life Savers\": \"Life Savers is a playful, hand-drawn serif font with a whimsical and slightly irregular feel. It features high-waisted letterforms, rounded terminals, and a light weight that gives it a charming, storybook-like quality.\",\n\t\"Liga Sans\": \"A bold, geometric sans-serif font with a clean and modern aesthetic, featuring uniform stroke widths and square-cut terminals for a professional, high-impact look.\",\n\t\"Lilex\": \"Lilex is a modern, monospaced sans-serif font with a clean, technical aesthetic, featuring distinct geometric shapes and unique slab-like terminals on characters like the 'i' and 'l'. Its medium weight and open counters provide excellent legibility, making it well-suited for programming and digital interfaces.\",\n\t\"Lilita One\": \"Lilita One is a bold, condensed display font with a playful and casual personality. It features soft, rounded terminals and a slight bounce in its letterforms, making it ideal for friendly and eye-catching headlines.\",\n\t\"Lily Script One\": \"Lily Script One is a playful, bold display script font with a friendly and casual mood. It features thick, rounded strokes, soft terminals, and a slight upright tilt that gives it a charming, hand-lettered appearance.\",\n\t\"Limelight\": \"Limelight is a high-contrast Art Deco display font that evokes a classic Hollywood glamour. It features heavy, geometric vertical strokes paired with extremely thin hairlines and circular terminals, creating a bold and theatrical aesthetic.\",\n\t\"Linden Hill\": \"Linden Hill is a classic, old-style serif font with a scholarly and elegant feel, featuring sharp, wedge-shaped serifs and a distinct calligraphic influence. Its moderate contrast and tall x-height give it a timeless, literary quality suitable for body text and formal headings.\",\n\t\"Line Seed Jp\": \"A clean, geometric sans-serif font with a friendly and modern mood, featuring rounded terminals and consistent stroke weight.\",\n\t\"Lisu Bosa\": \"Lisu Bosa is a classic serif typeface with a medium weight and a formal, scholarly mood. It features sharp, wedge-like serifs and a high stroke contrast that gives it a refined and traditional appearance.\",\n\t\"Liter\": \"Liter is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform stroke weights and sharp, square terminals. Its open counters and balanced proportions give it a highly legible and professional appearance.\",\n\t\"Literata\": \"Literata is a contemporary serif typeface designed for high legibility, featuring a medium weight with a classic yet modern feel. It is characterized by its upright stress, distinct ball terminals, and sharp, sturdy serifs that make it ideal for long-form digital reading.\",\n\t\"Liu Jian Mao Cao\": \"Liu Jian Mao Cao is a wild, expressive brush-script font that mimics traditional Chinese cursive calligraphy with its fluid, energetic strokes and varying line weights. It conveys a sense of raw, artistic motion and spontaneous personality, making it ideal for expressive display purposes.\",\n\t\"Livvic\": \"Livvic is a clean, geometric sans-serif font with a modern and friendly feel, characterized by its medium weight and distinctive oversized, circular tittle dots. Its open apertures and balanced proportions give it a professional yet approachable appearance suitable for both display and body text.\",\n\t\"Lobster\": \"Lobster is a bold, condensed script font with a vintage, playful feel, featuring thick strokes and fluid, connected letterforms. Its upright, bouncy rhythm and decorative flourishes give it a friendly, retro-modern aesthetic suitable for headlines and branding.\",\n\t\"Lobster Two\": \"Lobster Two is a bold, condensed script display font with a vintage, retro feel, featuring playful curves and elegant connecting strokes. Its upright, brush-like letterforms create a friendly and energetic mood suitable for headlines and branding.\",\n\t\"Londrina Outline\": \"Londrina Outline is a playful, hand-drawn display font featuring a casual sans-serif structure with irregular, sketchy outlines. Its rounded corners and informal, slightly wobbly strokes give it a friendly, DIY aesthetic perfect for creative and youthful designs.\",\n\t\"Londrina Shadow\": \"Londrina Shadow is a playful, hand-drawn display font featuring bold, rounded sans-serif letterforms with a distinct drop shadow effect. Its informal, slightly irregular outlines give it a friendly, casual mood perfect for posters and creative headlines.\",\n\t\"Londrina Sketch\": \"Londrina Sketch is a playful, hand-drawn display font featuring a bold sans-serif structure with a unique 'sketched' or outlined effect. Its irregular, scribbled borders give it a casual, informal mood that mimics the look of a marker or pen drawing.\",\n\t\"Londrina Solid\": \"Londrina Solid is a bold, hand-drawn display font with a playful and informal mood. It features thick, rounded letterforms with irregular, slightly rough edges that give it a charming, handcrafted aesthetic.\",\n\t\"Long Cang\": \"Long Cang is a casual, brush-style script font that mimics traditional Chinese calligraphy with its fluid, expressive strokes and varying line weights. It conveys a relaxed, organic, and artistic mood through its irregular letterforms and hand-drawn aesthetic.\",\n\t\"Lora\": \"Lora is a contemporary serif font with a balanced, elegant feel, featuring moderate contrast and brushed curves that give it a calligraphic touch. Its classic yet modern aesthetic makes it highly legible and sophisticated, suitable for both body text and formal headings.\",\n\t\"Love Light\": \"Love Light is an elegant, romantic script font featuring fluid, calligraphic strokes with dramatic flourishes and heart-shaped accents. Its varying line weights and expressive swashes create a sophisticated yet whimsical mood, perfect for decorative or wedding-themed designs.\",\n\t\"Love Ya Like A Sister\": \"This is a playful, hand-drawn display font with a sketchy, scribbled texture and irregular slab serifs. It features a whimsical, informal mood with uneven stroke weights and a charmingly unpolished, DIY aesthetic.\",\n\t\"Loved By The King\": \"This is a casual, handwritten script font with a tall x-height and a thin, irregular stroke weight that gives it a personal and whimsical feel. Its narrow letterforms and slightly jagged edges create a charming, informal mood suitable for creative or heartfelt designs.\",\n\t\"Lovers Quarrel\": \"Lovers Quarrel is an elegant, light-weight calligraphic script font featuring dramatic, swirling flourishes and a romantic, formal mood. Its delicate, flowing lines and ornate uppercase initials give it a sophisticated, hand-lettered appearance suitable for invitations and decorative headings.\",\n\t\"Lt Avocado\": \"Lt Avocado is a bold, geometric sans-serif font with a clean and modern aesthetic. It features perfectly circular counters in letters like 'o' and 'd', giving it a friendly yet professional appearance.\",\n\t\"Lt Remark\": \"Lt Remark is an elegant, high-contrast serif font with a classic and sophisticated feel, featuring sharp, delicate serifs and a graceful, traditional structure. Its refined strokes and balanced proportions make it ideal for formal editorial design and luxury branding.\",\n\t\"Luckiest Guy\": \"Luckiest Guy is a bold, heavy-weight display font inspired by 1950s comic book advertisements. It features a playful, hand-drawn aesthetic with irregular, chunky letterforms that convey a friendly and energetic mood.\",\n\t\"Lugrasimo\": \"Lugrasimo is a calligraphic script font with a bold weight and an elegant, hand-lettered feel. It features sharp, angular terminals and fluid, rhythmic strokes that give it a sophisticated yet dynamic personality.\",\n\t\"Lumanosimo\": \"Lumanosimo is an expressive, calligraphic script font with a medium weight and a fluid, rhythmic feel. It features elegant, sweeping curves and organic, hand-drawn strokes that give it a sophisticated yet approachable personality.\",\n\t\"Lunasima\": \"Lunasima is a clean, geometric sans-serif font with a modern and approachable feel, featuring uniform stroke weights and open counters. Its balanced proportions and minimalist design make it highly legible and versatile for both digital and print interfaces.\",\n\t\"Lunchtype25\": \"A clean, modern sans-serif font with a medium weight and a slightly condensed structure. It features a neutral, utilitarian mood with distinct geometric curves and sharp terminals.\",\n\t\"Lusitana\": \"Lusitana is a classic serif typeface with a warm, traditional feel, featuring sharp, triangular serifs and a moderate contrast between thick and thin strokes. Its tall x-height and open counters give it a sturdy, legible appearance suitable for long-form text.\",\n\t\"Lustria\": \"Lustria is a refined serif typeface with a classic, elegant feel, featuring high-contrast strokes and sharp, delicate serifs. Its rounded terminals and open counters give it a modern, approachable quality suitable for both display and body text.\",\n\t\"Luxurious Roman\": \"Luxurious Roman is an elegant, high-contrast serif font with a classic, sophisticated feel. It features sharp, delicate serifs and a calligraphic influence, particularly evident in the diamond-shaped tittle on the 'i' and the graceful curves of the letterforms.\",\n\t\"Luxurious Script\": \"Luxurious Script is an elegant, formal calligraphy font featuring high-contrast strokes and elaborate, flowing flourishes. Its slanted, cursive style evokes a sense of classic sophistication and traditional luxury, making it ideal for formal invitations and high-end branding.\",\n\t\"Lxgw Marker Gothic\": \"Lxgw Marker Gothic is a clean, sans-serif typeface with a medium weight that mimics the casual, hand-drawn feel of a felt-tip marker. Its slightly irregular stroke widths and rounded terminals create a friendly, approachable mood while maintaining high legibility.\",\n\t\"Lxgw Wenkai Mono Tc\": \"This is a monospaced, handwritten-style font with a light to medium weight and a friendly, informal mood. It features organic, slightly irregular strokes that mimic natural penmanship while maintaining a clean and legible structure.\",\n\t\"Lxgw Wenkai Tc\": \"Lxgw Wenkai Tc is a clean, monolinear sans-serif font with a friendly, handwritten feel, featuring slightly irregular stroke ends and a gentle, organic flow. Its medium weight and open letterforms create a modern yet approachable aesthetic that mimics casual penmanship.\",\n\t\"M Plus 1\": \"M PLUS 1 is a clean, geometric sans-serif font with a modern and functional aesthetic, featuring balanced proportions and open apertures for high legibility. Its minimalist design and uniform stroke weight give it a professional yet approachable feel suitable for both digital and print interfaces.\",\n\t\"M Plus 1 Code\": \"M PLUS 1 Code is a clean, monospaced sans-serif font with a modern, technical aesthetic. It features a condensed width and uniform stroke weight, making it highly legible and ideal for programming and data-heavy environments.\",\n\t\"M Plus 1p\": \"M Plus 1p is a clean, geometric sans-serif font with a light weight and a modern, minimalist aesthetic. It features open counters and balanced proportions, giving it a sophisticated and highly legible appearance.\",\n\t\"M Plus 2\": \"M PLUS 2 is a clean, geometric sans-serif font with a light weight and a modern, minimalist aesthetic. It features open apertures and balanced proportions, making it highly legible and versatile for both digital and print interfaces.\",\n\t\"M Plus Code Latin\": \"M PLUS Code Latin is a clean, monospaced sans-serif font with a modern, functional aesthetic. It features a condensed width and uniform stroke weight, making it highly legible for programming and technical environments.\",\n\t\"M Plus Rounded 1c\": \"M PLUS Rounded 1c is a friendly, sans-serif typeface featuring soft, fully rounded terminals and a clean, geometric structure. Its balanced proportions and open forms create a modern, approachable, and highly legible aesthetic.\",\n\t\"Ma Shan Zheng\": \"Ma Shan Zheng is a bold, calligraphic script font that mimics the expressive, fluid strokes of a traditional Chinese ink brush. Its irregular line weights and organic, sweeping curves create a dynamic and artistic mood that feels both historic and personal.\",\n\t\"Macondo\": \"Macondo is a decorative display font with a whimsical, hand-drawn feel, featuring fluid, organic curves and flared terminals. Its irregular stroke weights and playful, calligraphic style evoke a sense of fantasy and storytelling.\",\n\t\"Macondo Swash Caps\": \"Macondo Swash Caps is a decorative display font with a whimsical, hand-drawn feel, featuring elegant swashes and fluid, organic curves. Its medium weight and calligraphic influence evoke a sense of magical realism and storytelling, making it both playful and sophisticated.\",\n\t\"Mada\": \"Mada is a clean, humanist sans-serif font with a modern and approachable feel, featuring open apertures and a balanced stroke weight. Its design is characterized by a tall x-height and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Madimi One\": \"Madimi One is a rounded sans-serif display font with a heavy weight and a friendly, playful mood. It features soft, organic curves and a hand-drawn quality that gives it a modern yet approachable aesthetic.\",\n\t\"Magiel\": \"Magiel is an ultra-bold, playful display font featuring irregular, hand-drawn shapes and tiny circular counters that create a whimsical, high-contrast aesthetic. Its chunky, blocky letterforms and organic curves give it a bold, experimental personality suitable for creative branding.\",\n\t\"Magra\": \"Magra is a modern, humanist sans-serif font featuring a medium weight and a clean, approachable aesthetic. It is characterized by its slightly condensed proportions and subtle, calligraphic-inspired stroke endings that give it a friendly yet professional feel.\",\n\t\"Maiden Orange\": \"Maiden Orange is a playful, bold display font featuring a condensed structure with chunky, slab-like serifs and slightly irregular, hand-drawn edges. Its whimsical and energetic personality is reminiscent of vintage comic book lettering or 1950s animated title cards.\",\n\t\"Maitree\": \"Maitree is a medium-weight serif font that blends classic elegance with a modern, approachable feel. It features distinctive, slightly flared terminals and a high x-height, giving it a clear and friendly appearance suitable for both body text and headings.\",\n\t\"Major Mono Display\": \"Major Mono Display is a geometric, monospaced sans-serif font with a light weight and a playful, avant-garde mood. It features unique, experimental letterforms like the square-based 'M' and a solid semicircular 'D', giving it a distinctively modern and artistic character.\",\n\t\"Mako\": \"Mako is a clean, modern sans-serif font with a medium weight and a slightly condensed structure. It features subtle, sharp terminal cuts and a high x-height, giving it a professional yet approachable feel suitable for both display and body text.\",\n\t\"Mali\": \"Mali is a playful, casual handwriting-style font featuring rounded terminals and a friendly, informal mood. Its irregular stroke widths and soft, organic shapes give it a charming, hand-drawn aesthetic suitable for lighthearted designs.\",\n\t\"Mallanna\": \"Mallanna is a clean, monolinear sans-serif font with a friendly and modern feel, characterized by its rounded terminals and open counters. Its uniform stroke weight and simple geometric construction make it highly legible and approachable.\",\n\t\"Maname\": \"Maname is a bold, expressive serif font with a hand-carved or calligraphic feel, featuring irregular, organic stroke widths and sharp, flared serifs. Its rustic yet elegant aesthetic gives it a classic, artisanal mood with a touch of historical character.\",\n\t\"Mandali\": \"Mandali is a clean, geometric sans-serif font with a friendly and modern feel, characterized by its rounded terminals and uniform stroke weight. Its open counters and simple letterforms make it highly legible and approachable for both display and body text.\",\n\t\"Manjari\": \"Manjari is a clean, modern sans-serif font featuring rounded terminals and a friendly, approachable mood. Its geometric structure and uniform stroke weight give it a contemporary and highly legible appearance.\",\n\t\"Manrope\": \"Manrope is a modern, geometric sans-serif font with a clean and functional aesthetic, featuring open apertures and a balanced weight that ensures high legibility. Its minimalist design and professional tone make it versatile for both digital interfaces and print.\",\n\t\"Mansalva\": \"Mansalva is a casual, hand-drawn display font with a bold weight and a playful, spontaneous mood. It features irregular, ink-like strokes and organic shapes that give it a raw, authentic marker-style aesthetic.\",\n\t\"Manuale\": \"Manuale is a contemporary serif font with a medium weight that balances classic editorial elegance with modern readability. It features sharp, wedge-like serifs and a high x-height, giving it a professional yet approachable character suitable for long-form text.\",\n\t\"Manufacturing Consent\": \"This is a classic blackletter or Gothic-style font, characterized by its heavy weight, angular strokes, and ornate, calligraphic flourishes. It conveys a formal, historical, and authoritative mood with its dense, intricate letterforms.\",\n\t\"Marcellus\": \"Marcellus is a flared serif typeface inspired by Roman inscriptions, featuring a medium weight and a classic, elegant mood. Its notable characteristics include subtle, sharp serifs and a high-contrast stroke that gives it a timeless, authoritative feel.\",\n\t\"Marcellus Sc\": \"Marcellus SC is a classic flared-serif typeface in a small caps style, inspired by Roman inscriptions for a sophisticated and timeless feel. It features elegant, high-contrast strokes and sharp, delicate serifs that give it a formal and authoritative appearance.\",\n\t\"Marck Script\": \"Marck Script is a casual, free-flowing script font with a medium weight that mimics natural felt-tip handwriting. It features loose, disconnected letterforms and a slight italic slant, creating a friendly and informal mood.\",\n\t\"Margarine\": \"Margarine is a playful, hand-drawn display font featuring thick, irregular strokes with a textured, ink-bleed effect. Its rounded forms and casual, uneven baseline create a friendly, organic, and whimsical mood.\",\n\t\"Marhey\": \"Marhey is a playful, hand-drawn display font featuring bold, irregular strokes and a casual, friendly mood. Its organic shapes and slightly uneven baselines give it a whimsical, energetic character suitable for informal designs.\",\n\t\"Markazi Text\": \"Markazi Text is a contemporary serif typeface with a classic, scholarly feel, featuring sharp, wedge-like serifs and a medium weight. Its design balances traditional calligraphic influences with clean, modern lines, making it highly legible for body text.\",\n\t\"Marko One\": \"Marko One is a playful, medium-weight serif font with a storybook feel, featuring soft, rounded terminals and calligraphic, fluid strokes. Its whimsical yet legible design makes it ideal for children's literature and creative display purposes.\",\n\t\"Marmelad\": \"Marmelad is a soft, rounded sans-serif font with a friendly and approachable mood, featuring distinctively curved terminals and a medium weight that balances readability with a playful, organic feel.\",\n\t\"Martel\": \"Martel is a sturdy, slab-serif typeface with a classic and authoritative feel, featuring heavy, flat serifs and high-contrast strokes. Its design is characterized by a large x-height and open counters, making it highly legible and well-suited for editorial or academic contexts.\",\n\t\"Martel Sans\": \"Martel Sans is a clean, low-contrast sans-serif typeface with a modern and functional aesthetic. It features open apertures and subtle calligraphic influences, particularly in the curved terminals, making it highly legible for both digital and print use.\",\n\t\"Martian Mono\": \"Martian Mono is a brutalist, monospaced sans-serif font featuring a medium weight and a technical, utilitarian mood. Its design is characterized by high-contrast squared terminals, a tall x-height, and a condensed structure that gives it a modern, digital aesthetic.\",\n\t\"Marvel\": \"This is a narrow, sans-serif display font with a modern and slightly quirky feel, featuring irregular, hand-drawn edges and a tall x-height. Its thin-to-medium weight and condensed proportions give it a clean yet organic and approachable appearance.\",\n\t\"Matangi\": \"Matangi is a clean, light-weight sans-serif font with a modern and airy feel, featuring tall x-heights and subtle, organic curves in its letterforms. Its minimalist design and open counters evoke a sense of contemporary elegance and clarity.\",\n\t\"Mate\": \"Mate is a medium-weight serif font with a classic, calligraphic feel, featuring distinctively chiseled terminals and a high x-height. Its slightly irregular, hand-drawn quality gives it a warm, literary mood suitable for body text and headings.\",\n\t\"Mate Sc\": \"Mate SC is a classic serif typeface featuring a small caps design with a hand-carved, calligraphic feel. It exhibits moderate stroke contrast and slightly irregular, wedge-shaped serifs that give it a warm, literary, and traditional appearance.\",\n\t\"Matemasie\": \"Matemasie is an ultra-bold, playful display font featuring soft, bulbous shapes and a hand-drawn, organic feel. Its heavy weight and rounded terminals create a friendly, expressive mood with minimal negative space.\",\n\t\"Mattone\": \"Mattone is a bold, high-contrast sans-serif font that blends modern geometric structures with sharp, aggressive terminals. Its wide proportions and distinctive angled cuts on the ascenders give it a powerful, contemporary, and architectural feel.\",\n\t\"Maven Pro\": \"Maven Pro is a modern sans-serif typeface with a unique curvature and a fluid, geometric rhythm. It features a medium weight and a professional yet approachable mood, characterized by its distinctively rounded letterforms and open apertures.\",\n\t\"Mazius Display\": \"Mazius Display is an elegant, high-contrast serif font with a sophisticated and classic feel. It features sharp, chiseled terminals and a vertical axis that gives it a refined, calligraphic quality suitable for editorial design.\",\n\t\"Mclaren\": \"McLaren is a playful, comic-style sans-serif font with a hand-drawn feel, featuring irregular stroke widths and slightly off-kilter letterforms. Its casual, friendly appearance makes it ideal for children's content or informal designs.\",\n\t\"Mea Culpa\": \"Mea Culpa is an elegant, formal calligraphic script featuring dramatic, sweeping flourishes and high-contrast strokes. Its sophisticated and romantic mood is defined by intricate loops and a classic, handwritten aesthetic.\",\n\t\"Meddon\": \"Meddon is a handwritten script font with a vintage, calligraphic feel, featuring elegant, flowing strokes and a distinct slant. Its irregular line weights and expressive flourishes give it a personal, authentic, and slightly formal character.\",\n\t\"Medievalsharp\": \"MedievalSharp is a gothic-style display font featuring sharp, angular strokes and a calligraphic feel that evokes a classic, historical mood. Its bold weight and distinct, chiseled terminals give it a strong, decorative presence reminiscent of medieval manuscripts.\",\n\t\"Medula One\": \"Medula One is a condensed display font with a brush-like, calligraphic feel, featuring tall letterforms and organic, slightly irregular curves. Its narrow proportions and hand-drawn aesthetic give it a vintage yet friendly and expressive mood.\",\n\t\"Meera Inimai\": \"Meera Inimai is a clean, modern sans-serif font with a friendly and approachable mood, featuring rounded terminals and a balanced, medium weight that ensures high legibility.\",\n\t\"Megrim\": \"Megrim is a light-weight, avant-garde display font featuring a futuristic, geometric aesthetic with unique, fragmented letterforms and sharp angles. Its minimalist, experimental design creates a modern and slightly edgy mood, characterized by unconventional strokes and open counters.\",\n\t\"Meie Script\": \"Meie Script is an elegant, calligraphic script font with a classic, formal feel, featuring high-contrast strokes and fluid, sweeping flourishes. Its slanted, cursive letterforms and delicate terminals evoke a sense of traditional penmanship and sophisticated charm.\",\n\t\"Melodrama\": \"Melodrama is an elegant, high-contrast serif display font that exudes a sophisticated and classic mood. It features dramatic transitions between thick and thin strokes, sharp terminals, and a tall x-height, making it ideal for fashion and editorial design.\",\n\t\"Menbere\": \"A clean, geometric sans-serif typeface with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible and versatile for both display and body text.\",\n\t\"Meow Script\": \"Meow Script is a monolinear, cursive display font with a playful and informal mood, featuring large, loopy flourishes and a hand-drawn, monoline weight. Its flowing, connected letters and rounded terminals give it a friendly, whimsical appearance suitable for casual designs.\",\n\t\"Merienda\": \"Merienda is a playful, calligraphic display font featuring soft, brush-like strokes and a rhythmic, informal flow. Its organic curves and slight slant give it a warm, hand-drawn feel that is both elegant and approachable.\",\n\t\"Merienda One\": \"Merienda One is a playful, calligraphic display font featuring soft, brush-like strokes and a rhythmic, organic flow. Its slightly condensed letterforms and elegant curves give it a warm, handcrafted feel suitable for creative and informal designs.\",\n\t\"Merriweather\": \"Merriweather is a medium-weight serif typeface with a classic yet modern feel, featuring a large x-height and slightly condensed letterforms designed for high legibility. Its sturdy serifs and open counters give it a professional and reliable appearance suitable for long-form reading.\",\n\t\"Merriweather Sans\": \"Merriweather Sans is a low-contrast, geometric sans-serif font with a sturdy, modern appearance and a high x-height for excellent legibility. Its slightly condensed letterforms and open apertures give it a professional yet approachable feel, making it ideal for digital screens.\",\n\t\"Messapia\": \"Messapia is a contemporary serif font that blends classic elegance with sharp, modern details, featuring high contrast between thick and thin strokes. Its most notable characteristics are the aggressive, triangular serifs and the distinctive, deep 'ink traps' that give it a sophisticated yet edgy personality.\",\n\t\"Metal\": \"This is an elegant, italicized serif font with a classic and sophisticated feel, featuring high stroke contrast and sharp, refined serifs. Its fluid, calligraphic curves give it a timeless, scholarly appearance suitable for formal headings.\",\n\t\"Metal Mania\": \"Metal Mania is a bold, aggressive display font with a heavy weight and a raw, distressed aesthetic. It features jagged, thorn-like edges and sharp terminals that evoke a dark, rebellious heavy metal mood.\",\n\t\"Metamorphous\": \"Metamorphous is a unique display serif font that blends Romanesque, Gothic, and Renaissance influences, featuring sharp, pointed terminals and a mystical, historic feel. Its medium weight and eclectic letterforms create a mood that is both archaic and fantastical.\",\n\t\"Metrophobic\": \"Metrophobic is a clean, modern sans-serif font with a light-to-medium weight and a geometric structure. It features open apertures and a tall x-height, giving it a professional, minimalist, and highly legible appearance suitable for digital interfaces.\",\n\t\"Michroma\": \"Michroma is a modern, geometric sans-serif font with a wide, futuristic aesthetic and a medium weight. Its clean lines and squared-off curves evoke a high-tech, sci-fi feel reminiscent of mid-century digital typography.\",\n\t\"Micro 5\": \"Micro 5 is an ultra-minimalist pixel font with a retro, digital aesthetic, characterized by its extremely low-resolution, blocky structure. Its high-contrast, monochromatic design evokes a nostalgic, early-computing feel, making it ideal for tech-focused or vintage gaming themes.\",\n\t\"Micro 5 Charted\": \"Micro 5 Charted is an ultra-minimalist pixel display font with a retro, technical feel, constructed on a tight 5x5 grid. Its blocky, low-resolution aesthetic evokes early computing and digital charting, prioritizing a structured, geometric look over traditional legibility.\",\n\t\"Milkman\": \"Milkman is a clean, ultra-modern sans-serif display font featuring a light weight and an elongated, condensed structure. Its sharp geometric angles and high-waisted crossbars evoke a sophisticated, architectural aesthetic.\",\n\t\"Milonga\": \"Milonga is a decorative serif font with a vintage, rhythmic feel, featuring unique flared terminals and high-contrast strokes that evoke the elegance of traditional Argentine tango posters. Its playful yet sophisticated personality is defined by its rounded, bulbous details and graceful, flowing letterforms.\",\n\t\"Miltonian\": \"Miltonian is a whimsical, hand-drawn display font featuring an inline or 'tattoo' style with irregular, shaky outlines. Its playful and rustic aesthetic is characterized by uneven stroke weights and a charmingly unrefined, folk-art feel.\",\n\t\"Miltonian Tattoo\": \"Miltonian Tattoo is a bold, decorative display font with a hand-drawn, vintage feel, featuring irregular stroke widths and playful, flared serifs. Its whimsical and slightly rustic aesthetic evokes the charm of traditional folk art or classic tattoo lettering.\",\n\t\"Mina\": \"Mina is a contemporary sans-serif font with a clean, geometric structure and a tall x-height, conveying a modern and approachable feel. It features subtle, organic curves and slightly rounded terminals that add a touch of softness to its professional appearance.\",\n\t\"Mingzat\": \"Mingzat is a clean, modern sans-serif font with a medium weight and a professional, utilitarian mood. It features high-contrast stroke endings and unique, sharp terminals that give it a distinct, contemporary character.\",\n\t\"Miniver\": \"Miniver is a playful, upright script font with a hand-lettered feel, featuring thick, brush-like strokes and slightly irregular, angular edges. Its casual yet bold appearance gives it a vintage, mid-century charm suitable for display purposes.\",\n\t\"Miriam Libre\": \"Miriam Libre is a clean, monolinear sans-serif font with a modern and functional aesthetic. It features distinct, slightly squared terminals and a tall x-height, giving it a clear and approachable feel suitable for both digital and print interfaces.\",\n\t\"Mirza\": \"Mirza is a bold, calligraphic display font that blends traditional Arabic script aesthetics with Latin letterforms, featuring flared terminals and a diamond-shaped tittle. Its high-contrast strokes and organic curves evoke a sophisticated, cultural, and artistic mood.\",\n\t\"Miss Fajardose\": \"Miss Fajardose is an ornate, vintage-style script font featuring elaborate flourishes and a delicate, hand-drawn feel. Its thin, flowing strokes and dramatic loops evoke a sense of classic elegance and romanticism.\",\n\t\"Mitr\": \"Mitr is a modern, geometric sans-serif font with a friendly and approachable feel, characterized by its rounded terminals and clean, open letterforms. Its medium weight and balanced proportions make it highly legible and versatile for both display and body text.\",\n\t\"Mluvka\": \"Mluvka is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform line weights and sharp, precise terminals. Its open counters and balanced proportions give it a professional yet approachable feel, suitable for contemporary branding and editorial design.\",\n\t\"Mochiy Pop One\": \"Mochiy Pop One is a bold, playful display font featuring rounded terminals and a hand-drawn, organic feel. Its thick strokes and slightly irregular shapes give it a friendly, casual, and energetic personality.\",\n\t\"Mochiy Pop P One\": \"Mochiy Pop P One is a bold, playful display font featuring thick, rounded strokes and a hand-drawn quality that evokes a friendly and energetic mood. Its slightly irregular shapes and soft terminals give it a casual, pop-culture aesthetic suitable for creative and informal designs.\",\n\t\"Modak\": \"Modak is an ultra-heavy display font with a playful, bulbous aesthetic, featuring extremely thick strokes and tiny counters that give it a soft, balloon-like appearance. Its rounded, organic forms and lack of sharp edges create a friendly, cheerful mood perfect for bold headlines.\",\n\t\"Modern Antiqua\": \"Modern Antiqua is a playful, display serif font with a medium weight and a whimsical, storybook feel. It features distinctive wedge-shaped serifs, high-contrast strokes, and sharp, angular terminals that give it a hand-carved yet contemporary appearance.\",\n\t\"Moderustic\": \"Moderustic is a clean, geometric sans-serif font with a medium weight that balances modern minimalism with a friendly, approachable mood. It features open apertures and subtle, rounded terminals that give it a soft, organic feel despite its structured, architectural roots.\",\n\t\"Mogra\": \"Mogra is a bold, heavy-weight display font with a playful, hand-painted feel, featuring irregular, rounded strokes and a rhythmic, calligraphic flow. Its informal and energetic style is characterized by soft terminals and a distinct, organic personality.\",\n\t\"Mohave\": \"Mohave is a clean, all-caps sans-serif display font featuring a tall x-height and condensed proportions that give it a bold, modern, and industrial feel. Its smooth, rounded terminals and uniform stroke weight provide a balanced and approachable aesthetic suitable for headlines.\",\n\t\"Moirai One\": \"Moirai One is a whimsical display font featuring ultra-thin, monolinear strokes and soft, bubbly shapes that create a playful and experimental mood. Its unique design is characterized by disconnected segments and large, circular counters that give it a light, airy, and futuristic aesthetic.\",\n\t\"Molengo\": \"Molengo is a clean, humanist sans-serif font with a regular weight and a modern, approachable feel. It features open apertures and subtle calligraphic influences, such as the slight curve at the base of the 'l', making it highly legible for body text.\",\n\t\"Molle\": \"Molle is a bold, italicized display script font with a playful and fluid personality, characterized by its thick, rounded strokes and hand-drawn feel. Its heavy weight and rhythmic, curvy letterforms give it a friendly, retro-inspired aesthetic suitable for creative branding.\",\n\t\"Momo Signature\": \"Momo Signature is a monolinear script font with a casual, handwritten feel, featuring rounded terminals and fluid, connected letterforms. Its medium weight and upright slant give it a friendly, modern, and approachable aesthetic suitable for personal branding or informal designs.\",\n\t\"Momo Trust Display\": \"Momo Trust Display is a bold, geometric sans-serif font with a modern and friendly feel, characterized by its thick stroke weight and rounded terminals. Its clean, high-contrast letterforms and circular 'o's give it a contemporary, approachable look suitable for branding and headlines.\",\n\t\"Momo Trust Sans\": \"A clean, geometric sans-serif font with a medium weight that conveys a modern and professional mood. It features open apertures and uniform stroke widths, making it highly legible and balanced.\",\n\t\"Mona Sans\": \"Mona Sans is a modern, versatile sans-serif font with a clean and industrial aesthetic, featuring high-contrast geometric shapes and a wide stance. Its balanced weight and open apertures give it a professional yet approachable feel, suitable for both display and body text.\",\n\t\"Monda\": \"Monda is a clean, modern sans-serif font with a medium weight and a slightly squared, geometric structure. Its open apertures and balanced proportions give it a professional yet approachable feel, making it highly legible for both digital and print interfaces.\",\n\t\"Monofett\": \"Monofett is a bold, monospaced display font featuring white, geometric sans-serif characters set within heavy, rounded black blocks. Its high-contrast, modular design creates a retro-futuristic and industrial aesthetic.\",\n\t\"Monomakh\": \"Monomakh is a classic, high-contrast serif font with a scholarly and traditional feel, featuring sharp, wedge-like serifs and elegant, calligraphic curves. Its medium weight and formal structure evoke a sense of historical authority and literary sophistication.\",\n\t\"Monomaniac One\": \"Monomaniac One is a bold, monospaced display font with a modern, digital aesthetic, featuring rounded corners and a distinctively blocky, geometric structure. Its uniform stroke weight and condensed letterforms create a clean, tech-inspired look suitable for headlines and UI design.\",\n\t\"Monoton\": \"Monoton is a retro-style display font featuring a bold, geometric sans-serif structure composed of multiple parallel lines. Its high-contrast, multi-line design evokes a vibrant 1970s disco or neon aesthetic, making it ideal for large-scale decorative headings.\",\n\t\"Monsieur La Doulaise\": \"Monsieur La Doulaise is an elegant, ornate script font featuring elaborate flourishes and a high-contrast, calligraphic style. Its delicate, flowing strokes and formal aesthetic evoke a sense of classic sophistication and vintage luxury.\",\n\t\"Montaga\": \"Montaga is an elegant, old-style serif font with a classic and scholarly feel, featuring high stroke contrast and distinctive sharp, angled serifs. Its tall x-height and refined curves give it a sophisticated yet readable appearance suitable for editorial use.\",\n\t\"Montagu Slab\": \"Montagu Slab is a sophisticated slab-serif typeface that blends classic editorial elegance with modern readability, featuring high-contrast strokes and distinct, blocky serifs. Its design conveys a professional yet approachable mood, characterized by open counters and sharp, refined terminals.\",\n\t\"Montecarlo\": \"Montecarlo is an elegant, formal script font featuring high-contrast strokes and fluid, calligraphic flourishes. Its sophisticated, slanted design evokes a sense of classic luxury and traditional craftsmanship.\",\n\t\"Montez\": \"Montez is a stylish script font with a hand-drawn, calligraphic feel, featuring elegant sweeping curves and a medium weight. Its rhythmic strokes and slightly informal aesthetic give it a sophisticated yet personal and modern mood.\",\n\t\"Montserrat\": \"Montserrat is a geometric sans-serif typeface with a clean, modern aesthetic, featuring a large x-height and open counters that provide excellent readability. Its balanced, architectural structure gives it a professional yet friendly feel, making it highly versatile for both digital and print design.\",\n\t\"Montserrat Alternates\": \"Montserrat Alternates is a geometric sans-serif font with a clean, modern aesthetic, featuring distinctive rounded letterforms and a medium weight. It is characterized by its unique, playful alternate characters, such as the rounded 'a' and 't', which give it a friendly and contemporary feel.\",\n\t\"Montserrat Subrayada\": \"A geometric sans-serif font with a clean, modern aesthetic, featuring a distinctive built-in underline that connects the base of the characters. It maintains a balanced weight and professional tone, ideal for headlines and architectural branding.\",\n\t\"Montserrat Underline\": \"A clean, geometric sans-serif font with a light weight and modern aesthetic, featuring a continuous horizontal underline that connects the base of all characters.\",\n\t\"Moo Lah Lah\": \"Moo Lah Lah is a playful, heavy-weight display font featuring a whimsical cow-print pattern within its thick, hand-drawn letterforms. Its irregular, organic outlines and bovine-inspired aesthetic create a fun, novelty mood perfect for themed designs.\",\n\t\"Mooli\": \"Mooli is a clean, monolinear sans-serif font with a modern and friendly feel, characterized by its rounded letterforms and distinctive curved tails on the lowercase 'l' and 'i'. Its balanced proportions and open counters make it highly legible and suitable for both digital and print interfaces.\",\n\t\"Moon Dance\": \"Moon Dance is a casual, handwritten script font with a rhythmic, flowing feel and a medium weight. Its elegant yet informal style features expressive, slightly irregular strokes that give it a personal, hand-inked appearance.\",\n\t\"Moul\": \"Moul is a heavy, ultra-bold slab serif display font with a powerful and authoritative presence. It features thick, blocky serifs and high-contrast strokes that give it a classic, monumental feel suitable for headlines.\",\n\t\"Moulpali\": \"Moulpali is a clean, modern sans-serif font with a medium weight and a tall x-height, featuring slightly condensed proportions and subtle geometric curves that give it a professional yet approachable feel.\",\n\t\"Mountains Of Christmas\": \"Mountains of Christmas is a playful, hand-drawn display font with a whimsical and festive mood. It features irregular, bouncy letterforms with varying stroke widths and soft, rounded terminals that give it a charming, casual feel.\",\n\t\"Mourier\": \"Mourier is a highly stylized, geometric display font with a futuristic, maze-like aesthetic, featuring thick, blocky strokes and intricate negative space. Its ultra-bold, monospaced structure creates a rhythmic, architectural feel that prioritizes abstract graphic impact over immediate legibility.\",\n\t\"Mouse Memoirs\": \"Mouse Memoirs is a playful, whimsical display font featuring irregular, hand-drawn letterforms with a tall x-height and a vintage cartoon aesthetic. Its bold, slightly wobbly strokes and bouncy baseline evoke a sense of nostalgic fun and lightheartedness.\",\n\t\"Mozilla Headline\": \"This is a clean, modern sans-serif font with a medium weight and a professional, tech-oriented feel. It features geometric shapes and open apertures, giving it a highly legible and contemporary appearance suitable for digital interfaces.\",\n\t\"Mozilla Text\": \"A clean, modern sans-serif typeface with a medium weight and a professional, highly legible appearance. It features geometric influences and open apertures, conveying a sense of clarity and technological sophistication.\",\n\t\"Mr Bedfort\": \"Mr Bedfort is a classic, elegant script font with a hand-drawn, calligraphic feel, featuring high-contrast strokes and fluid, decorative flourishes. Its vintage aesthetic and rhythmic curves evoke a sense of formal sophistication and traditional craftsmanship.\",\n\t\"Mr Dafoe\": \"Mr Dafoe is a bold, retro-style script font with a heavy weight and a dynamic, hand-lettered feel. It features fluid, expressive strokes and a strong slant, evoking a classic mid-century cinematic or advertising aesthetic.\",\n\t\"Mr De Haviland\": \"Mr De Haviland is an elegant, light-weight script font that mimics sophisticated, hand-drawn calligraphy with a distinct slant. It features fluid, sweeping flourishes and disconnected letterforms that evoke a classic, formal, and personal feel.\",\n\t\"Mrs Saint Delafield\": \"Mrs Saint Delafield is an elegant, vintage-inspired script font featuring a light weight and a sophisticated, handwritten feel. It is characterized by its flowing, slanted letterforms and ornate, decorative flourishes that evoke a sense of classic formal calligraphy.\",\n\t\"Mrs Sheppards\": \"Mrs Sheppards is a bold, mid-century inspired brush script font with a heavy weight and a dynamic, hand-lettered feel. It features fluid, slanted strokes and rounded terminals that evoke a nostalgic, retro-advertising aesthetic.\",\n\t\"Ms Madi\": \"Ms Madi is a lighthearted, casual script font featuring fluid, handwritten strokes and elegant loops that give it a personal and feminine feel. Its bouncy baseline and varying line weights create a rhythmic, informal aesthetic suitable for invitations and creative branding.\",\n\t\"Mukta\": \"Mukta is a contemporary sans-serif typeface featuring a clean, monolinear stroke weight and a tall x-height. Its open apertures and soft, rounded terminals give it a friendly, modern, and highly legible appearance.\",\n\t\"Mukta Mahee\": \"Mukta Mahee is a contemporary, humanist sans-serif font with a clean and professional appearance. It features open apertures and a balanced weight, making it highly legible and versatile for both digital and print media.\",\n\t\"Mukta Malar\": \"Mukta Malar is a clean, contemporary sans-serif font with a medium weight and a professional, highly legible appearance. Its balanced proportions and open apertures give it a modern, approachable feel suitable for both body text and UI design.\",\n\t\"Mukta Vaani\": \"Mukta Vaani is a contemporary sans-serif typeface with a clean, humanist feel and a medium weight. It features open apertures and a high x-height, making it highly legible and professional for both digital and print use.\",\n\t\"Mulish\": \"Mulish is a minimalist, geometric sans-serif font with a clean and modern aesthetic, featuring uniform stroke weights and open apertures for high legibility.\",\n\t\"Murecho\": \"Murecho is a clean, modern sans-serif typeface with a neutral and functional mood. It features a tall x-height, open apertures, and subtle calligraphic touches in the stroke terminals that provide a soft, approachable feel.\",\n\t\"Museomoderno\": \"MuseoModerno is a geometric sans-serif display font with a futuristic, avant-garde aesthetic, characterized by its unique continuous-line construction and rounded, tubular letterforms. Its medium weight and rhythmic, wave-like curves create a sleek, modern, and highly stylized appearance.\",\n\t\"My Soul\": \"An elegant, expressive script font featuring fluid, calligraphic strokes with high contrast and dramatic flourishes. Its hand-drawn aesthetic conveys a romantic and sophisticated mood, characterized by sweeping curves and sharp, tapered terminals.\",\n\t\"Mynerve\": \"Mynerve is a casual, handwritten display font with a medium weight and a playful, jittery energy. It features irregular, shaky strokes and uneven baselines that give it an authentic, hand-drawn felt-tip marker aesthetic.\",\n\t\"Mystery Quest\": \"Mystery Quest is a whimsical display font featuring playful, curly terminals and a hand-drawn feel. Its irregular, bouncy baseline and spiral flourishes evoke a sense of magic, fantasy, and storytelling.\",\n\t\"Nabla\": \"Nabla is a bold, isometric display font that creates a striking 3D effect through its geometric, blocky construction and sharp, angular perspectives. Its architectural and futuristic aesthetic gives it a modern, high-impact feel suitable for gaming or tech-oriented designs.\",\n\t\"Namdhinggo\": \"Namdhinggo is a classic serif font with a medium weight that conveys a formal and traditional mood. It features sharp, wedge-like serifs and a high stroke contrast, giving it a refined and scholarly appearance.\",\n\t\"Nanum Brush Script\": \"Nanum Brush Script is a casual, handwritten display font that mimics the natural, expressive strokes of a paintbrush. It features irregular line weights and a spontaneous, energetic mood, making it ideal for creative and informal designs.\",\n\t\"Nanum Gothic\": \"Nanum Gothic is a clean, contemporary sans-serif font with a friendly and approachable feel, characterized by its rounded stroke endings and balanced proportions. Its simple, open letterforms ensure high legibility, making it a versatile choice for both digital and print applications.\",\n\t\"Nanum Gothic Coding\": \"Nanum Gothic Coding is a clean, monospaced sans-serif font designed for readability in programming environments. It features a modern, functional aesthetic with uniform stroke weights and distinct character shapes that ensure clarity at small sizes.\",\n\t\"Nanum Myeongjo\": \"Nanum Myeongjo is a contemporary serif font with a classic, elegant feel, featuring high-contrast strokes and sharp, refined serifs. Its balanced proportions and clean lines give it a professional and scholarly appearance suitable for long-form text.\",\n\t\"Nanum Pen Script\": \"Nanum Pen Script is a casual, handwritten font with a medium weight that mimics the natural flow of a felt-tip pen. Its irregular letterforms and rounded terminals create a friendly, personal, and approachable mood.\",\n\t\"Narnoor\": \"Narnoor is a clean, medium-weight sans-serif font with a modern and approachable feel, featuring open counters and subtle calligraphic influences in its terminal strokes.\",\n\t\"Nata Sans\": \"Nata Sans is a clean, geometric sans-serif font with a modern and approachable feel, featuring open apertures and a balanced medium weight. Its uniform stroke width and minimalist design make it highly legible and versatile for both digital and print applications.\",\n\t\"National Park\": \"National Park is a clean, rounded sans-serif typeface with a utilitarian and nostalgic feel, mimicking the look of routed wooden signage. Its thin, uniform stroke weight and soft terminals evoke a sense of clarity and outdoor adventure.\",\n\t\"Neco\": \"Neco is a bold, high-contrast serif font with a classic yet slightly playful feel, featuring distinctive flared terminals and sharp, triangular serifs. Its elegant curves and varying stroke widths give it a sophisticated, editorial look suitable for display purposes.\",\n\t\"Necto Mono\": \"Necto Mono is a clean, monospaced sans-serif font with a modern, technical aesthetic. It features uniform stroke weights and open apertures, giving it a precise and legible appearance suitable for coding or minimalist design.\",\n\t\"Nemoy\": \"Nemoy is a minimalist, geometric display font featuring ultra-thin monolinear strokes and a futuristic, avant-garde aesthetic. Its design is characterized by sharp angles, perfectly circular forms, and unconventional letter constructions that evoke a sense of modern architectural precision.\",\n\t\"Neonderthaw\": \"Neonderthaw is a monolinear script font with a retro, neon-sign aesthetic, featuring fluid, interconnected letters and an open-path design. Its casual, hand-drawn style and rounded terminals evoke a nostalgic, mid-century modern vibe.\",\n\t\"Nerko One\": \"Nerko One is a bold, casual display font with a playful, hand-drawn aesthetic. It features thick, rounded strokes and irregular letterforms that give it a friendly, informal, and energetic personality.\",\n\t\"Neucha\": \"Neucha is a casual, handwritten sans-serif font with a playful and friendly mood, featuring irregular stroke widths and slightly wobbly lines that give it a charming, hand-drawn aesthetic.\",\n\t\"Neuton\": \"Neuton is a clean, Dutch-inspired serif font with a large x-height and compact structure, giving it a modern yet classic feel. It features distinct, sharp serifs and a high-contrast stroke weight that makes it highly legible and professional.\",\n\t\"Neutral Sans\": \"A clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible and versatile for both digital and print applications.\",\n\t\"New Amsterdam\": \"New Amsterdam is a bold, condensed sans-serif display font with a tall, industrial feel. It features high-contrast verticality and slightly rounded outer corners, giving it a modern yet rugged, athletic aesthetic.\",\n\t\"New Rocker\": \"New Rocker is a bold, aggressive display font inspired by heavy metal culture and blackletter calligraphy, featuring sharp, thorn-like serifs and jagged terminals. Its high-contrast strokes and gothic influence create a dark, rebellious, and energetic mood.\",\n\t\"New Tegomin\": \"New Tegomin is a hand-drawn serif font with a rustic, calligraphic feel, featuring irregular stroke widths and organic, slightly wobbly outlines. It conveys a warm, traditional, and artisanal mood, reminiscent of ink-on-paper lettering.\",\n\t\"New Title\": \"This is an ultra-condensed sans-serif display font with a bold weight and a modern, authoritative feel. It features extremely narrow letterforms, flat terminals, and a high x-height that creates a striking, vertical rhythmic effect.\",\n\t\"News Cycle\": \"News Cycle is a clean, realist sans-serif font with a tall x-height and a condensed structure, offering a functional and modern aesthetic. Its design is inspired by vintage newspaper headlines, providing high legibility and a professional, straightforward mood.\",\n\t\"Newsreader\": \"Newsreader is a classic serif typeface with a medium weight and a professional, editorial mood. It features sharp, wedge-shaped serifs and high stroke contrast, making it highly legible and sophisticated for long-form reading.\",\n\t\"Niconne\": \"Niconne is a graceful, semi-connected script font with a classic, vintage feel, featuring elegant loops and a rhythmic, upright flow. Its medium weight and soft, rounded terminals give it a friendly yet sophisticated appearance suitable for decorative headings.\",\n\t\"Nippo\": \"Nippo is a bold, monospaced sans-serif font with a technical, industrial feel, characterized by its rigid, blocky structure and distinct chamfered corners. Its geometric design and uniform stroke weight evoke a modern, digital aesthetic suitable for coding or architectural branding.\",\n\t\"Niramit\": \"Niramit is a clean, modern sans-serif font with a medium weight and a friendly, approachable mood. It features distinctive angled terminals on the ascenders and rounded dots on the 'i', giving it a unique, contemporary character.\",\n\t\"Nixie One\": \"Nixie One is a light-weight slab serif font that blends a modern, clean aesthetic with a vintage typewriter feel, featuring wide proportions and rounded terminals. Its delicate strokes and open letterforms create a friendly, airy mood suitable for display and creative headings.\",\n\t\"Nobile\": \"Nobile is a clean, modern sans-serif font with a medium weight and a professional yet approachable mood. It features distinctive tall x-heights and subtle, sharp terminals that give it a crisp, digital-friendly appearance.\",\n\t\"Nocurvesboustrophedon\": \"This is a bold, geometric display font characterized by a complete lack of curves and a 'boustrophedon' style where letters alternate between standard and mirrored orientations. Its sharp, angular construction and heavy weight create a primitive, runic, or experimental aesthetic.\",\n\t\"Nokora\": \"Nokora is a clean, geometric sans-serif font with a modern and neutral aesthetic, featuring uniform stroke weights and open apertures for high legibility. Its balanced proportions and straightforward design give it a professional yet approachable feel.\",\n\t\"Norican\": \"Norican is a free-flowing, brush-style script font with a vintage, mid-century feel, featuring thick, rhythmic strokes and a slight italic slant. Its elegant yet casual appearance is characterized by connected lowercase letters and a bold, expressive capital 'N'.\",\n\t\"Norm\": \"A geometric sans-serif display font with a clean, modern aesthetic, featuring uniform stroke weights and unique, stylized letterforms like the open-curved 'r'.\",\n\t\"Nosifer\": \"Nosifer is a heavy, decorative display font with a dark, macabre aesthetic, featuring thick letterforms that appear to be dripping with liquid. Its sharp, spiked terminals and oozing effect create a horror-inspired mood perfect for spooky or gothic themes.\",\n\t\"Notable\": \"Notable is a bold, uppercase sans-serif display font with an ultra-heavy weight and a modern, industrial feel. It features high-contrast strokes and tight spacing, giving it a powerful, authoritative presence suitable for headlines.\",\n\t\"Nothing You Could Do\": \"This is a casual, handwritten script font with a natural, expressive feel and a slight italic lean. It features irregular stroke widths and organic letterforms that convey a personal, intimate, and unpolished mood.\",\n\t\"Noticia Text\": \"Noticia Text is a contemporary slab-serif typeface designed for readability, featuring a large x-height and sturdy, slightly squared serifs. It conveys a professional yet approachable mood, making it ideal for long-form digital journalism and editorial content.\",\n\t\"Noto Kufi Arabic\": \"A clean and modern sans-serif typeface with a balanced, medium weight and a neutral, highly legible appearance. Its straightforward, geometric structure conveys a professional and contemporary mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Music\": \"Noto Music is a clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open counters and uniform stroke widths, ensuring high legibility and a professional appearance.\",\n\t\"Noto Naskh Arabic\": \"A classic serif typeface with a medium weight that conveys a formal and highly legible tone. It features sharp, traditional serifs and balanced proportions, making it ideal for clear, professional body text.\",\n\t\"Noto Nastaliq Urdu\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and sharp, traditional serifs that evoke a formal and scholarly mood.\",\n\t\"Noto Rashi Hebrew\": \"A classic serif typeface with a scholarly and traditional feel, featuring high stroke contrast and sharp, elegant serifs. Its balanced proportions and refined details evoke a sense of historical authority and clarity.\",\n\t\"Noto Sans\": \"Noto Sans is a clean, humanist sans-serif typeface with a modern and neutral aesthetic, featuring open apertures and uniform stroke weights for high legibility. Its balanced proportions and simple, unadorned letterforms make it versatile for both digital and print interfaces.\",\n\t\"Noto Sans Adlam\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, featuring open apertures and a neutral, highly legible design.\",\n\t\"Noto Sans Adlam Unjoined\": \"A clean, modern sans-serif typeface with a regular weight and a neutral, highly legible appearance. Its balanced proportions and open apertures create a professional and functional mood suitable for body text.\",\n\t\"Noto Sans Anatolian Hieroglyphs\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility and a professional tone.\",\n\t\"Noto Sans Arabic\": \"Noto Sans Arabic is a clean, modern sans-serif typeface with a balanced weight and high legibility. Its neutral and professional aesthetic features open apertures and uniform stroke widths, making it ideal for clear communication across digital and print platforms.\",\n\t\"Noto Sans Armenian\": \"A clean, humanist sans-serif typeface with a medium weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility across digital and print platforms.\",\n\t\"Noto Sans Avestan\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility and a professional feel.\",\n\t\"Noto Sans Balinese\": \"A clean, humanist sans-serif font with a medium weight and a modern, neutral aesthetic. It features open apertures and consistent stroke widths, ensuring high legibility and a professional tone.\",\n\t\"Noto Sans Bamum\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Bassa Vah\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, conveying a professional and highly legible aesthetic. Its open apertures and uniform stroke thickness make it versatile for both digital and print applications.\",\n\t\"Noto Sans Batak\": \"A clean, humanist sans-serif font with a regular weight that conveys a modern and highly legible feel. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print media.\",\n\t\"Noto Sans Bengali\": \"A clean and modern sans-serif typeface with a balanced, medium weight that conveys a professional and highly legible feel. Its open apertures and uniform stroke thickness make it ideal for clear communication across digital and print platforms.\",\n\t\"Noto Sans Bhaiksuki\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and consistent stroke widths, making it suitable for clear, functional communication.\",\n\t\"Noto Sans Brahmi\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and uniform stroke widths, ensuring high legibility and a professional appearance.\",\n\t\"Noto Sans Buginese\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone. Its open apertures and consistent stroke thickness make it ideal for clear digital communication.\",\n\t\"Noto Sans Buhid\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across various digital and print platforms.\",\n\t\"Noto Sans Canadian Aboriginal\": \"A clean, humanist sans-serif font with a regular weight and a neutral, modern aesthetic. It features open apertures and consistent stroke widths, ensuring high legibility and a professional, balanced appearance.\",\n\t\"Noto Sans Carian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible aesthetic.\",\n\t\"Noto Sans Caucasian Albanian\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Chakma\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, conveying a professional and highly legible tone. Its open apertures and uniform stroke thickness make it well-suited for clear communication across digital and print platforms.\",\n\t\"Noto Sans Cham\": \"A clean, humanist sans-serif font with a medium weight and a modern, neutral feel. It features open apertures and balanced proportions, making it highly legible for both body text and UI elements.\",\n\t\"Noto Sans Cherokee\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Chorasmian\": \"A clean and modern sans-serif font with a regular weight, featuring open apertures and a neutral, highly legible design.\",\n\t\"Noto Sans Coptic\": \"Noto Sans Coptic is a clean, unmodulated sans-serif font with a modern and neutral aesthetic. It features open counters and a regular weight, ensuring high legibility and a balanced, professional appearance.\",\n\t\"Noto Sans Cuneiform\": \"A clean, humanist sans-serif font with a regular weight that conveys a modern, neutral, and highly legible aesthetic. It features open apertures and balanced proportions, designed for clarity across digital and print interfaces.\",\n\t\"Noto Sans Cypriot\": \"A clean, modern sans-serif font with a regular weight and high legibility, featuring open apertures and a neutral, professional tone.\",\n\t\"Noto Sans Cypro Minoan\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and uniform stroke widths, making it suitable for clear, functional communication.\",\n\t\"Noto Sans Deseret\": \"Noto Sans Deseret is a clean, humanist sans-serif font with a regular weight and a modern, highly legible appearance. It features open apertures and balanced proportions, designed for clarity across digital and print platforms.\",\n\t\"Noto Sans Devanagari\": \"A clean, modern sans-serif typeface with a balanced weight and open apertures, designed for high legibility and a neutral, professional appearance.\",\n\t\"Noto Sans Display\": \"Noto Sans Display is a clean, modern sans-serif typeface with a medium weight and a neutral, professional mood. It features open apertures and a high x-height, making it highly legible and well-suited for large-scale headings and digital interfaces.\",\n\t\"Noto Sans Duployan\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and balanced proportions, ensuring high legibility and a professional appearance.\",\n\t\"Noto Sans Egyptian Hieroglyphs\": \"A clean, modern sans-serif font with a regular weight and high legibility, featuring open apertures and a neutral, professional tone.\",\n\t\"Noto Sans Elbasan\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and uniform stroke widths, making it suitable for clear, functional communication.\",\n\t\"Noto Sans Elymaic\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across various digital platforms.\",\n\t\"Noto Sans Ethiopic\": \"A clean, unmodulated sans-serif font with a modern and neutral aesthetic, featuring open apertures and a medium weight for high legibility.\",\n\t\"Noto Sans Georgian\": \"A clean, unadorned sans-serif typeface with a medium weight and a neutral, modern aesthetic. It features open apertures and consistent stroke widths, making it highly legible and professional for body text.\",\n\t\"Noto Sans Glagolitic\": \"A clean, humanist sans-serif font with a regular weight that feels modern and highly legible. It features open apertures and balanced proportions, conveying a neutral and professional mood.\",\n\t\"Noto Sans Gothic\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, conveying a professional and highly legible feel. It features open apertures and uniform stroke widths, making it ideal for clear digital communication.\",\n\t\"Noto Sans Grantha\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Gujarati\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Gunjala Gondi\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions. It features open apertures and a neutral, highly legible design suitable for clear communication.\",\n\t\"Noto Sans Gurmukhi\": \"A clean and modern sans-serif font with a medium weight, featuring open apertures and a neutral, highly legible design suitable for body text.\",\n\t\"Noto Sans Hanifi Rohingya\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes convey a professional and functional mood.\",\n\t\"Noto Sans Hanunoo\": \"A clean, modern sans-serif typeface with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Hatran\": \"A clean, humanist sans-serif font with a regular weight and a modern, professional feel. It features open apertures and subtle calligraphic touches, such as the slight flare on the terminals of the 't' and 'a'.\",\n\t\"Noto Sans Hebrew\": \"Noto Sans Hebrew is a clean, unmodulated sans-serif font with a modern and neutral aesthetic. It features open apertures and a balanced weight, making it highly legible and professional for both digital and print applications.\",\n\t\"Noto Sans Hk\": \"Noto Sans HK is a clean, modern sans-serif typeface with a neutral and highly legible design. It features a medium weight with balanced proportions and open apertures, making it versatile for both digital and print interfaces.\",\n\t\"Noto Sans Imperial Aramaic\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility and a professional tone.\",\n\t\"Noto Sans Indic Siyaq Numbers\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Noto Sans Inscriptional Pahlavi\": \"A clean, humanist sans-serif font with a regular weight that feels modern and highly legible. It features open apertures and balanced proportions, conveying a professional and neutral tone.\",\n\t\"Noto Sans Inscriptional Parthian\": \"A clean, modern sans-serif typeface with a regular weight and high legibility. It features open apertures and a neutral, professional tone suitable for academic or informational contexts.\",\n\t\"Noto Sans Javanese\": \"A clean and modern sans-serif font with a regular weight, featuring open apertures and a neutral, highly legible design suitable for body text.\",\n\t\"Noto Sans Jp\": \"Noto Sans JP is a clean, modern sans-serif typeface with a balanced weight and a neutral, professional mood. It features open counters and uniform stroke widths, ensuring high legibility across digital and print platforms.\",\n\t\"Noto Sans Kaithi\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and consistent stroke widths, ensuring high legibility for digital and print use.\",\n\t\"Noto Sans Kannada\": \"A clean and modern sans-serif typeface with a balanced, medium weight and high legibility. Its neutral and professional aesthetic makes it suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Kawi\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions. It features open apertures and a neutral, highly legible design suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Kayah Li\": \"Noto Sans Kayah Li is a clean, unmodulated sans-serif font with a modern and neutral aesthetic. It features a regular weight with open apertures and consistent stroke widths, ensuring high legibility and a professional tone.\",\n\t\"Noto Sans Kharoshthi\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and consistent stroke widths, ensuring high legibility and a professional appearance.\",\n\t\"Noto Sans Khmer\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Khojki\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across various digital and print platforms.\",\n\t\"Noto Sans Khudawadi\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Kr\": \"A clean, modern sans-serif typeface with a medium weight and a neutral, professional tone. It features open apertures and uniform stroke widths, making it highly legible for both digital and print applications.\",\n\t\"Noto Sans Lao\": \"A clean, modern sans-serif font with a balanced, medium weight and a neutral, highly legible appearance. Its open apertures and uniform stroke thickness give it a professional and versatile feel suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Lao Looped\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a professional and highly legible feel. Its open apertures and uniform stroke thickness make it well-suited for clear communication across digital and print media.\",\n\t\"Noto Sans Lepcha\": \"A clean, modern sans-serif font with a regular weight and high legibility. It features open apertures and a neutral, professional tone suitable for body text and digital interfaces.\",\n\t\"Noto Sans Limbu\": \"A clean and modern sans-serif typeface with a regular weight, featuring open apertures and a neutral, highly legible design suitable for diverse digital and print applications.\",\n\t\"Noto Sans Linear A\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility and a professional feel.\",\n\t\"Noto Sans Linear B\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, ensuring high legibility and a professional tone.\",\n\t\"Noto Sans Lisu\": \"A clean, humanist sans-serif font with a medium weight and a modern, approachable feel. It features open apertures and balanced proportions, ensuring high legibility for both display and body text.\",\n\t\"Noto Sans Lydian\": \"A clean, humanist sans-serif typeface with a regular weight and a modern, legible feel. It features open apertures and balanced proportions, making it highly functional for both display and body text.\",\n\t\"Noto Sans Mahajani\": \"A clean, humanist sans-serif font with a regular weight and a modern, highly legible feel. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print media.\",\n\t\"Noto Sans Malayalam\": \"Noto Sans Malayalam is a clean, unmodulated sans-serif font with a modern and neutral aesthetic. It features a regular weight with open counters and balanced proportions, making it highly legible for both display and body text.\",\n\t\"Noto Sans Mandaic\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and balanced proportions, ensuring high legibility for both digital and print applications.\",\n\t\"Noto Sans Manichaean\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel, featuring open apertures and balanced proportions for high legibility.\",\n\t\"Noto Sans Marchen\": \"A clean, humanist sans-serif typeface with a regular weight and a modern, neutral feel. It features open apertures and balanced proportions, ensuring high legibility for both display and body text.\",\n\t\"Noto Sans Masaram Gondi\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across various digital and print platforms.\",\n\t\"Noto Sans Math\": \"A clean, humanist sans-serif font with a regular weight and open apertures, conveying a modern and highly legible feel. Its balanced proportions and neutral design make it ideal for clear communication in technical and mathematical contexts.\",\n\t\"Noto Sans Mayan Numerals\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Medefaidrin\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes convey a professional and functional mood.\",\n\t\"Noto Sans Meetei Mayek\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. Its balanced proportions and open apertures create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Mende Kikakui\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and uniform stroke widths, conveying a professional and functional mood.\",\n\t\"Noto Sans Meroitic\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and a high x-height, ensuring excellent legibility and a balanced, professional appearance.\",\n\t\"Noto Sans Miao\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional yet approachable feel suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Modi\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional and versatile aesthetic.\",\n\t\"Noto Sans Mongolian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Noto Sans Mono\": \"A clean, monospaced sans-serif font with a regular weight that conveys a functional and modern aesthetic. Its uniform character widths and open letterforms ensure high legibility, making it ideal for technical and coding environments.\",\n\t\"Noto Sans Mro\": \"A clean, modern sans-serif typeface with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across various digital and print platforms.\",\n\t\"Noto Sans Multani\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional and versatile aesthetic suitable for body text.\",\n\t\"Noto Sans Myanmar\": \"A clean, humanist sans-serif font with a regular weight that creates a modern and neutral mood. It features open counters and consistent stroke widths for high legibility across digital and print interfaces.\",\n\t\"Noto Sans Nabataean\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Nag Mundari\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Nandinagari\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering high legibility and a neutral, professional tone.\",\n\t\"Noto Sans New Tai Lue\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Noto Sans Newa\": \"A clean, modern sans-serif font with a medium weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print platforms.\",\n\t\"Noto Sans Nko\": \"A clean, humanist sans-serif font with a regular weight that conveys a modern and highly legible feel. It features open apertures and balanced proportions, making it suitable for clear communication across various digital and print platforms.\",\n\t\"Noto Sans Nko Unjoined\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible tone. Its minimalist design features uniform stroke widths and open apertures, making it suitable for clear digital communication.\",\n\t\"Noto Sans Nushu\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Ogham\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Ol Chiki\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes convey a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Old Hungarian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and uniform stroke widths, making it suitable for clear digital and print communication.\",\n\t\"Noto Sans Old Italic\": \"A clean, medium-weight sans-serif font with a modern and highly legible appearance, featuring open apertures and balanced proportions.\",\n\t\"Noto Sans Old North Arabian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a professional and highly legible tone.\",\n\t\"Noto Sans Old Permic\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Old Persian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional and functional aesthetic.\",\n\t\"Noto Sans Old Sogdian\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible tone.\",\n\t\"Noto Sans Old South Arabian\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible aesthetic.\",\n\t\"Noto Sans Old Turkic\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Noto Sans Oriya\": \"A clean, modern sans-serif font with a medium weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print platforms.\",\n\t\"Noto Sans Osage\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and uniform stroke widths, making it suitable for clear digital and print communication.\",\n\t\"Noto Sans Osmanya\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and uniform stroke widths, ensuring high legibility and a professional appearance.\",\n\t\"Noto Sans Pahawh Hmong\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and uniform stroke widths, ensuring high legibility for digital and print use.\",\n\t\"Noto Sans Palmyrene\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Pau Cin Hau\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Phagspa\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible tone. It features open apertures and uniform stroke thickness, making it suitable for clear digital and print communication.\",\n\t\"Noto Sans Phoenician\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Psalter Pahlavi\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, ensuring high legibility and a professional tone.\",\n\t\"Noto Sans Rejang\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and consistent stroke widths create a professional and versatile aesthetic suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Runic\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and balanced proportions, designed for high legibility across digital and print platforms.\",\n\t\"Noto Sans Samaritan\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible aesthetic. Its open apertures and uniform stroke thickness make it versatile for both digital and print applications.\",\n\t\"Noto Sans Saurashtra\": \"Noto Sans Saurashtra is a clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. Its balanced proportions and open apertures create a professional and accessible mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Sc\": \"A clean, modern sans-serif typeface with a balanced weight and neutral, professional mood. It features open apertures and uniform stroke widths, making it highly legible for both digital and print applications.\",\n\t\"Noto Sans Sharada\": \"Noto Sans Sharada is a clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print platforms.\",\n\t\"Noto Sans Shavian\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, ensuring high legibility and a professional, approachable feel.\",\n\t\"Noto Sans Siddham\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Signwriting\": \"A clean, humanist sans-serif font with a regular weight that conveys a modern and highly legible feel. It features open apertures and balanced proportions, making it versatile for both display and body text.\",\n\t\"Noto Sans Sinhala\": \"A clean and modern sans-serif typeface with a regular weight, featuring open apertures and a neutral, highly legible design.\",\n\t\"Noto Sans Sogdian\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a professional and highly legible tone. Its open apertures and uniform stroke thickness make it well-suited for clear digital and print communication.\",\n\t\"Noto Sans Sora Sompeng\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional and versatile aesthetic suitable for body text.\",\n\t\"Noto Sans Soyombo\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, conveying a neutral and highly legible aesthetic. Its open apertures and uniform stroke thickness make it versatile for both digital and print applications.\",\n\t\"Noto Sans Sundanese\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral aesthetic. It features open apertures and consistent stroke widths, ensuring high legibility and a professional feel.\",\n\t\"Noto Sans Sunuwar\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Syloti Nagri\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. It features open apertures and uniform stroke thickness, making it suitable for clear, professional communication.\",\n\t\"Noto Sans Symbols\": \"A clean, unadorned sans-serif typeface with a regular weight and a neutral, functional mood. It features open apertures and consistent stroke widths, making it highly legible and versatile for technical or informational use.\",\n\t\"Noto Sans Symbols 2\": \"A clean, minimalist sans-serif font with an extremely light, hairline weight that conveys a modern and elegant feel. It features open apertures and uniform stroke widths, providing a highly legible and neutral appearance.\",\n\t\"Noto Sans Syriac\": \"A clean and modern sans-serif typeface with a regular weight, featuring open apertures and a neutral, highly legible design suitable for body text.\",\n\t\"Noto Sans Syriac Eastern\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and uniform stroke thickness create a professional and versatile aesthetic suitable for body text.\",\n\t\"Noto Sans Syriac Western\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print platforms.\",\n\t\"Noto Sans Tagalog\": \"A clean, humanist sans-serif typeface with a regular weight and a modern, neutral aesthetic. It features open apertures and balanced proportions, designed for high legibility and a professional, utilitarian feel.\",\n\t\"Noto Sans Tagbanwa\": \"A clean, modern sans-serif typeface with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, conveying a professional and functional mood.\",\n\t\"Noto Sans Tai Le\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and consistent stroke widths, making it highly legible and professional.\",\n\t\"Noto Sans Tai Tham\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned letterforms create a professional and functional mood suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Tai Viet\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. It features open apertures and uniform stroke widths, making it suitable for clear, professional communication.\",\n\t\"Noto Sans Takri\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance. Its straightforward, unadorned strokes convey a professional and functional mood.\",\n\t\"Noto Sans Tamil\": \"Noto Sans Tamil is a clean, modern sans-serif typeface with a balanced weight and open counters, designed for high legibility across digital platforms. Its neutral and professional aesthetic features smooth curves and consistent stroke widths, making it ideal for body text.\",\n\t\"Noto Sans Tamil Supplement\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance suitable for body text.\",\n\t\"Noto Sans Tangsa\": \"A clean, modern sans-serif typeface with a medium weight and balanced proportions, offering a neutral and highly legible appearance. Its open apertures and consistent stroke widths create a professional and versatile aesthetic suitable for body text.\",\n\t\"Noto Sans Tc\": \"A clean, modern sans-serif typeface with a medium weight and a neutral, highly legible design. Its balanced proportions and open apertures create a professional and versatile aesthetic suitable for both body text and UI elements.\",\n\t\"Noto Sans Telugu\": \"Noto Sans Telugu is a clean, modern sans-serif typeface with a balanced weight and open apertures that ensure high legibility. Its neutral and professional aesthetic makes it highly versatile for both digital interfaces and print body text.\",\n\t\"Noto Sans Thaana\": \"A clean and modern sans-serif typeface with a medium weight, featuring open apertures and a neutral, highly legible design suitable for body text.\",\n\t\"Noto Sans Thai\": \"A clean, modern sans-serif typeface with a balanced weight and open counters, designed for high legibility and a neutral, professional appearance.\",\n\t\"Noto Sans Thai Looped\": \"A clean and modern sans-serif typeface with a medium weight, featuring open apertures and a balanced, highly legible structure. Its neutral and professional appearance makes it suitable for a wide range of digital and print applications.\",\n\t\"Noto Sans Tifinagh\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Noto Sans Tirhuta\": \"A clean and modern sans-serif typeface with a regular weight, featuring open apertures and a balanced, neutral appearance designed for high legibility.\",\n\t\"Noto Sans Ugaritic\": \"A clean, humanist sans-serif font with a regular weight and a modern, neutral feel. It features open apertures and consistent stroke widths, designed for high legibility across various digital platforms.\",\n\t\"Noto Sans Vai\": \"A clean, modern sans-serif font with a regular weight and a neutral, functional mood. It features open apertures and uniform stroke widths, ensuring high legibility for digital and print use.\",\n\t\"Noto Sans Vithkuqi\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print media.\",\n\t\"Noto Sans Wancho\": \"A clean, modern sans-serif font with a regular weight and a neutral, highly legible appearance. It features open apertures and balanced proportions, making it suitable for clear communication across digital and print media.\",\n\t\"Noto Sans Warang Citi\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, offering a neutral and highly legible appearance.\",\n\t\"Noto Sans Yi\": \"A clean, modern sans-serif typeface with a regular weight and balanced proportions, offering a neutral and highly legible appearance. It features open apertures and uniform stroke widths, making it suitable for clear communication across digital and print media.\",\n\t\"Noto Sans Zanabazar Square\": \"A clean, modern sans-serif font with a regular weight and high legibility. It features open apertures and a balanced, neutral mood suitable for clear communication.\",\n\t\"Noto Serif\": \"Noto Serif is a classic, highly legible serif font with a balanced weight and a professional, timeless mood. It features distinct, bracketed serifs and open counters, making it ideal for long-form reading and formal documentation.\",\n\t\"Noto Serif Ahom\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal, scholarly mood. Its clean terminals and balanced letterforms make it highly legible for body text and academic contexts.\",\n\t\"Noto Serif Armenian\": \"Noto Serif Armenian is a classic, high-legibility serif font with a balanced weight and a professional, timeless feel. It features elegant, modulated stroke widths and sharp serifs, making it ideal for formal body text and academic contexts.\",\n\t\"Noto Serif Balinese\": \"Noto Serif Balinese is a classic, medium-weight serif font with a formal and highly legible appearance. It features traditional proportions, sharp serifs, and a balanced contrast between thick and thin strokes, conveying a professional and timeless mood.\",\n\t\"Noto Serif Bengali\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal and highly legible tone.\",\n\t\"Noto Serif Devanagari\": \"A classic and legible serif font with a medium weight, featuring traditional proportions and clean, sharp terminals that convey a formal and professional mood.\",\n\t\"Noto Serif Display\": \"Noto Serif Display is an elegant, high-contrast serif font featuring thin, delicate hairlines and sharp, refined serifs. Its sophisticated and classic aesthetic is designed for large-scale headings, offering a graceful and polished appearance.\",\n\t\"Noto Serif Dives Akuru\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal, scholarly mood. Its clean lines and sharp terminals make it highly legible and suitable for academic or historical contexts.\",\n\t\"Noto Serif Dogra\": \"A classic and highly legible serif font with a medium weight, featuring traditional proportions and sharp, refined terminals that convey a formal and academic mood.\",\n\t\"Noto Serif Ethiopic\": \"A classic and professional serif font with a medium weight, featuring elegant, high-contrast strokes and traditional terminals that convey a sense of academic reliability and clarity.\",\n\t\"Noto Serif Georgian\": \"A classic and elegant serif font with a medium weight, featuring balanced proportions and traditional letterforms that convey a professional and timeless mood.\",\n\t\"Noto Serif Grantha\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and sharp, traditional serifs that convey a formal and scholarly mood.\",\n\t\"Noto Serif Gujarati\": \"A classic and legible serif font with a medium weight, featuring balanced proportions and traditional letterforms that convey a professional and timeless mood.\",\n\t\"Noto Serif Gurmukhi\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal and highly legible tone.\",\n\t\"Noto Serif Hebrew\": \"A classic and elegant serif typeface with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal, scholarly mood.\",\n\t\"Noto Serif Hentaigana\": \"A classic and scholarly serif font with a medium weight, featuring sharp, traditional serifs and a high-contrast stroke that conveys a formal and academic mood.\",\n\t\"Noto Serif Hk\": \"Noto Serif HK is a classic, elegant serif typeface with a medium weight and a formal, scholarly mood. It features sharp, triangular serifs and a high contrast between thick and thin strokes, making it highly legible for long-form text.\",\n\t\"Noto Serif Jp\": \"Noto Serif JP is a classic, elegant serif font with a medium weight that conveys a professional and timeless mood. It features sharp, triangular serifs and a high contrast between thick and thin strokes, making it highly legible for body text.\",\n\t\"Noto Serif Kannada\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal and highly legible tone.\",\n\t\"Noto Serif Khitan Small Script\": \"A classic serif typeface with a medium weight, featuring elegant ball terminals and high-contrast strokes that evoke a formal and scholarly mood.\",\n\t\"Noto Serif Khmer\": \"Noto Serif Khmer is a classic, high-contrast serif font with a formal and elegant feel, featuring sharp terminals and traditional proportions. Its balanced weight and clear letterforms make it highly legible and suitable for sophisticated editorial or academic contexts.\",\n\t\"Noto Serif Khojki\": \"Noto Serif Khojki is a classic, medium-weight serif font with a formal and scholarly feel, featuring sharp terminals and high-contrast strokes. Its design balances traditional calligraphic roots with modern legibility, making it suitable for academic or historical contexts.\",\n\t\"Noto Serif Kr\": \"A classic and elegant serif font featuring high stroke contrast and sharp, refined terminals. It conveys a formal and scholarly mood, making it ideal for long-form reading and professional documents.\",\n\t\"Noto Serif Lao\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and sharp, traditional serifs that convey a formal and professional mood.\",\n\t\"Noto Serif Makasar\": \"A classic and elegant serif font with a medium weight, featuring sharp, traditional serifs and a balanced, formal appearance suitable for high-readability body text.\",\n\t\"Noto Serif Malayalam\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and sharp, traditional serifs that convey a formal and highly legible tone.\",\n\t\"Noto Serif Np Hmong\": \"A classic and highly legible serif font with a medium weight, featuring balanced proportions and traditional letterforms that convey a formal, academic, and reliable mood.\",\n\t\"Noto Serif Old Uyghur\": \"A classic and scholarly serif font featuring a medium weight with high-contrast strokes and elegant, rounded terminals. Its traditional design conveys a formal and academic mood, characterized by sharp serifs and balanced proportions.\",\n\t\"Noto Serif Oriya\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and rounded terminals that create a formal yet legible appearance.\",\n\t\"Noto Serif Ottoman Siyaq\": \"A classic and elegant serif font with a medium weight, featuring high stroke contrast and sharp, traditional serifs that evoke a formal and scholarly mood.\",\n\t\"Noto Serif Sc\": \"Noto Serif SC is a classic, elegant serif font with a medium weight and high contrast between thick and thin strokes. It features sharp, refined serifs and a balanced, professional appearance suitable for formal and academic contexts.\",\n\t\"Noto Serif Sinhala\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional ball terminals that evoke a formal, scholarly mood.\",\n\t\"Noto Serif Tamil\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional proportions that convey a formal and highly legible tone.\",\n\t\"Noto Serif Tangut\": \"A classic serif font with a medium weight, featuring elegant, high-contrast strokes and sharp, traditional serifs that convey a formal and scholarly mood.\",\n\t\"Noto Serif Tc\": \"Noto Serif TC is a classic, elegant serif font with a medium weight and a professional, scholarly mood. It features sharp, refined serifs and a high contrast between thick and thin strokes, making it highly legible for long-form text.\",\n\t\"Noto Serif Telugu\": \"A classic and professional serif font with a medium weight, featuring high-contrast strokes and elegant, traditional letterforms that convey a sense of formality and readability.\",\n\t\"Noto Serif Thai\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional ball terminals that evoke a formal and scholarly mood.\",\n\t\"Noto Serif Tibetan\": \"A classic and elegant serif font with a medium weight, featuring high-contrast strokes and traditional ball terminals that convey a formal, scholarly tone.\",\n\t\"Noto Serif Todhri\": \"Noto Serif Todhri is a classic, medium-weight serif font with a formal and scholarly feel. It features sharp, bracketed serifs and a high stroke contrast that ensures excellent legibility for academic and historical texts.\",\n\t\"Noto Serif Toto\": \"A classic and elegant serif font with a medium weight, featuring sharp, bracketed serifs and a high-contrast stroke that conveys a formal and scholarly mood.\",\n\t\"Noto Serif Vithkuqi\": \"A classic and elegant serif font with a medium weight, featuring sharp, refined serifs and a high-contrast stroke that conveys a formal and scholarly mood.\",\n\t\"Noto Serif Yezidi\": \"A classic and elegant serif font with a medium weight, featuring sharp, refined serifs and a balanced, scholarly mood. Its high-contrast strokes and traditional proportions provide excellent legibility and a timeless, formal aesthetic.\",\n\t\"Noto Traditional Nushu\": \"A clean, modern sans-serif font with a medium weight and balanced proportions, conveying a professional and highly legible aesthetic. It features open apertures and uniform stroke widths, making it suitable for clear, neutral communication.\",\n\t\"Noto Znamenny Musical Notation\": \"A clean, modern sans-serif font with a regular weight and balanced proportions, conveying a neutral and highly legible professional tone.\",\n\t\"Nouvelle Grotesquerie\": \"An ultra-bold, extended sans-serif display font with a modern, industrial feel. It features heavy horizontal strokes and tight apertures, creating a powerful and high-impact visual presence.\",\n\t\"Nova Cut\": \"Nova Cut is a distinctive display sans-serif font featuring a chiseled, geometric aesthetic with sharp, angular terminals that mimic stone-carved lettering. Its medium weight and unique 'cut' corners give it a modern yet archaic feel, making it both striking and highly legible.\",\n\t\"Nova Flat\": \"Nova Flat is a modern, geometric sans-serif display font featuring a unique blend of rounded outer corners and sharp, angular inner terminals. Its medium weight and architectural structure give it a futuristic, tech-oriented feel suitable for headlines and branding.\",\n\t\"Nova Mono\": \"Nova Mono is a modern, monospaced sans-serif font featuring a unique, geometric design with tall, narrow letterforms and distinctively rounded arches. Its clean lines and futuristic aesthetic give it a technical yet stylish appearance suitable for coding or display use.\",\n\t\"Nova Oval\": \"Nova Oval is a futuristic, geometric sans-serif display font characterized by its distinct oval-shaped curves and unconventional, open letterforms. Its medium weight and sleek, minimalist aesthetic evoke a modern, sci-fi mood.\",\n\t\"Nova Round\": \"Nova Round is a modern, geometric sans-serif display font featuring soft, rounded terminals and a friendly, approachable mood. Its distinctively tall x-height and open, circular letterforms give it a clean and futuristic aesthetic.\",\n\t\"Nova Script\": \"Nova Script is a modern, upright script font with a medium weight and a clean, calligraphic feel. It features elegant, flowing curves and sharp, angled terminals that give it a sophisticated yet approachable personality.\",\n\t\"Nova Slim\": \"Nova Slim is a modern, geometric sans-serif display font featuring a tall x-height and a unique, futuristic aesthetic. Its most notable characteristics are the sharp, diagonal terminal cuts and the unconventional, arch-like construction of letters like 'N' and 'm'.\",\n\t\"Nova Square\": \"Nova Square is a futuristic, geometric sans-serif display font featuring a distinct square-based structure with diagonal terminal cuts. Its medium weight and tech-inspired aesthetic give it a modern, digital, and slightly industrial feel.\",\n\t\"Now\": \"A clean, geometric sans-serif font with a medium weight that conveys a modern and professional mood. It features perfectly circular forms and sharp, precise angles, giving it a balanced and minimalist aesthetic.\",\n\t\"Ntr\": \"Ntr is a clean, monolinear sans-serif font with a modern and friendly feel, characterized by its rounded terminals and uniform stroke weight. Its open counters and geometric structure give it a soft, approachable aesthetic suitable for both display and body text.\",\n\t\"Numans\": \"Numans is a clean, modern sans-serif typeface with a medium weight and a balanced, geometric structure. It features open apertures and a friendly, approachable mood, making it highly legible for both display and body text.\",\n\t\"Nunito\": \"Nunito is a well-balanced, sans-serif typeface characterized by its rounded terminals and soft, friendly appearance. Its geometric structure and open forms give it a modern, approachable feel that is highly legible for both display and body text.\",\n\t\"Nunito Sans\": \"Nunito Sans is a clean, geometric sans-serif typeface with a modern and friendly appearance. It features well-balanced proportions, open counters, and straight terminal ends that provide a professional yet approachable feel.\",\n\t\"Nuosu Sil\": \"Nuosu SIL is a classic serif font with a formal and traditional feel, featuring high stroke contrast and sharp, elegant serifs. Its balanced proportions and clean lines make it highly legible and suitable for academic or literary contexts.\",\n\t\"N\u00E9o Castel\": \"N\u00E9o Castel is a bold, experimental display font with a liquid or \\\"melting\\\" aesthetic, featuring heavy, distorted letterforms that appear to be dripping or bubbling. Its organic, irregular outlines and scattered droplets create a psychedelic, avant-garde mood that feels both modern and surreal.\",\n\t\"Odibee Sans\": \"Odibee Sans is a bold, condensed display font with a retro-futuristic, digital aesthetic. It features blocky, geometric letterforms with distinctively angled terminals and rounded corners, giving it a tech-inspired, high-impact look.\",\n\t\"Odor Mean Chey\": \"Odor Mean Chey is a bold, display serif font with a sturdy, blocky feel and distinctively chiseled, angular serifs. Its heavy weight and geometric construction give it a strong, authoritative presence suitable for headlines.\",\n\t\"Offside\": \"Offside is a modern, monolinear sans-serif display font featuring rounded terminals and a distinctively tall, narrow structure. Its minimalist, tech-inspired aesthetic is defined by open apertures and a clean, geometric feel.\",\n\t\"Oi\": \"Oi is an ultra-bold, experimental display font with a playful and loud personality, featuring massive, rounded letterforms and tiny counters that create a striking, graphic impact.\",\n\t\"Ojuju\": \"Ojuju is a variable sans-serif display font with a rhythmic, organic feel, featuring high-contrast strokes and unique, elongated terminals. Its playful yet sophisticated mood is defined by its tall x-height and fluid, calligraphic-inspired curves.\",\n\t\"Old Standard Tt\": \"Old Standard TT is a classic Modern-style serif font characterized by high contrast between thick and thin strokes and vertical stress. It evokes a formal, scholarly, and vintage aesthetic reminiscent of late 19th and early 20th-century scientific publications.\",\n\t\"Oldenburg\": \"Oldenburg is a slab-serif display font featuring rounded terminals and a monolinear stroke weight, giving it a friendly and approachable yet sturdy appearance. Its design blends classic proportions with a modern, playful softness, making it highly legible and distinctive.\",\n\t\"Ole\": \"Ole is an elegant, calligraphic script font featuring fluid, sweeping curves and a high-contrast stroke weight that conveys a sophisticated yet whimsical mood. Its most notable feature is the dramatic, spiraling flourish on the capital 'O' and the graceful, elongated loops of the lowercase letters.\",\n\t\"Oleo Script\": \"Oleo Script is a flowy, non-connected script font with a bold weight and a casual, retro feel. It features rounded, fluid strokes and a slight slant that gives it a friendly and expressive personality.\",\n\t\"Oleo Script Swash Caps\": \"Oleo Script Swash Caps is a bold, fluid script font with a retro, monolinear feel and decorative, loopy swashes on the capital letters. It conveys a friendly, casual, and slightly nostalgic mood, making it ideal for headlines and creative branding.\",\n\t\"Onest\": \"Onest is a clean, modern geometric sans-serif font with a medium weight and a neutral, professional mood. It features open apertures and a high x-height, ensuring excellent legibility for both digital and print interfaces.\",\n\t\"Oooh Baby\": \"Oooh Baby is a light-weight, casual script font with a playful and handwritten feel, featuring fluid, loopy strokes and a distinct rightward slant. Its informal, monolinear style gives it a personal and breezy aesthetic, perfect for lighthearted or romantic designs.\",\n\t\"Open Runde\": \"Open Runde is a clean, geometric sans-serif font featuring soft, rounded terminals that give it a friendly and approachable mood. Its medium weight and open apertures ensure high legibility while maintaining a modern, professional aesthetic.\",\n\t\"Open Sans\": \"Open Sans is a clean, humanist sans-serif typeface featuring an upright stress, open forms, and a neutral yet friendly appearance. Its balanced proportions and high legibility make it a versatile choice for both digital and print media.\",\n\t\"Open Sauce One\": \"Open Sauce One is a clean, geometric sans-serif typeface with a modern and professional aesthetic. It features uniform stroke weights and open apertures, making it highly legible and versatile for digital interfaces.\",\n\t\"Open Sauce Sans\": \"Open Sauce Sans is a clean, geometric sans-serif font with a modern and professional feel, featuring a medium weight and balanced proportions. Its open apertures and uniform stroke widths make it highly legible and versatile for both digital and print applications.\",\n\t\"Open Sauce Two\": \"Open Sauce Two is a clean, geometric sans-serif typeface with a modern and professional aesthetic. It features uniform stroke weights, open apertures, and a high x-height, making it highly legible and versatile for digital interfaces.\",\n\t\"Opening Hours Sans\": \"A clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible for signage and informational text.\",\n\t\"Optician Sans\": \"Optician Sans is a bold, geometric sans-serif font inspired by the clinical aesthetic of eye charts, featuring uniform stroke widths and a clean, highly legible structure. Its monolinear design and wide proportions evoke a modern, functional, and professional mood.\",\n\t\"Oranienbaum\": \"Oranienbaum is a modern Antiqua-style serif font featuring high contrast between thick and thin strokes, giving it an elegant and classic appearance. Its tall x-height and sharp, delicate serifs create a sophisticated and authoritative mood suitable for headlines and editorial design.\",\n\t\"Orbit\": \"Orbit is a minimalist, geometric sans-serif display font with a futuristic and experimental feel. It features unique, stencil-like letterforms with incomplete strokes and sharp, blocky terminals that create a high-tech, architectural aesthetic.\",\n\t\"Orbitron\": \"Orbitron is a geometric, sans-serif display font with a futuristic, sci-fi aesthetic, featuring square proportions and rounded corners. Its clean, high-tech appearance makes it ideal for modern digital interfaces and cinematic titles.\",\n\t\"Oregano\": \"Oregano is a casual, hand-drawn display font with a brush-like texture and a playful, organic feel. Its irregular strokes and slight slant give it a friendly, artisanal quality reminiscent of vintage sign painting.\",\n\t\"Orelega One\": \"Orelega One is a bold, heavy-weight display serif font with a friendly and organic feel, characterized by its soft, rounded terminals and unique, slightly irregular letterforms. Its chunky proportions and calligraphic influence give it a warm, approachable personality suitable for headlines and branding.\",\n\t\"Orienta\": \"Orienta is a clean, modern sans-serif font with a medium weight and a friendly, approachable mood. It features wide proportions, generous spacing, and subtle calligraphic touches, such as the slightly angled terminals and the circular dot on the 'i'.\",\n\t\"Original Surfer\": \"Original Surfer is a playful, casual display font with a retro, mid-century vibe, featuring irregular stroke widths and bouncy, hand-lettered letterforms. Its off-kilter baseline and rounded terminals evoke a relaxed, summer-inspired aesthetic reminiscent of vintage surf culture.\",\n\t\"Ortica Angular\": \"Ortica Angular is a bold, high-contrast serif font characterized by sharp, faceted edges and a geometric, chiseled appearance. It blends a classic serif structure with a modern, aggressive aesthetic, featuring aggressive terminals and a distinctively crystalline construction.\",\n\t\"Ortica Linear\": \"Ortica Linear is a high-contrast serif font with a sophisticated and sharp aesthetic, featuring needle-like serifs and elegant, elongated proportions. Its blend of classic structure and aggressive, modern detailing gives it a dramatic and fashionable mood.\",\n\t\"Oswald\": \"Oswald is a bold, condensed sans-serif font that reimagines the classic 'Alternate Gothic' style for digital screens. It features a strong, industrial aesthetic with tight spacing and elongated letterforms, making it ideal for impactful headlines and modern web design.\",\n\t\"Outfit\": \"Outfit is a clean, geometric sans-serif typeface with a modern and professional feel, featuring perfectly circular curves and consistent stroke weights. Its minimalist design and high legibility make it versatile for both digital interfaces and branding.\",\n\t\"Over The Rainbow\": \"Over The Rainbow is a casual, handwritten script font with a whimsical and upbeat mood. It features tall, slender letterforms with irregular heights and a playful, marker-like stroke that gives it a personal, informal feel.\",\n\t\"Overlock\": \"Overlock is a rounded, sans-serif display typeface with a soft, organic feel and a distinct calligraphic influence. Its playful yet elegant personality is defined by unique, fluid terminal shapes and a gentle, rhythmic flow.\",\n\t\"Overlock Sc\": \"Overlock SC is a rounded, sans-serif display font with a playful and organic feel, featuring small caps and distinctive, fluid terminal strokes. Its medium weight and soft, hand-drawn quality give it a friendly and approachable aesthetic.\",\n\t\"Overpass\": \"Overpass is a clean, geometric sans-serif font with a modern and utilitarian feel, inspired by highway signage. It features open counters, consistent stroke weights, and distinct terminal cuts that ensure high legibility and a professional tone.\",\n\t\"Overpass Mono\": \"Overpass Mono is a clean, monospaced sans-serif font with a modern, technical feel and a medium weight. It features open apertures and geometric shapes, making it highly legible for coding and data-heavy applications.\",\n\t\"Ovo\": \"Ovo is a classic serif typeface with a medium weight and a sophisticated, timeless feel. It features high stroke contrast and distinctive, slightly flared serifs that give it a refined and elegant appearance.\",\n\t\"Oxanium\": \"Oxanium is a futuristic, square-proportioned sans-serif font with a sci-fi aesthetic, featuring distinct 45-degree cuts on its corners and terminals. Its monolinear weight and geometric structure evoke a high-tech, digital, and industrial feel.\",\n\t\"Oxygen\": \"Oxygen is a clean, modern sans-serif font with a geometric structure and a light-to-medium weight. It features open apertures and a high x-height, giving it a clear, airy, and highly legible appearance suitable for digital interfaces.\",\n\t\"Oxygen Mono\": \"Oxygen Mono is a clean, monospaced sans-serif font with a modern and functional aesthetic. It features a regular weight with open counters and clear, geometric letterforms designed for legibility in coding and user interfaces.\",\n\t\"Pacifico\": \"Pacifico is a fun and breezy brush script font inspired by 1950s American surf culture. It features thick, rounded strokes and a relaxed, handwritten feel that evokes a sense of nostalgia and casual warmth.\",\n\t\"Padauk\": \"Padauk is a clean, sans-serif font with a medium weight and a functional, modern feel. It features rounded, open counters and a high x-height, making it highly legible and approachable for body text or UI elements.\",\n\t\"Padyakke Expanded One\": \"Padyakke Expanded One is a wide, monolinear slab-serif font with a light weight and an airy, modern feel. Its extremely horizontal proportions and flat, rectangular serifs give it a distinct architectural and technical appearance.\",\n\t\"Palanquin\": \"Palanquin is a clean, humanist sans-serif font with a light-to-medium weight and a modern, approachable feel. It features subtle calligraphic touches, such as the angled terminals on the ascenders and the open apertures, which enhance its readability and friendly character.\",\n\t\"Palanquin Dark\": \"Palanquin Dark is a clean, humanist sans-serif font with a bold weight and a modern, approachable feel. It features open apertures and slightly rounded terminals that give it a friendly yet professional appearance suitable for digital displays.\",\n\t\"Palette Mosaic\": \"Palette Mosaic is a bold, experimental display font with a hand-cut, stencil-like aesthetic, featuring heavy geometric shapes and irregular negative space. Its chunky, fragmented letterforms create a playful yet raw, artistic mood reminiscent of paper cutouts or mosaic tiles.\",\n\t\"Pally\": \"Pally is a friendly, geometric sans-serif font featuring soft, rounded terminals and a medium weight that creates a playful yet modern aesthetic. Its open counters and clean lines give it a welcoming, approachable feel suitable for casual branding and digital interfaces.\",\n\t\"Panchang\": \"Panchang is a modern, wide-set sans-serif typeface with a clean, geometric structure and a sophisticated, minimalist mood. Its ultra-extended proportions and consistent stroke weight give it a bold, architectural presence suitable for high-end display use.\",\n\t\"Pangolin\": \"Pangolin is a playful, casual display font with a hand-drawn feel, featuring rounded letterforms and a bumpy, textured outline that mimics the look of a marker or crayon. Its irregular strokes and friendly, informal mood make it ideal for creative and child-friendly designs.\",\n\t\"Paprika\": \"Paprika is a playful, organic display font with a hand-drawn feel, featuring irregular stroke widths and fluid, calligraphic curves. Its whimsical and slightly eccentric style gives it a friendly, informal personality suitable for creative and decorative applications.\",\n\t\"Paquito\": \"Paquito is a playful, hand-drawn display font with a whimsical, storybook feel, featuring irregular stroke widths and charmingly uneven serifs. Its organic, slightly wobbly letterforms create a friendly and informal mood suitable for children's media or creative branding.\",\n\t\"Parastoo\": \"Parastoo is a classic serif typeface with a medium weight and a formal, elegant mood. It features sharp, triangular serifs and a high contrast between thick and thin strokes, giving it a sophisticated and traditional appearance.\",\n\t\"Parisienne\": \"Parisienne is a casual, connecting script font with a slight bounce and a vintage, feminine feel. It features elegant, sweeping flourishes on the capital letters and a rhythmic, hand-lettered quality that evokes classic 1950s glamour.\",\n\t\"Parkinsans\": \"Parkinsans is a clean, geometric sans-serif font with a modern and approachable feel, featuring open apertures and a balanced, medium weight. Its design is characterized by circular curves and straight terminals, making it highly legible for both display and body text.\",\n\t\"Passero One\": \"Passero One is a bold, low-contrast display font with a playful, hand-drawn feel, featuring irregular, blocky letterforms and a slightly condensed structure. Its quirky, angular strokes and casual mood make it ideal for creative headlines and informal branding.\",\n\t\"Passion One\": \"Passion One is a bold, ultra-heavy sans-serif display font with a modern and impactful feel. It features tightly spaced, rounded letterforms with thick strokes and minimal counters, making it ideal for high-visibility headlines.\",\n\t\"Passions Conflict\": \"Passions Conflict is an elegant, formal script font featuring dramatic, sweeping flourishes and a high-contrast stroke weight. Its fluid, calligraphic style conveys a romantic and sophisticated mood, characterized by its expressive loops and delicate, tapered terminals.\",\n\t\"Pathway Extreme\": \"Pathway Extreme is a clean, modern sans-serif font with a light to medium weight and a high x-height, giving it a professional and highly legible appearance. Its balanced proportions and open apertures create a neutral, contemporary mood suitable for both display and body text.\",\n\t\"Pathway Gothic One\": \"Pathway Gothic One is a narrow, condensed sans-serif typeface with a clean, modern aesthetic. Its tall letterforms and uniform stroke weight give it a sophisticated, space-efficient look suitable for headlines and editorial design.\",\n\t\"Patrick Hand\": \"Patrick Hand is a friendly, casual handwriting font featuring rounded terminals and a neat, legible structure. Its medium weight and organic, hand-drawn strokes give it a personal and approachable feel suitable for informal designs.\",\n\t\"Patrick Hand Sc\": \"Patrick Hand SC is a friendly, handwritten display font featuring a casual, felt-tip marker aesthetic with rounded terminals. Its small caps design and slightly irregular strokes give it a personal, approachable, and playful mood.\",\n\t\"Patriot\": \"A bold, geometric sans-serif display font with a modern and patriotic feel, featuring unique letterforms like a star-topped 'i' and stylized, architectural curves in the 'A' and 'R'.\",\n\t\"Pattaya\": \"Pattaya is a bold, casual script font with a friendly and rhythmic feel, featuring thick strokes and a slight slant that evokes a retro, hand-lettered aesthetic. Its rounded terminals and fluid connections give it a warm, approachable personality suitable for display and branding.\",\n\t\"Patua One\": \"Patua One is a heavy slab-serif display font that combines thick, blocky strokes with soft, curved terminals for a friendly yet impactful look. Its low contrast and sturdy structure give it a modern, approachable feel suitable for headlines and branding.\",\n\t\"Pavanam\": \"Pavanam is a clean, modern sans-serif font with a regular weight and a balanced, approachable feel. It features open counters and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Paytone One\": \"Paytone One is a heavy, sans-serif display font with a casual and friendly appearance, featuring thick strokes and slightly slanted terminals that give it a modern, energetic feel.\",\n\t\"Pecita\": \"Pecita is a casual, handwritten script font with a friendly and organic feel, featuring rounded terminals and a consistent medium weight. Its irregular, flowing strokes mimic natural penmanship, giving it a personal and informal character.\",\n\t\"Peddana\": \"Peddana is a classic serif font with a medium weight and a traditional, scholarly feel. It features sharp, wedge-like serifs and a subtle, hand-drawn texture along the edges of the letterforms, giving it a slightly rustic or historical character.\",\n\t\"Pencerio\": \"Pencerio is an elegant, monolinear script font with a light weight and a sophisticated, classic mood. It features flowing, interconnected cursive letters with dramatic, sweeping flourishes on the capital 'P' and a rhythmic, slanted structure.\",\n\t\"Peralta\": \"Peralta is a bold, whimsical display font with a hand-drawn feel, featuring irregular, chunky letterforms and playful, blocky serifs. Its bouncy baseline and uneven stroke widths create a cheerful, informal mood suitable for comic or cartoon-style designs.\",\n\t\"Permanent Marker\": \"Permanent Marker is a bold, casual display font that mimics the look of hand-drawn lettering with a thick felt-tip pen. It features rough, slightly irregular edges and a high-energy, informal mood that is ideal for headlines and urban-style designs.\",\n\t\"Petemoss\": \"Petemoss is an elegant, medium-weight script font with a hand-drawn feel, featuring fluid, rhythmic strokes and a sophisticated, classic mood. Its slanted, cursive letterforms and decorative flourishes give it a personalized, calligraphic appearance suitable for formal invitations or branding.\",\n\t\"Petit Formal Script\": \"Petit Formal Script is an elegant, light-weight calligraphic font featuring delicate, slanted letterforms and ornate flourishes. Its classic, sophisticated aesthetic is defined by high-contrast strokes and graceful loops, making it ideal for formal invitations and luxury branding.\",\n\t\"Petrona\": \"Petrona is a classic serif typeface with a sophisticated and literary feel, featuring sharp, asymmetrical serifs and a moderate stroke contrast. Its elegant curves and distinct terminals give it a refined, scholarly appearance suitable for editorial and long-form text.\",\n\t\"Philosopher\": \"Philosopher is an elegant, high-contrast sans-serif font with subtle calligraphic influences, featuring distinctive curved terminals and a sophisticated, modern-classic aesthetic. Its fluid lines and unique letterforms give it a graceful, intellectual personality suitable for both headlines and branding.\",\n\t\"Phudu\": \"Phudu is a bold, geometric sans-serif display font with a modern and industrial feel, characterized by its tall x-height and distinctive, squared-off curves.\",\n\t\"Piazzolla\": \"Piazzolla is a sophisticated serif typeface featuring sharp, angular terminals and a high-contrast stroke weight that gives it a modern, editorial feel. Its distinctive diamond-shaped tittle and chiseled details evoke a sense of elegance and rhythmic energy.\",\n\t\"Piedra\": \"Piedra is a heavy, decorative display font with a rugged, chiseled appearance that mimics the look of stone or wood. Its irregular, jagged edges and thick strokes create a bold, primitive, and adventurous mood.\",\n\t\"Pilcrow Rounded\": \"Pilcrow Rounded is a clean, condensed sans-serif font featuring soft, rounded terminals and a uniform stroke weight. Its tall x-height and geometric structure create a modern, friendly, and highly legible appearance suitable for technical or minimalist designs.\",\n\t\"Pinyon Script\": \"Pinyon Script is a romantic, high-contrast calligraphic font featuring dramatic swashes and a steep slant that evokes a sense of classic elegance and formal luxury. Its delicate hairlines and bold downstrokes create a sophisticated, hand-lettered feel suitable for high-end invitations and branding.\",\n\t\"Pirata One\": \"Pirata One is a bold, condensed blackletter display font that evokes a gothic, adventurous mood with its sharp, angular strokes and medieval aesthetic. Its dense, vertical structure and decorative flourishes make it ideal for thematic branding and high-impact headings.\",\n\t\"Pixelcastle\": \"Pixelcastle is a retro-style pixel font that mimics a classic blackletter or gothic script, featuring blocky, jagged edges and a heavy weight. It evokes a nostalgic, medieval fantasy aesthetic typical of early 8-bit and 16-bit video games.\",\n\t\"Pixelify Sans\": \"Pixelify Sans is a retro-style pixel display font that mimics the low-resolution aesthetic of early video games. It features blocky, geometric letterforms with a medium weight, evoking a nostalgic, digital, and playful mood.\",\n\t\"Plaster\": \"Plaster is a heavy, geometric display font with a stencil-like appearance, featuring ultra-thick strokes and narrow negative spaces. Its blocky, industrial aesthetic and fragmented letterforms create a bold, modern, and architectural feel.\",\n\t\"Platypi\": \"Platypi is a quirky, medium-weight serif font featuring sharp, wedge-like serifs and unconventional, angular terminals that give it a playful yet scholarly character.\",\n\t\"Play\": \"A clean, modern sans-serif font with a medium weight and a slightly technical, geometric feel. It features open counters and subtle rounded corners that give it a friendly yet professional appearance.\",\n\t\"Playball\": \"Playball is a festive, connecting script font with a medium weight and a sporty, retro feel. It features elegant, fluid strokes and a slight italic lean, making it ideal for athletic branding or casual invitations.\",\n\t\"Player Sans Mono 8x8\": \"A retro 8-bit pixel font with a monospaced, sans-serif design that evokes a nostalgic, early video game aesthetic. Its blocky, low-resolution structure creates a bold and playful look suitable for digital and gaming-themed projects.\",\n\t\"Playfair\": \"Playfair is a high-contrast transitional serif font with an elegant, classic feel, featuring delicate hairlines and ball terminals. Its sophisticated and traditional aesthetic makes it ideal for editorial design and formal headings.\",\n\t\"Playfair Display\": \"Playfair Display is a high-contrast transitional serif font that exudes elegance and a classic, sophisticated mood. It features delicate hairlines, heavy downstrokes, and distinct ball terminals, making it ideal for headlines and editorial design.\",\n\t\"Playfair Display Sc\": \"Playfair Display SC is an elegant, high-contrast serif font featuring a classic, sophisticated mood with its distinct small caps design. Its sharp serifs and dramatic variation between thick and thin strokes give it a refined, editorial aesthetic suitable for formal headings.\",\n\t\"Playpen Sans\": \"Playpen Sans is a casual, handwritten sans-serif font with a friendly and playful mood, featuring rounded terminals and irregular, organic strokes that mimic natural penmanship. Its medium weight and informal structure make it feel approachable and personal, ideal for lighthearted or child-oriented designs.\",\n\t\"Playpen Sans Arabic\": \"Playpen Sans Arabic is a casual, handwritten-style sans-serif font with a friendly and playful mood. It features rounded terminals, irregular stroke weights, and a slight bounce that gives it an informal, organic appearance.\",\n\t\"Playpen Sans Deva\": \"Playpen Sans Deva is a casual, handwritten sans-serif font with a friendly and playful mood. It features rounded terminals, irregular stroke widths, and a slight bounce that gives it an organic, informal appearance.\",\n\t\"Playpen Sans Hebrew\": \"Playpen Sans Hebrew is a casual, handwritten-style sans-serif font with a friendly and informal mood. It features rounded terminals, irregular stroke widths, and a slight bounce that gives it a playful, organic feel reminiscent of marker writing.\",\n\t\"Playpen Sans Thai\": \"Playpen Sans Thai is a casual, handwritten-style sans-serif font with a friendly and playful mood. It features rounded terminals, irregular stroke widths, and a slight bounce that gives it a charming, informal appearance.\",\n\t\"Playwrite Ar\": \"Playwrite AR is a casual, monolinear script font that mimics neat, modern handwriting with its rounded terminals and upright, rhythmic flow. It features playful, looped descenders and a friendly, educational aesthetic that feels both personal and approachable.\",\n\t\"Playwrite Ar Guides\": \"This is a monolinear, cursive script font designed for educational purposes, featuring thin strokes and a friendly, handwritten feel. It includes horizontal guide lines to demonstrate proper letter height and placement, making it ideal for teaching penmanship.\",\n\t\"Playwrite At\": \"Playwrite AT is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and approachable feel. It features rounded terminals, upright letterforms, and distinct loops that give it a playful yet legible character.\",\n\t\"Playwrite At Guides\": \"This is a monolinear, cursive script font designed for educational purposes, featuring a friendly and instructional mood. It is characterized by its upright, rounded letterforms set against horizontal guide lines to simulate handwriting practice.\",\n\t\"Playwrite Au Nsw\": \"This is a light-weight, cursive-inspired script font that mimics neat, modern handwriting with a slight italic slant. It features clean, monolinear strokes and open letterforms, creating a friendly and educational aesthetic.\",\n\t\"Playwrite Au Nsw Guides\": \"This is an educational, cursive-style script font designed for handwriting practice, featuring a light weight and a distinct slant. It is presented on horizontal guide lines to demonstrate proper letter height and alignment, giving it a functional and instructional feel.\",\n\t\"Playwrite Au Qld\": \"This is a light-weight, cursive script font with a distinct slant and a clean, monolinear stroke. It has an educational and friendly feel, mimicking modern handwriting styles used in Australian primary schools.\",\n\t\"Playwrite Au Qld Guides\": \"This is an educational, cursive-style script font designed for handwriting instruction, featuring a light weight and a distinct forward slant. It includes horizontal guide lines to demonstrate proper letter height and placement, giving it a functional and instructional appearance.\",\n\t\"Playwrite Au Sa\": \"Playwrite AU SA is a light-weight, casual script font that mimics neat, modern handwriting with a slight italic slant. Its clean, monolinear strokes and rounded terminals create a friendly and approachable feel, suitable for educational or personal designs.\",\n\t\"Playwrite Au Sa Guides\": \"This is a light-weight, cursive-style script font designed for educational purposes, featuring thin, slanted strokes and integrated horizontal guide lines. It has a clean, instructional feel that mimics handwriting practice for South Australian primary education.\",\n\t\"Playwrite Au Tas\": \"Playwrite AU TAS is a light-weight, cursive-inspired script font with a distinct forward slant and a clean, monolinear stroke. It features an elegant, handwritten feel with open loops and rounded terminals, conveying a modern yet personal and educational tone.\",\n\t\"Playwrite Au Tas Guides\": \"This is a light-weight, cursive-style script font designed for educational purposes, featuring a distinct slant and thin, uniform strokes. It is presented on horizontal guide lines to mimic handwriting practice, giving it a clean, instructional, and disciplined feel.\",\n\t\"Playwrite Au Vic\": \"Playwrite AU Vic is a light-weight, cursive script font that mimics natural handwriting with a slight italic slant. It features elegant, flowing strokes and rounded terminals, creating a friendly and personal educational aesthetic.\",\n\t\"Playwrite Au Vic Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, elegant strokes and a distinct slant. It is presented on horizontal guide lines to simulate handwriting practice, giving it a clean, instructional, and disciplined feel.\",\n\t\"Playwrite Be Vlg\": \"Playwrite BE VLG is a charming, cursive script font that mimics natural handwriting with its fluid, monolinear strokes and elegant loops. It conveys a friendly and personal mood, featuring a slight slant and distinct, rounded letterforms that give it a modern yet classic calligraphic feel.\",\n\t\"Playwrite Be Vlg Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring elegant loops and a rhythmic flow. It includes horizontal guide lines to simulate handwriting practice, giving it a classic, instructional, and disciplined feel.\",\n\t\"Playwrite Be Wal\": \"Playwrite Be Wal is a light-weight, monolinear script font that mimics neat, upright handwriting with a playful and educational feel. It features distinct, rounded letterforms with elegant loops and curls, particularly on the capital letters and descenders.\",\n\t\"Playwrite Be Wal Guides\": \"This is a thin, cursive script font designed for educational purposes, featuring a playful and handwritten feel. It includes horizontal guide lines to demonstrate proper letter height and placement, making it ideal for teaching penmanship.\",\n\t\"Playwrite Br\": \"Playwrite BR is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and educational feel. It features rounded terminals, upright letterforms, and distinct loops, making it highly legible and approachable.\",\n\t\"Playwrite Br Guides\": \"This is a thin, monolinear cursive script font designed for educational purposes, featuring integrated horizontal guidelines to demonstrate proper letter height and placement. Its style is clean and instructional, mimicking traditional handwriting practice with looped ascenders and descenders.\",\n\t\"Playwrite Ca\": \"Playwrite CA is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and approachable mood. It features elegant, flowing loops and a slight rightward slant, giving it a rhythmic and personal feel.\",\n\t\"Playwrite Ca Guides\": \"This is an educational cursive script font featuring thin, elegant strokes and a distinct slant, designed to mimic traditional handwriting. It includes horizontal guide lines to demonstrate proper letter height and alignment, giving it a formal yet instructional feel.\",\n\t\"Playwrite Cl\": \"Playwrite CL is a charming, monolinear script font that mimics neat, modern handwriting with a playful and friendly mood. It features rounded terminals, looped ascenders, and a casual, upright structure that gives it a clean yet personal feel.\",\n\t\"Playwrite Cl Guides\": \"This is a monolinear, cursive script font designed for educational purposes, featuring thin, uniform strokes and integrated horizontal guide lines. Its friendly, instructional style mimics traditional handwriting practice sheets with clear, flowing letterforms.\",\n\t\"Playwrite Co\": \"Playwrite CO is a casual, monoline script font that mimics natural handwriting with its flowing, connected lowercase letters and distinct, upright capitals. It features rounded terminals and a friendly, approachable mood, making it ideal for educational or personal creative projects.\",\n\t\"Playwrite Co Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous loops and slanted letterforms. It is presented on horizontal guide lines to mimic traditional handwriting practice, giving it a classic and instructional feel.\",\n\t\"Playwrite Cu\": \"Playwrite Cu is a light-weight, cursive script font that mimics natural handwriting with its fluid, connected strokes and elegant loops. It conveys a personal and friendly mood, featuring a consistent monolinear thickness and a slight rightward slant.\",\n\t\"Playwrite Cu Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, elegant strokes and integrated horizontal guidelines. Its flowing, connected letterforms evoke a classic handwriting style used for teaching penmanship.\",\n\t\"Playwrite Cz\": \"Playwrite CZ is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and approachable feel. It features fluid, connected lowercase letters and distinct, upright capitals, making it ideal for educational or personal creative projects.\",\n\t\"Playwrite Cz Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous, flowing strokes and integrated horizontal guide lines. It has a classic, instructional feel that mimics traditional handwriting practice for primary education.\",\n\t\"Playwrite De Grund\": \"Playwrite DE Grund is a clean, monolinear sans-serif font with a friendly, handwritten feel, featuring rounded terminals and a light weight. Its simple, open letterforms evoke a sense of clarity and modern educational aesthetics.\",\n\t\"Playwrite De Grund Guides\": \"This is a clean, monolinear sans-serif font designed to mimic primary school handwriting, featuring a light weight and an educational mood. It is characterized by its simple, geometric letterforms set against horizontal guide lines to assist with letter height and placement.\",\n\t\"Playwrite De La\": \"Playwrite De La is a charming, medium-weight script font that mimics natural, upright handwriting with a friendly and educational feel. It features distinct, disconnected letterforms with rounded terminals and elegant loops, particularly in the capital letters, giving it a clear and legible yet personal character.\",\n\t\"Playwrite De La Guides\": \"This is a cursive, educational script font featuring a light weight and a rhythmic, handwritten feel. It is characterized by its integration with horizontal guide lines, making it ideal for teaching penmanship and letter formation.\",\n\t\"Playwrite De Sas\": \"Playwrite DE Grund is a light-weight, cursive script font that mimics natural handwriting with its fluid, connected strokes and slight slant. It has a friendly and personal feel, featuring rounded letterforms and a consistent line weight that gives it a clean, modern look.\",\n\t\"Playwrite De Sas Guides\": \"A light-weight, cursive script font designed for educational purposes, featuring elegant, slanted letterforms set against horizontal guide lines to mimic handwriting practice.\",\n\t\"Playwrite De Va\": \"Playwrite De Va is a light-weight, cursive script font that mimics natural handwriting with a friendly and educational feel. It features thin, uniform strokes and elegant loops, particularly in the lowercase letters, giving it a clean and approachable aesthetic.\",\n\t\"Playwrite De Va Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, elegant strokes and integrated horizontal guidelines. It has a clean, instructional feel with fluid connections between letters, mimicking traditional handwriting practice.\",\n\t\"Playwrite Dk Loopet\": \"Playwrite Dk Loopet is a light-weight, cursive script font that mimics natural handwriting with its slanted, flowing strokes and looped letterforms. It conveys a friendly, personal, and educational mood, reminiscent of traditional penmanship practice.\",\n\t\"Playwrite Dk Loopet Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring looped letterforms and integrated horizontal guide lines. It has a clean, instructional feel with a consistent slant and monolinear stroke weight.\",\n\t\"Playwrite Dk Uloopet\": \"A light-weight, cursive script font with a casual, handwritten feel, featuring thin strokes and a distinct rightward slant. Its looped letterforms and informal style evoke a sense of personal, modern penmanship.\",\n\t\"Playwrite Dk Uloopet Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, elegant strokes and a distinct slant. It is presented on horizontal guide lines to mimic handwriting practice, giving it a clean, instructional, and disciplined feel.\",\n\t\"Playwrite Es\": \"Playwrite ES is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and approachable mood. It features rounded terminals, looped ascenders, and a rhythmic, upright flow that balances clarity with a playful, personal touch.\",\n\t\"Playwrite Es Deco\": \"Playwrite Es Deco is a charming, monolinear script font that mimics neat, upright handwriting with a playful and educational feel. It features rounded terminals, looped ascenders, and a consistent stroke weight that gives it a friendly, approachable aesthetic.\",\n\t\"Playwrite Es Deco Guides\": \"A light-weight, monolinear cursive script font that mimics traditional handwriting practice, featuring elegant loops and integrated horizontal guide lines for an educational, instructional feel.\",\n\t\"Playwrite Es Guides\": \"This is a light-weight, educational cursive font designed to mimic handwriting practice, featuring thin monolinear strokes and integrated horizontal guide lines. Its style is clean and instructional, evoking a sense of primary school learning and penmanship development.\",\n\t\"Playwrite Fr Moderne\": \"Playwrite FR Moderne is a light-weight, monolinear script font that mimics neat, modern handwriting with its rounded terminals and upright, disconnected letterforms. It conveys a friendly, educational, and approachable mood through its simple, clean strokes and clear legibility.\",\n\t\"Playwrite Fr Moderne Guides\": \"This is a light-weight, educational script font designed to mimic neat handwriting, featuring thin, monolinear strokes and integrated horizontal guidelines. Its clean, upright structure and rounded forms create a clear, instructional, and modern aesthetic suitable for learning environments.\",\n\t\"Playwrite Fr Trad\": \"A light-weight, upright script font that mimics traditional French cursive handwriting with elegant loops and a clean, monolinear stroke. It conveys a nostalgic, educational, and personal mood through its distinct, flowing letterforms and rounded terminals.\",\n\t\"Playwrite Fr Trad Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring traditional French handwriting styles set against horizontal guide lines. Its elegant, flowing loops and connected lowercase letters evoke a classic, instructional feel suitable for penmanship practice.\",\n\t\"Playwrite Gb J\": \"This is a monolinear, casual script font that mimics neat, modern handwriting with rounded terminals and a friendly, approachable mood. It features distinct, disconnected characters with subtle cursive influences, such as the looped 'y' and the curved tails on the 'l' and 't'.\",\n\t\"Playwrite Gb J Guides\": \"This is a light-weight, educational script font designed to mimic primary school handwriting, featuring thin monolinear strokes and integrated horizontal guidelines. Its clean, upright letterforms and rounded terminals create a clear, instructional, and friendly appearance.\",\n\t\"Playwrite Gb S\": \"Playwrite GB S is a clean, monolinear script font that mimics modern primary school handwriting with its upright, unjoined characters and rounded terminals. It features a friendly, educational mood with simple, open letterforms and distinct, playful curves on the descenders.\",\n\t\"Playwrite Gb S Guides\": \"This is a light-weight, educational script font designed to mimic primary school handwriting, featuring monolinear strokes and integrated horizontal guide lines. Its clean, upright structure and simple letterforms create a clear, instructional, and helpful mood for learning penmanship.\",\n\t\"Playwrite Hr\": \"Playwrite Hr is a casual, cursive script font with a medium weight that mimics natural handwriting. It features elegant loops and a slight rightward slant, conveying a friendly, personal, and authentic mood.\",\n\t\"Playwrite Hr Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring elegant loops and a rhythmic, handwritten flow. It is presented on horizontal guidelines to mimic traditional penmanship practice, giving it a classic and instructional feel.\",\n\t\"Playwrite Hr Lijeva\": \"This is a casual, monoline script font with a friendly and educational feel, featuring rounded terminals and a distinct upright, handwritten style. Its playful yet legible letterforms, such as the looped 'H' and 'L', give it a personal and approachable character.\",\n\t\"Playwrite Hr Lijeva Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring a monolinear stroke and a distinct leftward slant. It has a friendly, instructional feel and includes horizontal guide lines to demonstrate proper letter height and placement.\",\n\t\"Playwrite Hu\": \"Playwrite HU is a charming, upright script font with a monolinear weight that mimics neat, modern handwriting. It features playful, rounded terminals and elegant loops, particularly in the capital letters, giving it a friendly and personal feel.\",\n\t\"Playwrite Hu Guides\": \"This is a monolinear, cursive script font designed for educational purposes, featuring thin, uniform strokes and integrated horizontal guidelines. Its upright, looped letterforms create a clear, instructional, and disciplined aesthetic suitable for handwriting practice.\",\n\t\"Playwrite Id\": \"Playwrite ID is a light-weight, monolinear script font that mimics neat, modern handwriting with a playful and friendly mood. It features rounded terminals, looped ascenders, and a casual, upright structure that balances legibility with a personal touch.\",\n\t\"Playwrite Id Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, monolinear strokes and clear, upright letterforms. It has a clean and instructional mood, specifically tailored to mimic handwriting practice with its inclusion of horizontal guide lines.\",\n\t\"Playwrite Ie\": \"Playwrite Ie is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and approachable mood. It features elegant, looping ascenders and a rhythmic flow that balances clarity with a personal, handcrafted feel.\",\n\t\"Playwrite Ie Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous loops and slanted letterforms. It is presented on horizontal guide lines to mimic handwriting practice, giving it a formal yet instructional and academic feel.\",\n\t\"Playwrite In\": \"Playwrite IN is an elegant, cursive script font with a light-to-medium weight that mimics natural handwriting. It features fluid, rhythmic strokes and looped ascenders, conveying a personal, sophisticated, and classic feel.\",\n\t\"Playwrite In Guides\": \"This is a light-weight, cursive script font designed to mimic traditional handwriting practice, featuring elegant loops and a slight slant. It is uniquely presented on horizontal guide lines, giving it an educational and nostalgic feel.\",\n\t\"Playwrite Is\": \"Playwrite IS is a casual, handwritten script font with a light-to-medium weight and a distinct forward slant. It features rounded terminals and an informal, friendly mood that mimics natural penmanship.\",\n\t\"Playwrite Is Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring thin, elegant strokes and a distinct slant. It is presented on horizontal guidelines to mimic handwriting practice, giving it a clean, instructional, and disciplined feel.\",\n\t\"Playwrite It Moderna\": \"Playwrite IT Moderna is a clean, monolinear script font that mimics modern handwriting with its upright, disconnected letterforms and rounded terminals. It conveys a friendly, educational, and contemporary mood through its simple geometric shapes and consistent stroke weight.\",\n\t\"Playwrite It Moderna Guides\": \"This is a light-weight, monolinear sans-serif font designed for educational purposes, featuring a clean, geometric style set against horizontal guide lines. Its upright, simplified letterforms evoke a modern and instructional mood, ideal for teaching handwriting and letter formation.\",\n\t\"Playwrite It Trad\": \"Playwrite IT Trad is a light-weight, upright script font that mimics traditional Italian primary school handwriting with its monolinear strokes and elegant, looped letterforms. It conveys a nostalgic and educational mood through its clear, rhythmic cursive style and distinct, rounded terminals.\",\n\t\"Playwrite It Trad Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring traditional Italian handwriting forms set against horizontal guide lines. Its monolinear strokes and elegant loops create a clean, instructional, and classic aesthetic.\",\n\t\"Playwrite Mx\": \"Playwrite MX is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and educational feel. It features upright, disconnected characters with rounded terminals and simple, fluid loops.\",\n\t\"Playwrite Mx Guides\": \"A light-weight, cursive script font designed for educational purposes, featuring elegant loops and continuous connections set against horizontal guide lines. It has a classic, instructional feel with a consistent slant and fluid, monolinear strokes.\",\n\t\"Playwrite Ng Modern\": \"Playwrite NG Modern is a light-weight, monolinear script font that mimics neat, modern handwriting with its rounded terminals and upright, disconnected letterforms. It conveys a friendly, educational, and approachable mood through its clean, geometric construction and high legibility.\",\n\t\"Playwrite Ng Modern Guides\": \"This is a light-weight, monolinear sans-serif font designed for educational purposes, featuring thin strokes and horizontal guide lines to aid in letter formation. Its clean, geometric structure and upright posture create a clear, modern, and instructional aesthetic.\",\n\t\"Playwrite Nl\": \"Playwrite NL is a light-weight, cursive script font that mimics elegant, fluid handwriting with its continuous strokes and rounded loops. It conveys a personal, friendly, and educational mood, featuring distinctively tall ascenders and graceful, flowing letterforms.\",\n\t\"Playwrite Nl Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous loops and elegant connections. It is presented on horizontal guide lines to simulate handwriting practice, giving it a formal yet instructional and classic feel.\",\n\t\"Playwrite No\": \"Playwrite NO is a casual, cursive script font with a medium weight and a friendly, handwritten feel. It features elegant loops, a slight rightward slant, and a consistent monolinear stroke that gives it a modern yet personal touch.\",\n\t\"Playwrite No Guides\": \"Playwrite No Guides is a light-weight, cursive script font that mimics elegant, traditional handwriting with its fluid, slanted strokes and looped descenders. It conveys a classic, educational, and personal mood, featuring clean lines and a rhythmic flow.\",\n\t\"Playwrite Nz\": \"Playwrite NZ is a light-weight, cursive-inspired script font that mimics neat, modern handwriting with a distinct forward slant. Its clean, monolinear strokes and open letterforms create a friendly, educational, and highly legible aesthetic.\",\n\t\"Playwrite Nz Basic\": \"A light-weight, italicized handwriting font with a clean, monolinear stroke that mimics modern educational script. It features a playful yet legible style with distinct, unconnected letterforms and rounded terminals.\",\n\t\"Playwrite Nz Basic Guides\": \"A light-weight, slanted script font designed for educational use, featuring a mono-linear stroke and clear, simple letterforms modeled after New Zealand handwriting styles. It includes horizontal guide lines to emphasize its character as a primary learning tool for penmanship.\",\n\t\"Playwrite Nz Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring a slanted, handwritten style set against horizontal guide lines. It has a clean, instructional feel with fluid connections and consistent letter heights that mimic traditional penmanship practice.\",\n\t\"Playwrite Pe\": \"Playwrite Pe is a charming, monolinear script font that mimics neat, upright handwriting with a friendly and educational feel. It features rounded terminals and distinct, looped letterforms that give it a playful yet legible character.\",\n\t\"Playwrite Pe Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous loops and a friendly, handwritten feel. It is presented on horizontal guidelines to demonstrate proper letter height and alignment, making it ideal for teaching penmanship.\",\n\t\"Playwrite Pl\": \"Playwrite PL is a charming, monolinear script font that mimics neat, modern handwriting with a playful and friendly mood. It features rounded terminals, distinct loops, and a casual upright posture that gives it a personal, educational feel.\",\n\t\"Playwrite Pl Guides\": \"A light-weight, cursive script font designed for educational purposes, featuring thin, monolinear strokes and integrated horizontal guidelines. Its upright, looped letterforms create a clear, instructional, and friendly aesthetic suitable for handwriting practice.\",\n\t\"Playwrite Pt\": \"Playwrite Pt is a charming, monolinear script font that mimics neat, upright handwriting with a friendly and educational feel. It features rounded terminals, looped ascenders, and distinct, legible letterforms that evoke a sense of clarity and personal touch.\",\n\t\"Playwrite Pt Guides\": \"A light-weight, educational cursive script font designed to mimic handwriting, featuring horizontal guide lines to assist with letter formation and alignment. Its looped, flowing strokes and upright posture create a clear, instructional, and friendly appearance.\",\n\t\"Playwrite Ro\": \"Playwrite RO is a charming, cursive script font that mimics natural handwriting with its fluid, monolinear strokes and elegant loops. It conveys a friendly and personal mood, featuring a slight slant and disconnected characters that give it a modern, informal feel.\",\n\t\"Playwrite Ro Guides\": \"A delicate, cursive script font with a light weight and an educational feel, featuring thin, flowing strokes and integrated horizontal guide lines that mimic handwriting practice paper.\",\n\t\"Playwrite Sk\": \"Playwrite Sk is a light-to-medium weight cursive script font that mimics elegant, hand-drawn penmanship with a fluid and rhythmic feel. Its looped ascenders and graceful, connected strokes create a personal and sophisticated mood suitable for formal invitations or creative branding.\",\n\t\"Playwrite Sk Guides\": \"This is an educational cursive script font featuring thin, elegant strokes and a rhythmic, handwritten feel. It is uniquely presented on horizontal guide lines to simulate a primary school writing practice environment.\",\n\t\"Playwrite Tz\": \"Playwrite TZ is a casual, monolinear script font that mimics natural handwriting with its fluid, connected strokes and slight slant. It features rounded terminals and a friendly, approachable mood, making it ideal for educational or personal creative projects.\",\n\t\"Playwrite Tz Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring elegant, flowing loops and a distinct slant. It is presented on horizontal guidelines to mimic traditional handwriting practice, giving it a classic and instructional feel.\",\n\t\"Playwrite Us Modern\": \"Playwrite US Modern is a clean, light-weight script font that mimics neat, modern handwriting with its upright posture and rounded terminals. It features a friendly and educational mood, characterized by simple, disconnected letterforms that prioritize legibility.\",\n\t\"Playwrite Us Modern Guides\": \"This is a thin, monolinear sans-serif font designed to mimic educational handwriting, featuring a clean and instructional mood. It is uniquely characterized by integrated horizontal guide lines that emphasize letter height and alignment for learning purposes.\",\n\t\"Playwrite Us Trad\": \"Playwrite US Trad is a light-weight, cursive script font that mimics traditional American school handwriting with its fluid, connected strokes and upright, elegant loops. It conveys a nostalgic and educational mood, featuring clean, monolinear lines that are both legible and classic.\",\n\t\"Playwrite Us Trad Guides\": \"This is a traditional cursive script font designed for educational purposes, featuring thin, elegant strokes and a slight slant. It includes horizontal guide lines to mimic handwriting practice sheets, giving it a nostalgic and instructional feel.\",\n\t\"Playwrite Vn\": \"Playwrite Vn is a charming, monolinear script font that mimics neat, upright handwriting with a playful and friendly mood. It features rounded terminals, looped ascenders, and a rhythmic, disconnected cursive style that feels both personal and legible.\",\n\t\"Playwrite Vn Guides\": \"This is a light-weight, cursive script font designed for educational purposes, featuring continuous loops and elegant connections. It has a friendly, instructional feel and includes horizontal guide lines to demonstrate proper letter height and placement.\",\n\t\"Playwrite Za\": \"Playwrite Za is a casual, monolinear script font that mimics neat, modern handwriting with a friendly and educational feel. It features upright, disconnected characters with rounded terminals and simple, flowing loops that provide excellent legibility.\",\n\t\"Playwrite Za Guides\": \"This is a cursive, educational script font featuring thin, uniform strokes and a rhythmic, handwritten feel. It is presented on horizontal guide lines, emphasizing its purpose for teaching penmanship and letter formation.\",\n\t\"Plein\": \"Plein is a clean, geometric sans-serif font with a modern and professional feel, featuring high x-heights and open apertures. Its balanced weight and minimalist design make it highly legible and versatile for both display and body text.\",\n\t\"Plus Jakarta Sans\": \"Plus Jakarta Sans is a modern geometric sans-serif font with a clean, friendly, and professional appearance. It features open counters, a medium weight, and balanced proportions that ensure high legibility for both digital and print interfaces.\",\n\t\"Pochaevsk\": \"Pochaevsk is a classic serif font with a medium weight and a scholarly, traditional feel. It features sharp, wedge-like serifs and a slight calligraphic influence in its stroke transitions, giving it a formal and historic appearance.\",\n\t\"Podkova\": \"Podkova is a monolinear slab serif font with a sturdy, modern feel, featuring distinctive diagonal terminals and large, open counters. Its thick, blocky serifs and uniform stroke weight give it a strong, industrial presence that remains highly legible.\",\n\t\"Poetsen One\": \"Poetsen One is a bold, casual display font with a hand-painted feel, featuring soft, rounded terminals and a slight italic slant. Its heavy weight and organic, friendly curves give it a playful and approachable personality suitable for headlines and creative branding.\",\n\t\"Poiret One\": \"Poiret One is a light, geometric sans-serif display font with an Art Deco influence, featuring elegant curves and thin, uniform strokes. Its clean lines and large circular forms create a modern, sophisticated, and airy aesthetic.\",\n\t\"Poller One\": \"Poller One is a high-contrast, ultra-bold sans-serif display font with a heavy, geometric feel. Its thick vertical strokes and thin horizontals create a bold, retro-modern aesthetic that is both impactful and playful.\",\n\t\"Poltawski Nowy\": \"Poltawski Nowy is a classic serif typeface with a scholarly and elegant mood, featuring high stroke contrast and distinctive sharp, angular serifs. Its unique calligraphic details, such as the hexagonal tittle on the 'i' and the fluid curves of the 'y', give it a sophisticated, historical character.\",\n\t\"Poly\": \"Poly is a medium-contrast serif typeface with a classic, scholarly feel, featuring short ascenders and distinct, sharp serifs. Its wide proportions and vertical stress give it a stable, legible appearance suitable for long-form body text.\",\n\t\"Pompiere\": \"Pompiere is a tall, condensed sans-serif display font with a playful, hand-drawn feel. It features irregular, slightly wobbly strokes and rounded terminals that give it a friendly, casual, and artisanal appearance.\",\n\t\"Ponnala\": \"Ponnala is a traditional Telugu typeface with a classic, calligraphic feel, featuring rounded forms and a medium weight that ensures readability in body text. Its elegant, flowing strokes provide a formal yet approachable mood suitable for both print and digital media.\",\n\t\"Ponomar\": \"Ponomar is a classic serif font with a medium weight that exudes a traditional and scholarly mood. It features sharp, wedge-shaped serifs and a high stroke contrast, giving it a formal and calligraphic appearance.\",\n\t\"Pontano Sans\": \"Pontano Sans is a minimalist, light-weight sans-serif font with a clean and modern aesthetic. It features open counters and a slightly condensed structure, making it highly legible and professional for body text.\",\n\t\"Poor Story\": \"Poor Story is a casual, handwritten-style sans-serif font with a playful and friendly mood. It features irregular, slightly wobbly strokes and a medium weight that gives it a charming, personal feel.\",\n\t\"Poppins\": \"Poppins is a geometric sans-serif typeface with a clean, modern, and friendly appearance. It is characterized by its perfectly circular letterforms and balanced stroke weights, making it highly versatile for both digital and print design.\",\n\t\"Port Lligat Sans\": \"Port Lligat Sans is a whimsical, hand-drawn sans-serif font with a light-to-medium weight and an organic, irregular feel. Its playful and slightly eccentric mood is defined by uneven stroke widths, flared terminals, and a tall x-height.\",\n\t\"Port Lligat Slab\": \"Port Lligat Slab is a regular-weight slab serif font with a hand-drawn, organic feel and slightly irregular strokes. It features a tall x-height and playful, rounded terminals that give it a friendly, informal, and vintage-inspired character.\",\n\t\"Potta One\": \"Potta One is a bold, playful display font featuring thick, irregular strokes and rounded terminals that give it a hand-drawn, brush-like quality. Its chunky weight and organic, slightly wobbly outlines evoke a friendly and informal mood, perfect for casual or creative designs.\",\n\t\"Pragati Narrow\": \"Pragati Narrow is a clean, modern sans-serif font with a condensed width and uniform stroke weight. Its tall x-height and open apertures give it a functional, highly legible appearance suitable for space-efficient headlines and body text.\",\n\t\"Praise\": \"Praise is a bold, expressive brush script font with a hand-painted feel, featuring high-contrast strokes and fluid, rhythmic letterforms. Its casual yet elegant style conveys a sense of energy and warmth, making it ideal for creative branding and display purposes.\",\n\t\"Pramukh Rounded\": \"Pramukh Rounded is an ultra-condensed sans-serif display font featuring tall, narrow letterforms with soft, rounded terminals. Its sleek and modern aesthetic makes it ideal for high-impact headlines where space is limited.\",\n\t\"Prata\": \"Prata is an elegant Didone-style serif font characterized by high contrast between thick and thin strokes, sharp terminals, and teardrop terminals. Its sophisticated and classic aesthetic makes it ideal for high-end editorial and display use.\",\n\t\"Preahvihear\": \"Preahvihear is a casual, sans-serif display font with a friendly, hand-drawn feel, featuring irregular stroke widths and slightly rounded terminals. Its organic, playful aesthetic makes it well-suited for informal designs and creative headings.\",\n\t\"Press Start 2p\": \"A classic 8-bit pixel display font that evokes a nostalgic, retro gaming aesthetic with its blocky, monospaced structure and jagged edges.\",\n\t\"Pretendard Variable\": \"Pretendard Variable is a clean, modern neo-grotesque sans-serif font with a neutral and highly legible design. It features a medium weight with balanced proportions and open apertures, making it versatile for both digital interfaces and print.\",\n\t\"Pridi\": \"Pridi is a contemporary slab-serif typeface featuring a bold weight and a sturdy, geometric structure. Its clean lines and balanced proportions give it a professional yet approachable feel, suitable for both headlines and body text.\",\n\t\"Princess Sofia\": \"Princess Sofia is a whimsical, calligraphic script font with a playful and feminine mood, featuring irregular, hand-drawn strokes and elegant flourishes. Its light-to-medium weight and decorative curls give it a charming, storybook aesthetic.\",\n\t\"Prociono\": \"Prociono is a classic serif font with a hand-drawn, slightly rustic feel, featuring irregular stroke widths and organic, calligraphic terminals. Its medium weight and uneven edges evoke a sense of historical charm and literary warmth.\",\n\t\"Projekt Blackbird\": \"A clean, geometric sans-serif font with a medium weight that conveys a modern and professional mood. It features high-contrast terminals and a tall x-height, giving it a balanced and highly legible appearance.\",\n\t\"Prompt\": \"A clean, geometric sans-serif typeface with a modern and professional feel, featuring wide proportions and open apertures for high legibility.\",\n\t\"Prosto One\": \"Prosto One is a modern, medium-weight sans-serif font with a clean and friendly appearance. It features rounded terminals and open apertures, giving it a soft, approachable feel suitable for both headlines and body text.\",\n\t\"Protest Guerrilla\": \"Protest Guerrilla is a bold, stencil-style display font with a heavy weight and an industrial, rebellious mood. It features thick, blocky letterforms with distinct gaps and sharp, angular cuts that evoke a sense of urgency and grassroots activism.\",\n\t\"Protest Revolution\": \"Protest Revolution is a gritty, hand-painted display font featuring raw, textured brushstrokes and irregular letterforms. Its aggressive, DIY aesthetic conveys a sense of urgency, rebellion, and grassroots energy.\",\n\t\"Protest Riot\": \"Protest Riot is a bold, hand-drawn display font with a raw, energetic feel, featuring thick, irregular brushstrokes and sharp, expressive terminals. Its informal and slightly chaotic aesthetic conveys a sense of urgency and grassroots activism.\",\n\t\"Protest Strike\": \"Protest Strike is a bold, heavy-weight sans-serif display font with a hand-cut, stencil-like feel. Its slightly irregular edges and solid, blocky letterforms convey a sense of urgency, activism, and raw energy.\",\n\t\"Proza Libre\": \"Proza Libre is a humanist sans-serif typeface with a modern, elegant feel, featuring subtle calligraphic influences and diagonal stroke endings. Its open counters and balanced proportions provide excellent legibility, making it suitable for both body text and display use.\",\n\t\"Pt Mono\": \"PT Mono is a clean, monospaced typeface that blends a modern, technical feel with subtle slab-serif elements. Its uniform character widths and balanced proportions create a professional, highly legible look suitable for coding and structured data.\",\n\t\"Pt Sans\": \"PT Sans is a clean, humanist sans-serif typeface with a modern and functional feel, featuring open apertures and a balanced weight. It combines classic proportions with contemporary details, making it highly legible for both display and body text.\",\n\t\"Pt Sans Caption\": \"PT Sans Caption is a clean, humanist sans-serif font with a medium weight and a professional, modern feel. It features wide proportions and open apertures designed for high legibility in small-scale text and captions.\",\n\t\"Pt Sans Narrow\": \"PT Sans Narrow is a clean, humanist sans-serif font with a condensed width and a medium weight. It features a modern, professional aesthetic with open apertures and subtle stroke variations that enhance readability in tight spaces.\",\n\t\"Pt Serif\": \"PT Serif is a transitional serif typeface with a professional and balanced feel, featuring sharp, wedge-shaped serifs and a moderate contrast between thick and thin strokes. Its design combines classic proportions with modern clarity, making it highly legible for both body text and headlines.\",\n\t\"Pt Serif Caption\": \"PT Serif Caption is a transitional serif font with a sturdy, functional appearance, featuring a large x-height and robust serifs designed for high legibility at small sizes. It conveys a classic yet modern professional tone with its balanced proportions and clear, open letterforms.\",\n\t\"Public Sans\": \"Public Sans is a clean, neutral sans-serif typeface with a medium weight that conveys a modern and highly legible professional mood. It features open apertures and a balanced geometric structure, making it ideal for clear communication in digital interfaces.\",\n\t\"Puppies Play\": \"Puppies Play is a whimsical, decorative script font featuring elegant curls, loops, and a hand-drawn feel. Its light-to-medium weight and bouncy baseline create a playful, charming, and feminine mood.\",\n\t\"Puritan\": \"Puritan is a clean, humanist sans-serif font with a modern and approachable feel, featuring subtle calligraphic influences seen in its slightly flared stroke endings and teardrop-shaped tittle.\",\n\t\"Purple Purse\": \"Purple Purse is a bold, decorative serif font with a playful and vintage-inspired feel, featuring high-contrast strokes and unique, rounded terminals. Its whimsical, slightly irregular shapes give it a charming, hand-drawn quality suitable for display use.\",\n\t\"Pushster\": \"Pushster is a bold, casual script font with a retro, hand-lettered feel, featuring heavy strokes and playful, rounded terminals. Its upright, connected letterforms evoke a sense of mid-century advertising and friendly, informal charm.\",\n\t\"Qahiri\": \"Qahiri is a bold, calligraphic display font inspired by the Kufic style of Arabic script, featuring heavy, blocky strokes and sharp, angular terminals. Its unique aesthetic blends traditional manuscript influences with a modern, geometric feel, characterized by its high contrast and distinctive, teardrop-shaped counters.\",\n\t\"Quando\": \"Quando is a flexible, serif display font with a friendly and classic feel, featuring distinctively curved, brush-like terminals and a medium weight that ensures high legibility.\",\n\t\"Quantico\": \"Quantico is a geometric, sans-serif display font with a bold, technical feel, characterized by its 45-degree chamfered corners and blocky, industrial structure. Its rigid, square-based design evokes a modern, military, or futuristic aesthetic suitable for headlines and branding.\",\n\t\"Quarantype\": \"Quarantype is an eclectic, experimental display font that functions as a 'ransom note' style typeface, featuring a chaotic mix of disparate letterforms ranging from elegant script and bold geometric blocks to textured, hand-drawn sketches. This high-contrast, avant-garde design evokes a sense of creative disorder and DIY aesthetic through its inconsistent weights and clashing typographic styles.\",\n\t\"Quattrocento\": \"Quattrocento is a classic, elegant serif typeface featuring wide proportions, high contrast between thick and thin strokes, and distinctively sharp, cupped serifs. It conveys a sense of timeless sophistication and readability, making it ideal for formal body text and refined headings.\",\n\t\"Quattrocento Sans\": \"Quattrocento Sans is a clean, elegant sans-serif typeface with a classic, humanist feel and a medium weight. It features wide, open letterforms and subtle calligraphic touches, such as the distinctive wavy tail on the uppercase 'Q'.\",\n\t\"Questrial\": \"Questrial is a clean, modern geometric sans-serif font featuring perfectly circular curves and a medium weight that ensures high legibility. Its open apertures and balanced proportions give it a friendly yet professional aesthetic suitable for both web and print.\",\n\t\"Quicksand\": \"Quicksand is a geometric sans-serif font with a friendly, modern feel, characterized by its distinctively rounded terminals and clean, open letterforms. Its light-to-medium weight and soft edges give it a playful yet professional appearance suitable for digital interfaces.\",\n\t\"Quilon\": \"Quilon is a bold, high-contrast serif font that blends classic elegance with a modern, sturdy feel. It features sharp, wedge-like serifs and distinctive rounded terminals, particularly visible in the 'Q' and 'u', giving it a sophisticated yet approachable character.\",\n\t\"Quintessential\": \"Quintessential is a calligraphic display font with a classic, elegant feel, featuring fluid, italicized strokes and sharp, diamond-shaped terminals. Its rhythmic, handwritten quality and varying line weights evoke a sense of traditional penmanship and sophisticated charm.\",\n\t\"Qwigley\": \"Qwigley is an elegant, brush-style script font featuring fluid, calligraphic strokes and dramatic flourishes. Its thin-to-thick transitions and informal, handwritten feel evoke a sense of contemporary sophistication and artistic flair.\",\n\t\"Qwitcher Grypen\": \"Qwitcher Grypen is a casual, brush-style script font with a hand-drawn feel, featuring expressive, textured strokes and a rhythmic, slanted flow. Its informal and energetic mood is characterized by varying line weights and elegant, sweeping flourishes on the capital letters.\",\n\t\"Racing Sans One\": \"Racing Sans One is a high-contrast, heavy-weight sans-serif display font with a strong italic slant that evokes a sense of speed and motion. Its bold, streamlined letterforms and vintage automotive aesthetic make it ideal for high-energy, sports-related designs.\",\n\t\"Radio Canada\": \"Radio Canada is a clean, humanist sans-serif font with a medium weight that conveys a modern and professional tone. It features open apertures and subtle calligraphic touches, such as the angled terminals on the 'd' and 'a', ensuring high legibility for both digital and print media.\",\n\t\"Radio Canada Big\": \"A clean, modern sans-serif display font with a medium weight and a professional, highly legible appearance. It features open apertures and a balanced geometric structure, making it feel both contemporary and authoritative.\",\n\t\"Radley\": \"Radley is a classic serif typeface with a scholarly and refined feel, featuring moderate stroke contrast and sharp, triangular serifs. Its elegant letterforms, such as the distinctive curved tail on the 'y' and the open counters, give it a timeless and legible quality suitable for editorial use.\",\n\t\"Rag\": \"This is a bold, modern sans-serif font with a clean and geometric feel. It features unique, slightly flared terminals and a distinctive double-story 'a' and 'g' that give it a contemporary, professional look.\",\n\t\"Rajdhani\": \"Rajdhani is a modern, modular sans-serif font with a technical and futuristic feel, characterized by its squared-off curves and condensed proportions. Its clean, industrial aesthetic makes it well-suited for headlines and display use in technology-oriented designs.\",\n\t\"Rakkas\": \"Rakkas is a bold, expressive display font that blends traditional Arabic calligraphy influences with a heavy, blackletter-inspired Latin structure. It features high-contrast strokes, sharp angular terminals, and a rhythmic, decorative feel that is both powerful and culturally evocative.\",\n\t\"Raleway\": \"Raleway is an elegant, geometric sans-serif typeface featuring a light weight and a modern, sophisticated feel. It is distinguished by its unique 'W' with crossing diagonal strokes and a clean, minimalist aesthetic.\",\n\t\"Raleway Dots\": \"Raleway Dots is a light-weight, decorative sans-serif display font where each character is composed entirely of small, evenly spaced dots. It maintains the elegant, geometric structure of the original Raleway typeface while offering a playful, airy, and modern aesthetic.\",\n\t\"Ramabhadra\": \"Ramabhadra is a bold, geometric sans-serif font with a clean and modern aesthetic. It features uniform stroke widths and open counters, giving it a sturdy, highly legible appearance suitable for headlines and display use.\",\n\t\"Ramaraja\": \"Ramaraja is a bold, high-contrast serif font with a classic yet slightly playful feel, featuring distinctive wavy terminals and thick, rounded strokes. Its unique, fluid letterforms give it a handcrafted, calligraphic quality suitable for display purposes.\",\n\t\"Rambla\": \"Rambla is a humanist sans-serif font with a slightly condensed structure, offering a modern and clean aesthetic. It features generous apertures and subtle stroke variations that provide excellent legibility for both display and body text.\",\n\t\"Rammetto One\": \"Rammetto One is a heavy, sans-serif display font with a playful and energetic mood, featuring thick strokes and slightly irregular, hand-cut letterforms. Its bold weight and unique, bouncy baseline give it a retro, mid-century aesthetic perfect for headlines.\",\n\t\"Rampart One\": \"Rampart One is a bold, sans-serif display font featuring a dramatic 3D shadow effect that gives it a heavy, architectural feel. Its clean outlines and blocky structure create a powerful, retro-modern aesthetic suitable for impactful headlines.\",\n\t\"Ramsina\": \"This bold serif display font features an organic, hand-carved feel with irregular, slightly wavy edges and heavy, slab-like feet. Its heavy weight and playful yet sturdy construction create a rustic, artisanal mood suitable for headlines and creative branding.\",\n\t\"Ranade\": \"Ranade is a clean, geometric sans-serif typeface with a modern and professional feel, featuring balanced proportions and high legibility. Its design is characterized by open apertures and a neutral tone, making it versatile for both display and body text.\",\n\t\"Ranchers\": \"Ranchers is a bold, heavy-weight display font with a playful, hand-drawn feel, featuring irregular edges and rounded terminals that evoke a casual, mid-century aesthetic.\",\n\t\"Rancho\": \"Rancho is a casual, brush-style script font with a hand-drawn feel, featuring irregular stroke widths and a playful, rustic personality. Its slightly condensed letterforms and organic, textured edges give it a friendly and informal appearance.\",\n\t\"Ranga\": \"Ranga is a bold, casual display font with a hand-drawn, brush-like quality and a distinct rightward slant. Its rounded terminals and fluid, informal strokes give it a friendly, energetic, and approachable feel.\",\n\t\"Rasa\": \"Rasa is a classic serif typeface with a medium weight that conveys a sense of elegance and tradition. It features sharp, prominent serifs and a high contrast between thick and thin strokes, giving it a refined and scholarly appearance.\",\n\t\"Rationale\": \"Rationale is a modern, condensed sans-serif display font with a clean, technical feel. It features a high x-height, subtle rounded corners, and distinct gaps in the letterforms that give it a stencil-like, futuristic appearance.\",\n\t\"Raveo Variable\": \"A clean, modern sans-serif typeface with a medium weight and a professional, neutral mood. It features open apertures and geometric influences, making it highly legible for both display and body text.\",\n\t\"Ravi Prakash\": \"Ravi Prakash is a bold, playful display font with a hand-drawn, organic feel, featuring irregular stroke widths and slightly slanted, bouncy letterforms. Its informal and energetic style is characterized by blunt terminals and a lack of traditional serifs, making it ideal for casual or creative designs.\",\n\t\"Readex Pro\": \"Readex Pro is a clean, geometric sans-serif typeface with a modern and highly legible appearance. It features open counters and a balanced weight, making it feel approachable and professional for both digital and print interfaces.\",\n\t\"Rechteck\": \"This is a bold, blocky display font with a distinct pixelated or 'jagged' edge effect created by repeating diamond shapes. It has a retro, digital, and industrial feel, characterized by its heavy weight and geometric construction.\",\n\t\"Recia\": \"Recia is a contemporary serif typeface featuring a medium weight and a sophisticated, scholarly mood. It is characterized by its sharp, wedge-like serifs and slightly condensed proportions, giving it a crisp and elegant appearance.\",\n\t\"Recursive\": \"Recursive is a modern, versatile sans-serif font with a clean, geometric structure and a slightly technical, monospaced-inspired feel. It features open apertures and subtle, brush-like terminal details that give it a friendly yet professional character.\",\n\t\"Red Hat Display\": \"Red Hat Display is a clean, geometric sans-serif font with a modern and professional feel, featuring open apertures and a balanced weight that ensures high legibility. Its design is characterized by precise, circular curves and straight terminals, making it ideal for clear, contemporary branding and headlines.\",\n\t\"Red Hat Mono\": \"Red Hat Mono is a clean, geometric monospaced font with a modern and technical feel. It features uniform stroke weights and open apertures, making it highly legible for coding and professional documentation.\",\n\t\"Red Hat Text\": \"Red Hat Text is a clean, geometric sans-serif font with a modern and professional feel, featuring open apertures and a balanced weight for high legibility. Its design is characterized by a neutral yet friendly tone, making it ideal for clear communication in digital and print interfaces.\",\n\t\"Red Rose\": \"Red Rose is a bold, high-contrast display serif font that blends classic elegance with a modern, romantic feel. It features sharp, delicate serifs and dramatic stroke variations, giving it a sophisticated and expressive personality.\",\n\t\"Redacted\": \"This is a conceptual display font consisting of solid, heavy black blocks that mimic the appearance of censored or redacted text. It conveys a secretive, classified, or mysterious mood by completely obscuring any underlying letterforms.\",\n\t\"Redacted Script\": \"Redacted Script is a unique display font that mimics illegible, handwritten scribbles with a continuous, wavy line. It features a medium weight and a casual, mysterious mood, designed to represent redacted or placeholder text in wireframes and mockups.\",\n\t\"Reddit Mono\": \"Reddit Mono is a clean, monospaced sans-serif font with a modern and functional aesthetic. It features uniform stroke weights, generous letter spacing, and distinct geometric shapes that ensure high legibility for coding and technical interfaces.\",\n\t\"Reddit Sans\": \"Reddit Sans is a clean, geometric sans-serif font with a modern and approachable feel, featuring open apertures and subtle humanist touches. Its balanced weight and clear letterforms ensure high legibility for digital interfaces while maintaining a friendly, contemporary personality.\",\n\t\"Reddit Sans Condensed\": \"Reddit Sans Condensed is a clean, modern sans-serif font with a narrow, space-efficient profile and a medium weight. It features geometric shapes and open apertures, giving it a friendly yet professional appearance suitable for digital interfaces.\",\n\t\"Redressed\": \"Redressed is a unique display font that blends script and italic serif qualities, featuring a medium weight and an elegant, calligraphic mood. Its notable features include fluid, sweeping curves, sharp terminals, and a distinct verticality that gives it a sophisticated yet approachable feel.\",\n\t\"Reem Kufi\": \"Reem Kufi is a clean, geometric sans-serif font with a modern and minimalist aesthetic, featuring uniform stroke weights and distinctive, slightly rounded terminals. Its design is inspired by traditional Kufic calligraphy, resulting in a balanced, elegant look that works well for both display and body text.\",\n\t\"Reem Kufi Fun\": \"Reem Kufi Fun is a clean, geometric sans-serif font with a modern and friendly feel, featuring rounded terminals and a balanced weight. Its design is inspired by Kufic calligraphy, resulting in a unique blend of traditional structure and contemporary playfulness.\",\n\t\"Reem Kufi Ink\": \"Reem Kufi Ink is a clean, geometric sans-serif font with a modern and calligraphic feel, featuring subtle ink-trap details and rounded terminals that evoke a sense of traditional craftsmanship.\",\n\t\"Reenie Beanie\": \"Reenie Beanie is a casual, light-weight handwriting font with a playful and informal mood. It features loose, irregular strokes and a hand-drawn aesthetic that mimics quick penmanship on paper.\",\n\t\"Reggae One\": \"Reggae One is a bold display font with a rhythmic, expressive feel, featuring sharp, tapered terminals and high-contrast strokes that evoke a sense of movement. Its unique, wedge-like shapes and organic curves give it a modern yet soulful personality, perfect for vibrant and artistic designs.\",\n\t\"Rem\": \"Rem is a bold, geometric sans-serif font that exudes a modern and industrial feel through its thick, uniform strokes and sharp, clean angles.\",\n\t\"Rena\": \"Rena is a bold, geometric sans-serif font with a modern and industrial feel, characterized by its unique chamfered corners and flat-edged terminals.\",\n\t\"Rethink Sans\": \"Rethink Sans is a clean, geometric sans-serif font with a modern and approachable feel. It features open apertures, uniform stroke weights, and a high x-height, making it highly legible for both digital and print interfaces.\",\n\t\"Revalia\": \"Revalia is a bold, geometric display font with a modern, slightly futuristic feel, characterized by its wide proportions and unique, angular cut-outs in the letterforms. Its heavy weight and distinctive square-like curves give it a strong, architectural presence suitable for headlines.\",\n\t\"Rhodium Libre\": \"Rhodium Libre is a robust, high-contrast serif font with a modern, professional feel, featuring distinct slab-like serifs and a large x-height for excellent readability. Its clean lines and sturdy construction make it well-suited for both digital screens and print.\",\n\t\"Ribes\": \"Ribes is a high-contrast sans-serif display font that blends modern elegance with a touch of classic flair, featuring dramatic variations between thick and thin strokes. Its wide, circular letterforms and sharp terminals create a sophisticated, fashion-forward aesthetic.\",\n\t\"Ribeye\": \"Ribeye is a playful, heavy-weight display font with a hand-drawn, cartoonish feel, featuring irregular slab serifs and bouncy, rounded letterforms. Its whimsical and informal style makes it ideal for creative projects that require a friendly, energetic personality.\",\n\t\"Ribeye Marrow\": \"Ribeye Marrow is a playful, decorative display font featuring an inline or 'marrow' effect within its hand-drawn, slab-serif letterforms. Its irregular, bouncy baseline and rounded terminals give it a whimsical, casual, and vintage-inspired aesthetic.\",\n\t\"Righteous\": \"Righteous is a bold, geometric display sans-serif font with a modern, art deco-inspired feel. It features unique, rounded letterforms and distinctive diagonal cuts on characters like the 'R' and 'e', giving it a sleek and futuristic appearance.\",\n\t\"Risque\": \"Risque is a playful, irregular display font featuring sharp, wedge-shaped serifs and an off-kilter, hand-drawn aesthetic. Its bold weight and bouncy baseline create a whimsical, energetic mood reminiscent of vintage storybooks or mid-century animation.\",\n\t\"Road Rage\": \"Road Rage is a bold, distressed display font with a gritty, hand-painted aesthetic. Its heavy weight and jagged, eroded edges convey a raw, aggressive, and urban mood.\",\n\t\"Roboto\": \"Roboto is a modern, neo-grotesque sans-serif font featuring a clean, geometric structure with open curves that provide a friendly and professional feel. Its balanced weight and straightforward design make it highly legible and versatile for both digital and print interfaces.\",\n\t\"Roboto Condensed\": \"Roboto Condensed is a modern, geometric sans-serif font featuring a narrow width and clean, mechanical lines. Its high x-height and open curves provide a professional, efficient feel that is highly legible in space-constrained layouts.\",\n\t\"Roboto Flex\": \"Roboto Flex is a clean, modern neo-grotesque sans-serif font featuring a neutral and highly legible design with open curves and a medium weight. Its geometric structure and balanced proportions give it a professional, versatile appearance suitable for both digital and print interfaces.\",\n\t\"Roboto Mono\": \"Roboto Mono is a clean, monospaced sans-serif font that combines a modern, technical aesthetic with high legibility. Its geometric structure and even stroke weight give it a professional, balanced feel suitable for coding and data-heavy environments.\",\n\t\"Roboto Serif\": \"Roboto Serif is a modern, highly legible serif typeface featuring a medium weight and a balanced, professional mood. It is characterized by its clean, functional design with sharp, distinct serifs and open counters, making it ideal for long-form reading.\",\n\t\"Roboto Slab\": \"Roboto Slab is a modern slab-serif typeface featuring geometric forms and open curves that create a friendly yet professional appearance. It combines a mechanical skeleton with heavy, block-like serifs, offering excellent readability and a balanced, contemporary feel.\",\n\t\"Rochester\": \"Rochester is an elegant, upright script font inspired by early 20th-century calligraphy, featuring fluid, connected strokes and a sophisticated, vintage charm. Its high-contrast lines and decorative loops give it a formal yet approachable feel, perfect for invitations and classic branding.\",\n\t\"Rock 3d\": \"This is a playful, hand-drawn display font featuring a bold, three-dimensional block style with irregular, wobbly outlines. Its sketchy, cartoonish aesthetic gives it a casual and energetic feel, reminiscent of graffiti or comic book lettering.\",\n\t\"Rock Salt\": \"Rock Salt is a casual, hand-drawn display font with a raw, energetic feel, featuring irregular strokes and a felt-tip marker aesthetic. Its slanted, all-caps design conveys a sense of urgency and personal touch, making it ideal for informal or edgy branding.\",\n\t\"Rocknroll One\": \"Rocknroll One is a dynamic, sans-serif display font with a playful and energetic mood, featuring irregular stroke widths and angled terminals that give it a hand-drawn, rhythmic quality.\",\n\t\"Rokkitt\": \"Rokkitt is a sturdy slab-serif typeface with a geometric feel, featuring heavy, rectangular serifs and a consistent stroke weight. It conveys a modern yet industrial mood, making it highly legible and impactful for both display and body text.\",\n\t\"Romanesco\": \"Romanesco is a refined, calligraphic script font with a distinct italic slant and elegant, hand-drawn strokes. It features high-contrast line weights and jagged, textured edges that give it a sophisticated yet organic, vintage feel.\",\n\t\"Ronzino\": \"A clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and open, circular letterforms.\",\n\t\"Ropa Sans\": \"Ropa Sans is a clean, humanistic sans-serif font with a medium weight and a professional, modern feel. It features slightly condensed letterforms and open apertures, making it highly legible for both body text and headlines.\",\n\t\"Rosaline\": \"Rosaline is an elegant, formal script font featuring high-contrast strokes and a sophisticated, calligraphic feel. Its flowing, slanted letterforms and decorative flourishes evoke a sense of classic romance and luxury.\",\n\t\"Rosario\": \"Rosario is a semi-serif typeface with a clean, humanist feel, featuring subtle stroke contrasts and slightly flared terminals that give it a classic yet approachable look. Its open counters and balanced proportions make it highly legible and elegant for both display and body text.\",\n\t\"Rosarivo\": \"Rosarivo is an elegant, high-contrast serif font with a classic and literary feel, featuring delicate strokes and distinct diamond-shaped tittle on the 'i'. Its graceful proportions and sharp serifs evoke the sophisticated aesthetic of traditional book typography.\",\n\t\"Rouge Script\": \"Rouge Script is an elegant, formal script font featuring delicate, flowing curves and a high-contrast stroke weight. Its sophisticated, calligraphic style and ornate flourishes evoke a classic, romantic mood suitable for invitations and luxury branding.\",\n\t\"Roundo\": \"Roundo is a clean, geometric sans-serif font with a light-to-medium weight and a modern, approachable feel. It features perfectly circular bowls and open apertures, giving it a balanced and highly legible appearance.\",\n\t\"Rowan\": \"Rowan is a classic serif font with a medium weight that exudes a sophisticated and timeless mood. It features sharp, chiseled serifs and a high contrast between thick and thin strokes, giving it a refined, calligraphic quality.\",\n\t\"Rowdies\": \"Rowdies is a heavy, bold display font with a playful and energetic mood, featuring irregular, hand-cut edges and a distinctive diamond-shaped tittle over the 'i'. Its chunky, sans-serif letterforms have a rugged, informal aesthetic that makes it ideal for headlines and expressive branding.\",\n\t\"Rozha One\": \"Rozha One is a high-contrast display serif font featuring extremely thick vertical strokes and paper-thin hairlines, creating a bold, glamorous, and modern aesthetic. Its dramatic weight distribution and elegant curves make it ideal for large-scale headlines and fashion-forward branding.\",\n\t\"Rubik\": \"Rubik is a modern sans-serif font featuring stout, rounded corners and a friendly, approachable mood. Its low-stroke contrast and geometric construction give it a clean, contemporary look suitable for both digital and print interfaces.\",\n\t\"Rubik 80s Fade\": \"This is a bold, retro-style display font featuring a heavy sans-serif structure with a distinctive halftone dot gradient that creates a fading, glitchy 1980s aesthetic. The textured, pixelated appearance gives it a nostalgic, lo-fi digital feel suitable for high-impact headlines.\",\n\t\"Rubik Beastly\": \"Rubik Beastly is a bold, expressive display font characterized by its wild, 'hairy' texture and jagged, spiky outlines. It conveys a playful yet monstrous mood, transforming a heavy sans-serif structure into a tactile, creature-like aesthetic.\",\n\t\"Rubik Broken Fax\": \"This is a bold, experimental display font featuring a heavy sans-serif structure distorted by a high-contrast, glitchy pattern of horizontal and vertical lines. It evokes a digital, lo-fi aesthetic reminiscent of corrupted data or a malfunctioning fax machine.\",\n\t\"Rubik Bubbles\": \"Rubik Bubbles is a playful, ultra-bold display font featuring letterforms constructed from clusters of soft, rounded circles. Its bubbly, cloud-like texture creates a whimsical and friendly aesthetic, making it ideal for informal or child-oriented designs.\",\n\t\"Rubik Burned\": \"Rubik Burned is a bold, decorative display font featuring a distressed, charred aesthetic with irregular, wavy outlines and fragmented strokes that evoke a sense of heat and erosion. Its heavy weight and rugged, experimental style give it a gritty, high-impact look suitable for creative or edgy designs.\",\n\t\"Rubik Dirt\": \"Rubik Dirt is a bold, sans-serif display font featuring a heavily distressed, gritty texture that gives it a rugged and industrial feel. Its thick, blocky letterforms and eroded edges create a high-impact, urban aesthetic suitable for grunge-inspired designs.\",\n\t\"Rubik Distressed\": \"Rubik Distressed is a bold, sans-serif display font featuring a heavily weathered and eroded texture that gives it a rugged, industrial, or vintage stamp-like appearance. Its thick, rounded letterforms are broken up by irregular white gaps, creating a gritty and high-impact aesthetic.\",\n\t\"Rubik Doodle Shadow\": \"Rubik Doodle Shadow is a playful, hand-drawn display font featuring bold, rounded sans-serif letterforms with a sketchy, cross-hatched drop shadow. Its irregular outlines and \\\"doodled\\\" aesthetic give it a casual, creative, and friendly personality.\",\n\t\"Rubik Doodle Triangles\": \"A playful, hand-drawn display font featuring bold, rounded letterforms filled with a dense, intricate mesh of sketched triangles. Its irregular outlines and textured interior give it a creative, doodle-like aesthetic with a modern, geometric twist.\",\n\t\"Rubik Gemstones\": \"Rubik Gemstones is a bold, decorative display font featuring a heavy, sans-serif structure filled with a crystalline, faceted pattern. Its jagged edges and internal geometric cutouts create a playful, textured look reminiscent of raw minerals or sparkling gems.\",\n\t\"Rubik Glitch\": \"Rubik Glitch is a bold, experimental display font that features a heavy sans-serif base distorted by horizontal digital noise and 'glitch' artifacts. Its jagged, fragmented edges create a high-energy, tech-focused mood suitable for cyberpunk or digital-themed designs.\",\n\t\"Rubik Glitch Pop\": \"Rubik Glitch Pop is a bold, experimental display font that features a chaotic, distorted aesthetic with digital 'glitch' artifacts and fragmented letterforms. Its heavy, sans-serif base is transformed into a high-energy, modern design through the use of pixelated textures and irregular, liquid-like cutouts.\",\n\t\"Rubik Iso\": \"Rubik Iso is a bold, isometric display font that features a blocky, 3D-effect design with jagged, pixelated edges. Its heavy weight and geometric construction give it a retro-digital, architectural feel suitable for gaming or tech-themed graphics.\",\n\t\"Rubik Lines\": \"Rubik Lines is a bold, experimental display font characterized by its unique texture of dense vertical and horizontal hatching. It creates a modern, glitchy, or barcode-like aesthetic while maintaining the rounded, sans-serif letterforms of the original Rubik typeface.\",\n\t\"Rubik Maps\": \"Rubik Maps is a bold, experimental display font featuring a heavy sans-serif structure filled with a complex, textured pattern of cross-hatching and organic, ink-blot shapes. Its gritty, distressed aesthetic creates a rugged and industrial mood, reminiscent of topographic maps or weathered print.\",\n\t\"Rubik Marker Hatch\": \"Rubik Marker Hatch is a bold, playful display font featuring a hand-drawn aesthetic with a distinct cross-hatched texture. Its thick, rounded letterforms mimic the look of a felt-tip marker, creating a casual and energetic feel.\",\n\t\"Rubik Maze\": \"Rubik Maze is a highly decorative display font featuring a complex, labyrinthine pattern within the blocky silhouettes of each letter. Its intricate, geometric linework creates a playful and puzzling aesthetic that challenges legibility while maintaining a bold, modern presence.\",\n\t\"Rubik Microbe\": \"Rubik Microbe is a playful, experimental display font where each character is composed of a dense cluster of irregular, organic dots and blobs. This stippled effect creates a textured, porous appearance that mimics biological organisms or microscopic structures while maintaining the underlying structure of a bold sans-serif.\",\n\t\"Rubik Mono One\": \"Rubik Mono One is an ultra-bold, monospaced sans-serif display font with a modern, industrial feel. It features thick, blocky letterforms with rounded corners that give it a friendly yet high-impact presence.\",\n\t\"Rubik Moonrocks\": \"Rubik Moonrocks is a playful, heavy-weight display font featuring rounded sans-serif letterforms filled with a porous, crater-like texture. Its bold, bubbly silhouette and celestial theme give it a fun, adventurous, and tactile appearance.\",\n\t\"Rubik Pixels\": \"Rubik Pixels is a experimental display font that uses a dithered, bitmapped aesthetic to create a retro-digital and glitchy mood. Its letterforms are constructed from a scattered mosaic of black and white pixels, giving it a textured, low-resolution appearance reminiscent of early computer graphics.\",\n\t\"Rubik Puddles\": \"Rubik Puddles is a playful, decorative display font featuring thick, bubbly letterforms outlined with concentric, ripple-like curves. Its whimsical, cloud-like appearance creates a soft, energetic mood reminiscent of liquid splashes or vibrations.\",\n\t\"Rubik Scribble\": \"Rubik Scribble is a playful, hand-drawn display font featuring heavy, outlined letterforms with irregular, shaky contours that mimic a casual sketch. Its bold weight and informal, DIY aesthetic give it a friendly and energetic personality.\",\n\t\"Rubik Spray Paint\": \"Rubik Spray Paint is a bold, urban display font featuring a heavy weight and a gritty, textured aesthetic that mimics the look of street graffiti. Its soft, rounded letterforms are defined by fuzzy, splattered edges, creating a raw and energetic mood.\",\n\t\"Rubik Storm\": \"Rubik Storm is a bold, experimental display font featuring a heavy, sans-serif structure heavily distorted by a chaotic, pixelated 'noise' effect. Its gritty, eroded texture creates a high-energy, digital-glitch aesthetic that feels both modern and turbulent.\",\n\t\"Rubik Vinyl\": \"Rubik Vinyl is a bold, playful display font featuring heavy, rounded letterforms with a hand-drawn, sticker-like quality. Its irregular outlines and thick strokes create a casual, retro-inspired aesthetic that feels both energetic and informal.\",\n\t\"Rubik Wet Paint\": \"Rubik Wet Paint is a bold, heavy-weight display font that features a playful, street-art aesthetic with dramatic dripping paint effects along the bottom of each character. Its thick, rounded sans-serif letterforms create a sense of raw energy and urban creativity.\",\n\t\"Ruda\": \"Ruda is a clean, humanist sans-serif font with a medium weight and a modern, approachable feel. It features distinctive open counters and slightly flared stroke endings that enhance legibility and give it a unique, friendly character.\",\n\t\"Rufina\": \"Rufina is an elegant serif typeface that blends classic calligraphic influences with a modern, high-contrast design. It features distinctive teardrop terminals and sharp, refined serifs, creating a sophisticated and artistic mood.\",\n\t\"Ruge Boogie\": \"Ruge Boogie is a whimsical, hand-drawn display font featuring a playful and eccentric mood with its irregular, curly flourishes and varying line weights. Its bouncy, script-like quality and spiral terminals give it a unique, storybook-inspired aesthetic.\",\n\t\"Ruluko\": \"Ruluko is a clean, sans-serif typeface with a friendly, handwritten feel, featuring tall x-heights and subtle calligraphic flares at the terminals. Its light weight and open curves create a modern, approachable, and legible aesthetic suitable for body text.\",\n\t\"Rum Raisin\": \"Rum Raisin is a playful, hand-drawn display font with a medium weight and a casual, retro-inspired feel. It features irregular, slightly wobbly strokes and rounded terminals that give it a friendly and organic appearance.\",\n\t\"Ruslan Display\": \"Ruslan Display is a bold, decorative display font inspired by traditional Slavic calligraphy and Old Russian ustav writing. It features heavy, angular strokes and sharp, flared terminals that create a historic, folkloric, and powerful aesthetic.\",\n\t\"Russo One\": \"Russo One is a heavy, sans-serif display font with a bold, industrial feel, featuring square proportions and softened, rounded corners. Its thick strokes and modern, geometric construction give it a powerful and stable presence suitable for headlines and branding.\",\n\t\"Ruthie\": \"Ruthie is an elegant, calligraphic script font featuring ornate flourishes and a hand-drawn, ink-like texture. Its fluid, rhythmic strokes and high-contrast weight create a sophisticated yet personal mood, reminiscent of classic formal handwriting.\",\n\t\"Ruwudu\": \"Ruwudu is a distinctive serif font with a hand-carved or calligraphic feel, featuring sharp, angular serifs and irregular stroke widths that evoke a rustic, organic mood. Its bold weight and unique, slightly asymmetrical letterforms give it a strong, artisanal character.\",\n\t\"Rx100\": \"This is a bold, hand-drawn display font with a quirky, illustrative feel, featuring irregular stroke widths and playful circular dots inside the counters of the zeros. Its tall, condensed letterforms and rough edges give it a modern, DIY aesthetic that is both energetic and informal.\",\n\t\"Rye\": \"Rye is a bold, decorative display font with a distinct Wild West aesthetic, featuring heavy slab serifs and ornate, spurred letterforms. Its rugged, vintage character evokes the feel of 19th-century wood-type posters and classic Americana.\",\n\t\"Sacramento\": \"Sacramento is a monoline, semi-connected script font with a retro, hand-lettered feel inspired by 1950s and 60s brochure lettering. It features elegant, looping curves and a light weight that gives it a sophisticated yet casual and approachable mood.\",\n\t\"Sahitya\": \"Sahitya is a classic serif font with a medium weight and a scholarly, traditional mood. It features distinct, sharp serifs and calligraphic-inspired strokes that give it a formal yet approachable character.\",\n\t\"Sail\": \"Sail is a fresh, breezy script font featuring high-contrast strokes and elegant, wind-swept swashes that evoke a nautical and romantic feel. Its upright posture and decorative flourishes make it ideal for display use, such as invitations and headlines.\",\n\t\"Saira\": \"Saira is a modern, geometric sans-serif typeface with a clean and industrial feel, featuring wide proportions and square-ended terminals. Its high x-height and open apertures make it highly legible and versatile for both display and body text.\",\n\t\"Saira Condensed\": \"Saira Condensed is a modern, geometric sans-serif font with a narrow, space-saving profile and a clean, industrial aesthetic. Its uniform stroke weight and tall x-height give it a bold, authoritative presence suitable for headlines and technical displays.\",\n\t\"Saira Extra Condensed\": \"Saira Extra Condensed is a modern, geometric sans-serif font with a tall, narrow profile and a clean, industrial feel. Its uniform stroke weight and tight spacing make it ideal for high-impact headlines and space-efficient layouts.\",\n\t\"Saira Semi Condensed\": \"Saira Semi Condensed is a modern, geometric sans-serif font with a clean and technical feel. It features a medium weight and slightly narrowed proportions, making it highly legible and efficient for space-conscious designs.\",\n\t\"Saira Stencil One\": \"Saira Stencil One is a heavy, sans-serif display font with a bold, industrial aesthetic characterized by its thick strokes and distinct stencil-style gaps. Its blocky, geometric construction conveys a sense of strength and modern utility, making it ideal for headlines and signage.\",\n\t\"Salsa\": \"Salsa is a playful, casual display font featuring rounded terminals and a rhythmic, hand-drawn feel. Its thick, bouncy letterforms and organic curves evoke a friendly and energetic mood.\",\n\t\"Sanchez\": \"Sanchez is a robust slab-serif typeface that blends a classic, sturdy structure with rounded terminals for a friendly, contemporary feel. Its consistent stroke weight and square serifs give it a clear, legible appearance suitable for both headlines and body text.\",\n\t\"Sancreek\": \"Sancreek is a bold, decorative display font with a vintage Western aesthetic, featuring heavy, curved strokes and distinctive floral-inspired flourishes. Its ornate, slab-serif style evokes a rugged yet ornamental feel, reminiscent of 19th-century circus posters and saloon signage.\",\n\t\"Sankofa Display\": \"Sankofa Display is a highly stylized, geometric display font with a hand-drawn, tribal aesthetic, featuring sharp triangular forms and decorative circular dots within the letterforms. Its irregular, textured outlines and symbolic construction evoke a sense of ancient heritage and cultural storytelling.\",\n\t\"Sansation\": \"Sansation is a clean, modern sans-serif font featuring a medium weight and a friendly, approachable mood. It is characterized by its unique, slightly rounded terminals and a distinctive 't' with a curved base, giving it a contemporary and tech-oriented feel.\",\n\t\"Sansita\": \"Sansita is a playful, wavy sans-serif display font with a rhythmic, calligraphic feel and high-contrast strokes. Its fluid, organic shapes and flared terminals give it a friendly and dynamic personality suitable for branding and titles.\",\n\t\"Sansita Swashed\": \"Sansita Swashed is a bold, italicized display font that blends calligraphic elegance with a modern, playful feel. It features high-contrast strokes, wavy terminals, and distinctive swashed flourishes that give it a rhythmic, hand-lettered appearance.\",\n\t\"Sarabun\": \"Sarabun is a clean, modern sans-serif typeface with a professional and formal tone, featuring open counters and a balanced weight that ensures high legibility. Its design is characterized by a neutral, geometric structure that makes it versatile for both body text and official documentation.\",\n\t\"Sarala\": \"Sarala is a clean, geometric sans-serif font with a modern and approachable feel, featuring open counters and a balanced weight. Its simple, humanist-inspired letterforms ensure high legibility, making it well-suited for both digital interfaces and print.\",\n\t\"Sarina\": \"Sarina is a casual, brush-style script font with a heavy weight and a distinct retro, mid-century aesthetic. Its wide, flowing letterforms and organic, hand-drawn quality evoke a sense of breezy, stylish movement.\",\n\t\"Sarpanch\": \"Sarpanch is a bold, geometric sans-serif display font with a modern, industrial feel. It features wide, squared-off letterforms with subtle rounded corners, giving it a sturdy and high-tech appearance.\",\n\t\"Sassy Frass\": \"Sassy Frass is a whimsical, hand-drawn script font with a playful and energetic mood. It features fluid, expressive strokes with varying weights and decorative loops that give it a casual, handwritten feel.\",\n\t\"Satisfy\": \"Satisfy is a brush-style script font with a handmade, vintage feel, featuring fluid, connected strokes and a slight upright tilt. Its medium weight and organic, slightly irregular edges give it a friendly, personal, and timeless aesthetic.\",\n\t\"Satoshi\": \"Satoshi is a clean, modernist sans-serif typeface that combines geometric precision with grotesque-style proportions for a highly legible and professional look. It features a medium weight with open counters and sharp, straight terminals, conveying a sophisticated and contemporary tech-oriented mood.\",\n\t\"Savate\": \"Savate is a hand-drawn sans-serif font with a medium weight and a casual, artistic mood. It features irregular, organic stroke widths and slightly flared terminals that give it a unique, calligraphic personality.\",\n\t\"Sawarabi Gothic\": \"Sawarabi Gothic is a clean, medium-weight sans-serif font with a modern and highly legible appearance. It features balanced proportions and open apertures, making it feel approachable and professional for both body text and UI elements.\",\n\t\"Sawarabi Mincho\": \"Sawarabi Mincho is a classic serif font with a medium weight that conveys a traditional and elegant mood. It features sharp, triangular serifs and a high contrast between thick and thin strokes, making it highly legible for body text.\",\n\t\"Scada\": \"Scada is a modern, clean sans-serif font with a medium weight and a professional, balanced feel. It features slightly condensed proportions and subtle, sharp terminals that give it a distinctive, contemporary character.\",\n\t\"Scheherazade New\": \"Scheherazade New is a traditional serif typeface with a classic, scholarly feel, featuring high-contrast strokes and sharp, elegant serifs. Its design is characterized by a tall x-height and open counters, providing excellent legibility for formal and academic contexts.\",\n\t\"Schibsted Grotesk\": \"Schibsted Grotesk is a clean, modern sans-serif font with a neutral and professional mood. It features a medium weight with balanced proportions and open apertures, making it highly legible for digital interfaces.\",\n\t\"Schoolbell\": \"Schoolbell is a playful, casual handwriting font with a medium weight and a youthful, informal mood. It features irregular, rounded strokes and a hand-drawn aesthetic that mimics the look of a student's printing on a chalkboard or paper.\",\n\t\"Schroffer Mono\": \"Schroffer Mono is a minimalist, monospaced display font constructed entirely from a grid of uniform dots. It conveys a retro-digital or industrial aesthetic, reminiscent of early computer displays or perforated tape.\",\n\t\"Science Gothic\": \"Science Gothic is a bold, wide sans-serif display font with a futuristic, industrial aesthetic. It features squared-off letterforms with subtly rounded corners, giving it a clean, high-tech, and authoritative appearance.\",\n\t\"Scope One\": \"Scope One is a clean, slab-serif display font with a modern and professional feel, featuring thin, uniform strokes and distinct, flat serifs. Its wide proportions and open counters give it a balanced, approachable look suitable for headlines and branding.\",\n\t\"Seaweed Script\": \"Seaweed Script is a casual, handwritten display font with a beachy, rustic feel, featuring rough, textured edges that mimic a brush or felt-tip pen. Its slanted, cursive letterforms and irregular strokes create a relaxed, organic mood suitable for informal designs.\",\n\t\"Secular One\": \"Secular One is a bold, humanist sans-serif font with a stable and clean appearance, featuring wide proportions and slightly squared curves. Its heavy weight and open apertures give it a modern, authoritative feel that is highly legible for display purposes.\",\n\t\"Sedan\": \"Sedan is a classic, medium-weight serif font with a scholarly and traditional feel, featuring sharp, triangular serifs and a high stroke contrast. Its elegant, slightly condensed letterforms and calligraphic influence make it well-suited for formal editorial and book design.\",\n\t\"Sedan Sc\": \"Sedan SC is a classic, elegant serif font featuring small caps, characterized by its high contrast between thick and thin strokes and sharp, refined serifs that evoke a sophisticated, traditional feel.\",\n\t\"Sedgwick Ave\": \"Sedgwick Ave is a handwritten display font with a casual, urban feel, featuring medium-weight strokes that mimic the look of a felt-tip marker. Its slightly irregular letterforms and rhythmic slant give it an authentic, energetic personality reminiscent of classic graffiti tags.\",\n\t\"Sedgwick Ave Display\": \"Sedgwick Ave Display is a bold, hand-drawn graffiti-style font that captures an urban, energetic mood. It features thick, expressive strokes with irregular letterforms and sharp angles, mimicking the look of marker-based street art.\",\n\t\"Segment\": \"A digital display font that mimics a multi-segment LED or LCD screen, featuring a technical, retro-futuristic aesthetic. Each character is constructed from distinct, angular black bars, creating a modular and mechanical appearance.\",\n\t\"Sekuya\": \"Sekuya is a bold, wide display font with a modern, high-impact feel, featuring sharp, flared terminals and subtle wedge serifs. Its heavy weight and expansive letterforms create a powerful, cinematic aesthetic suitable for branding and titles.\",\n\t\"Sen\": \"Sen is a geometric sans-serif font with a clean, modern aesthetic, featuring a medium weight and balanced proportions. Its open apertures and circular forms give it a friendly yet professional appearance suitable for both display and body text.\",\n\t\"Send Flowers\": \"Send Flowers is an elegant, monolinear script font with a romantic and graceful mood. It features fluid, looping letterforms and delicate flourishes that give it a sophisticated, hand-lettered appearance.\",\n\t\"Sentient\": \"Sentient is a contemporary serif typeface that blends classic proportions with sharp, angular details, creating a sophisticated and intellectual mood. It features high stroke contrast and distinctive, wedge-shaped serifs that give it a crisp, modern edge.\",\n\t\"Server Mono\": \"Server Mono is a clean, monospaced sans-serif font with a medium weight and a utilitarian, technical aesthetic. It features uniform character widths and open apertures, giving it a modern, legible look suitable for coding and terminal environments.\",\n\t\"Sevillana\": \"Sevillana is a decorative, feminine script font with a playful and rhythmic feel, characterized by its high-contrast strokes and elegant, swirling flourishes. Its upright, handwritten style features unique circular terminals and looped ascenders that evoke a sense of folk art and festive celebration.\",\n\t\"Seymour One\": \"Seymour One is a heavy, ultra-bold display sans-serif with a playful and slightly irregular feel. Its wide proportions and organic, hand-drawn quality give it a friendly, high-impact presence suitable for headlines.\",\n\t\"Shadows Into Light\": \"A clean, casual handwriting font with a light-to-medium weight and a personal, friendly feel. It features rounded edges and slightly irregular letterforms that give it an authentic, hand-drawn appearance.\",\n\t\"Shadows Into Light Two\": \"A clean, casual handwriting font with a light-to-medium weight and rounded edges that give it a friendly, personal feel. Its tall x-height and neat, upright letterforms make it highly legible while maintaining a whimsical, hand-drawn aesthetic.\",\n\t\"Shafarik\": \"Shafarik is a classic serif font with a medium weight, featuring elegant, calligraphic-inspired curves and sharp, triangular serifs that evoke a sense of historical sophistication. Its high contrast and distinctive terminals give it a refined, scholarly mood suitable for editorial or literary contexts.\",\n\t\"Shalimar\": \"Shalimar is an elegant, calligraphic script font featuring fluid, expressive strokes and a sophisticated, hand-written feel. Its high-contrast lines and sweeping flourishes create a romantic and artistic mood, perfect for formal invitations or decorative branding.\",\n\t\"Shantell Sans\": \"Shantell Sans is a friendly, marker-style handwriting font with a playful and informal mood. It features rounded terminals, organic stroke variations, and a casual, hand-drawn aesthetic that feels personal and approachable.\",\n\t\"Shanti\": \"Shanti is a clean, humanist sans-serif font with a medium weight and a friendly, approachable mood. It features subtle calligraphic influences, seen in the slight variations in stroke thickness and the gentle curves of the letterforms.\",\n\t\"Share\": \"This is a bold, sans-serif display font with a modern, slightly tech-oriented feel, featuring unique squared-off curves and a tall x-height. Its distinctive, semi-geometric letterforms give it a clean yet approachable character suitable for digital interfaces.\",\n\t\"Share Tech\": \"Share Tech is a clean, modern sans-serif font with a distinct technological feel, featuring squared-off curves and a medium weight. Its condensed proportions and geometric structure give it a precise, digital aesthetic suitable for screen-based interfaces.\",\n\t\"Share Tech Mono\": \"Share Tech Mono is a clean, monospaced sans-serif font with a distinct futuristic and technological feel. It features squared-off curves and uniform stroke weights, making it ideal for coding environments or digital-themed designs.\",\n\t\"Sharpie\": \"This is a bold, italicized display font with a hand-drawn, angular aesthetic that mimics the look of a felt-tip marker. Its jagged edges and irregular stroke widths create a dynamic, energetic, and informal mood.\",\n\t\"Shippori Antique\": \"Shippori Antique is a clean, medium-weight sans-serif font with a classic and balanced feel. It features open apertures and a high x-height, making it highly legible and suitable for both body text and display use.\",\n\t\"Shippori Antique B1\": \"Shippori Antique B1 is a clean, medium-weight sans-serif font with a classic and balanced feel. It features rounded terminals and open counters, giving it a friendly yet professional appearance suitable for body text and headings.\",\n\t\"Shippori Mincho\": \"Shippori Mincho is a classic, elegant serif font with a high-contrast stroke weight and a refined, traditional feel. It features sharp, triangular serifs and graceful curves, making it ideal for sophisticated and legible long-form text.\",\n\t\"Shippori Mincho B1\": \"Shippori Mincho B1 is a classic, elegant serif font with a medium weight and a traditional, literary feel. It features high-contrast strokes and delicate, rounded terminals that evoke the aesthetic of vintage Japanese book printing.\",\n\t\"Shizuru\": \"Shizuru is a playful, hand-drawn display font featuring hollow, outlined letterforms with a charmingly irregular, wobbly stroke. Its casual, organic feel and rounded terminals give it a friendly and whimsical personality.\",\n\t\"Shojumaru\": \"Shojumaru is a bold, decorative display font inspired by traditional Japanese calligraphy, featuring sharp, flared terminals and a heavy, rhythmic weight. Its dramatic, blocky strokes create a powerful and culturally evocative aesthetic suitable for posters and thematic branding.\",\n\t\"Short Stack\": \"Short Stack is a playful, handwritten sans-serif font with a casual and friendly mood. It features rounded stroke endings and slightly irregular, monolinear letterforms that mimic natural printing.\",\n\t\"Shrikhand\": \"Shrikhand is a bold, vibrant display font with a retro, hand-lettered feel, featuring thick, fluid strokes and a slight italic slant. Its rounded terminals and expressive curves give it a playful, energetic, and friendly personality.\",\n\t\"Side A Inflated\": \"This is a retro-style pixelated serif font with a medium weight, featuring blocky, stair-stepped edges that evoke a nostalgic, 8-bit digital aesthetic. Its classic letterforms combined with the low-resolution rendering create a charmingly lo-fi and tech-inspired mood.\",\n\t\"Sigmar\": \"Sigmar is a heavy, ultra-bold display font with a playful, hand-drawn feel characterized by irregular, rough edges and a chunky, comic-book aesthetic. Its thick strokes and tight spacing create a high-impact, energetic look suitable for headlines and informal branding.\",\n\t\"Sigmar One\": \"Sigmar One is a heavy, ultra-bold display font with a playful, comic-book aesthetic. It features irregular, hand-drawn edges and chunky letterforms that give it a high-impact, energetic, and informal personality.\",\n\t\"Signika\": \"Signika is a clean, sans-serif typeface with a friendly and modern feel, characterized by its gentle curves and low-contrast strokes. It features subtle, rounded terminals and a high x-height, making it highly legible for signage and informational displays.\",\n\t\"Signika Negative\": \"Signika Negative is a clean, sans-serif typeface with a friendly and modern feel, characterized by its gentle curves and low contrast. It features rounded terminals and a high x-height, making it highly legible and well-suited for signage and informational displays.\",\n\t\"Silkscreen\": \"Silkscreen is a minimalist pixel or bitmap display font with a retro, 8-bit aesthetic. It features blocky, monospaced letterforms designed for maximum legibility at very small sizes, evoking a nostalgic tech and gaming mood.\",\n\t\"Simonetta\": \"Simonetta is an elegant, humanist serif font with a calligraphic feel, featuring gentle curves and a slight tilt that evokes a classic, sophisticated mood. Its unique, organic terminals and varying stroke weights give it a lyrical, hand-drawn quality suitable for decorative or editorial use.\",\n\t\"Single Day\": \"Single Day is a playful, handwritten display font featuring thick, rounded strokes and an irregular, casual charm. Its organic, marker-like quality gives it a friendly and informal mood, perfect for creative or child-oriented designs.\",\n\t\"Sinistre\": \"Sinistre is a sharp, high-contrast display serif font with a dark, elegant, and slightly gothic mood. It features dramatic, pointed terminals and elongated, blade-like strokes that give it a sophisticated yet menacing aesthetic.\",\n\t\"Sintony\": \"Sintony is a clean, modern sans-serif typeface with a balanced weight and a professional, approachable mood. It features open apertures and subtle geometric influences, making it highly legible for both display and body text.\",\n\t\"Sirin Stencil\": \"Sirin Stencil is a calligraphic display font featuring fluid, brush-like strokes and a distinct stencil-cut design. Its elegant, organic curves and medium weight create a sophisticated yet industrial mood, blending traditional penmanship with modern utility.\",\n\t\"Sirivennela\": \"Sirivennela is an elegant, high-contrast calligraphic script font with a sophisticated and classic feel. It features graceful, flowing curves, a distinct italic slant, and delicate hairlines paired with bold downstrokes.\",\n\t\"Six Caps\": \"Six Caps is a highly condensed, narrow sans-serif display font with a bold, impactful presence. Its elongated letterforms and tight spacing create a modern, minimalist aesthetic ideal for headlines and vertical compositions.\",\n\t\"Sixtyfour\": \"Sixtyfour is a retro-futuristic display font composed of horizontal, rounded bars that create a pixelated, scanline effect. Its heavy weight and digital aesthetic evoke a nostalgic, 8-bit computer or early video game mood.\",\n\t\"Sixtyfour Convergence\": \"Sixtyfour Convergence is a retro-futuristic display font characterized by its unique construction of horizontal, rounded-end bars that create a scanline or digital screen effect. Its wide, monospaced appearance evokes a nostalgic, tech-heavy aesthetic reminiscent of early computer graphics and low-resolution displays.\",\n\t\"Skranji\": \"Skranji is a bold, decorative display font with a rugged, hand-carved aesthetic and irregular, blocky edges. Its chunky letterforms and primitive style evoke a sense of adventure, fantasy, or ancient mythology.\",\n\t\"Slabo 13px\": \"Slabo 13px is a modern slab serif font featuring a balanced, medium weight and a clean, professional appearance. It is characterized by its blocky, rectangular serifs and open letterforms, making it highly legible for digital body text.\",\n\t\"Slabo 27px\": \"Slabo 27px is a modern slab-serif font featuring blocky, rectangular serifs and a balanced weight that provides a clean, professional appearance. Its tall x-height and open letterforms make it highly legible and well-suited for digital editorial content.\",\n\t\"Slackey\": \"Slackey is a bold, chunky display font with a playful and informal mood, featuring irregular, hand-drawn letterforms and a heavy weight. Its quirky, slightly off-kilter baseline and blocky construction give it a fun, energetic, and casual aesthetic.\",\n\t\"Slackside One\": \"Slackside One is a casual, hand-drawn display font with a brush-like texture and irregular, organic strokes. Its playful and relaxed mood is characterized by varying letter heights and a slightly slanted, informal appearance.\",\n\t\"Smokum\": \"Smokum is a bold, Western-style slab serif display font with a rugged, vintage feel. It features high-contrast strokes, heavy blocky serifs, and a distinct \\\"Wild West\\\" aesthetic that makes it ideal for headlines and thematic branding.\",\n\t\"Smooch\": \"Smooch is a bold, expressive brush script font with a hand-painted feel, featuring energetic, textured strokes and a casual, romantic mood. Its fluid, slanted letterforms and dry-brush edges give it a dynamic and artistic appearance.\",\n\t\"Smooch Sans\": \"Smooch Sans is a modern, condensed sans-serif font with a tall x-height and rounded terminals that give it a friendly, approachable feel. Its narrow proportions and clean lines create a sleek, contemporary aesthetic suitable for display and branding.\",\n\t\"Smythe\": \"Smythe is a decorative display font with a vintage, hand-carved feel, featuring irregular, jagged edges and sharp, angular serifs. Its tall, condensed letterforms and calligraphic influence evoke a sense of mystery and old-world craftsmanship.\",\n\t\"Sn Pro\": \"SN Pro is a clean, geometric sans-serif font with a modern and friendly aesthetic, featuring rounded stroke endings and a balanced, light-to-medium weight. Its open counters and uniform line thickness give it a minimalist, approachable feel suitable for contemporary digital interfaces.\",\n\t\"Sneaky\": \"A high-contrast serif font with a classic yet slightly playful feel, featuring sharp, triangular serifs and elegant, sweeping curves in the lowercase letters.\",\n\t\"Sniglet\": \"Sniglet is a playful, rounded display font with a friendly and informal mood. It features soft, pill-like terminals and a hand-drawn quality that makes it ideal for children's content or casual designs.\",\n\t\"Snippet\": \"Snippet is a casual, monolinear sans-serif font with a playful, hand-drawn feel, featuring irregular stroke widths and slightly wobbly curves. Its informal style and rounded terminals give it a friendly, approachable personality suitable for creative and lighthearted designs.\",\n\t\"Snowburst One\": \"Snowburst One is a whimsical, low-contrast display font with a hand-drawn feel, featuring irregular stroke widths and playful, spiky serifs that evoke a wintry, crystalline aesthetic. Its light weight and organic, slightly uneven letterforms create a charming and decorative mood.\",\n\t\"Sofadi One\": \"Sofadi One is a friendly, casual display font featuring a slight italic slant and rounded, hand-drawn terminals. Its medium weight and organic, flowing curves give it a warm, approachable, and modern personality.\",\n\t\"Sofia\": \"Sofia is an upright script font with a playful and friendly mood, featuring rounded terminals, high-waisted loops, and a distinct upright posture that gives it a modern, casual elegance.\",\n\t\"Sofia Sans\": \"Sofia Sans is a contemporary, geometric sans-serif font with a clean and friendly appearance, featuring open apertures and a balanced weight that ensures high legibility. Its modern, professional aesthetic is characterized by subtle rounded terminals and a tall x-height, making it versatile for both digital and print media.\",\n\t\"Sofia Sans Condensed\": \"A modern, geometric sans-serif font with a narrow, condensed width and a clean, technical feel. It features uniform stroke weights and open apertures, making it highly legible and efficient for space-constrained designs.\",\n\t\"Sofia Sans Extra Condensed\": \"A modern, geometric sans-serif font with an extremely narrow, extra-condensed width and uniform stroke weight. Its tall, vertical structure creates a clean, space-efficient aesthetic suitable for headlines and technical displays.\",\n\t\"Sofia Sans Semi Condensed\": \"A clean, modern sans-serif font with a semi-condensed width and medium weight, featuring open apertures and a neutral, professional aesthetic.\",\n\t\"Solitreo\": \"Solitreo is a casual, handwritten script font with a medium weight and a slight italic slant, conveying a personal and informal mood. It features fluid, rounded strokes and organic letterforms that mimic natural penmanship.\",\n\t\"Solway\": \"Solway is a friendly slab-serif font featuring rounded terminals and a medium weight that creates a warm, approachable mood. Its design balances classic structure with modern softness, making it highly legible and inviting.\",\n\t\"Sometype Mono\": \"Sometype Mono is a clean, monospaced sans-serif font with a modern and technical feel, featuring a regular weight and distinct, open letterforms. Its balanced proportions and sharp terminals give it a professional yet approachable aesthetic suitable for coding and UI design.\",\n\t\"Song Myung\": \"Song Myung is a classic serif font with a medium weight that features sharp, prominent serifs and a high-contrast stroke width. Its elegant and traditional appearance is characterized by slightly flared terminals and a formal, calligraphic influence.\",\n\t\"Sono\": \"Sono is a soft, monospaced-style sans-serif font featuring rounded terminals and a friendly, approachable mood. Its consistent stroke weight and open counters give it a clean, modern look suitable for both coding and casual display use.\",\n\t\"Sonsie One\": \"Sonsie One is a bold, decorative display font with a playful and hand-lettered feel, featuring heavy strokes and distinctive, fluid curves. Its jaunty, irregular baseline and expressive swashes give it a friendly, vintage-inspired personality.\",\n\t\"Sora\": \"Sora is a modern, geometric sans-serif typeface featuring a large x-height and wide proportions that give it a clean, industrial, and highly legible appearance. Its bold weight and open counters create a confident and tech-forward mood suitable for digital interfaces.\",\n\t\"Soria\": \"Soria is an Art Nouveau-inspired display serif font featuring high contrast, elegant curves, and distinctive bulbous terminals. It conveys a sophisticated, vintage, and slightly whimsical mood through its organic shapes and decorative flourishes.\",\n\t\"Sorts Mill Goudy\": \"Sorts Mill Goudy is a classic, old-style serif font with a light-to-medium weight and an elegant, literary feel. It features distinctive characteristics like the diamond-shaped dots on the 'i' and 'j', and a high-waisted 'G', giving it a timeless and scholarly appearance.\",\n\t\"Sour Gummy\": \"Sour Gummy is a playful, handwritten display font featuring rounded terminals and a casual, organic feel. Its irregular stroke widths and soft, bubbly shapes evoke a friendly and youthful mood.\",\n\t\"Source Code Pro\": \"Source Code Pro is a clean, monospaced sans-serif font designed for legibility in coding environments, featuring a professional and modern aesthetic. Its uniform stroke weight and generous character spacing create a balanced, highly readable look suitable for technical applications.\",\n\t\"Source Sans 3\": \"Source Sans 3 is a clean, professional sans-serif typeface with a modern and highly legible design. It features a balanced weight and open letterforms, making it ideal for both user interfaces and long-form digital text.\",\n\t\"Source Sans Pro\": \"Source Sans Pro is a clean, professional sans-serif typeface with a balanced weight and a modern, approachable feel. It features open letterforms and a high x-height, making it highly legible for both user interfaces and long-form text.\",\n\t\"Source Serif 4\": \"Source Serif 4 is a transitional serif typeface that balances classic elegance with modern readability, featuring a medium weight and clean, sharp serifs. Its open counters and balanced proportions create a professional yet approachable mood suitable for long-form reading.\",\n\t\"Source Serif Pro\": \"Source Serif Pro is a transitional serif typeface with a clean, professional, and highly legible design. It features moderate contrast, sturdy serifs, and a balanced weight that gives it a modern yet classic feel suitable for long-form reading.\",\n\t\"Space Grotesk\": \"Space Grotesk is a modern, proportional sans-serif font that retains the quirky, geometric characteristics of its monospaced predecessor. It features a clean, technical aesthetic with wide apertures and distinct letterforms, making it both highly legible and visually striking for display use.\",\n\t\"Space Mono\": \"Space Mono is a geometric, monospaced sans-serif font that combines a technical, retro-futuristic aesthetic with clean, modern lines. It features distinct, wide letterforms and a medium weight that evokes the look of 1960s science fiction and early computer programming.\",\n\t\"Special Elite\": \"Special Elite is a vintage typewriter-style slab serif font with a distressed, grungy texture that mimics the look of ink on paper. It conveys a nostalgic, analog, and slightly gritty mood through its irregular edges and classic mechanical letterforms.\",\n\t\"Special Gothic\": \"A clean, geometric sans-serif font with a medium weight and a modern, professional feel. It features open apertures and uniform stroke widths, giving it a balanced and highly legible appearance.\",\n\t\"Special Gothic Condensed One\": \"A bold, condensed sans-serif font with a clean, industrial aesthetic and high-impact presence. Its narrow letterforms and uniform stroke weight create a modern, authoritative look suitable for headlines and signage.\",\n\t\"Special Gothic Expanded One\": \"This is a bold, expanded sans-serif font with a modern and authoritative feel. It features wide letterforms and clean, geometric lines that provide excellent legibility and a strong visual presence.\",\n\t\"Spectral\": \"Spectral is an elegant, screen-first serif font featuring sharp, triangular serifs and a medium weight that balances classic sophistication with modern readability. Its tall x-height and refined stroke contrast give it a professional yet graceful appearance suitable for long-form reading.\",\n\t\"Spectral Sc\": \"Spectral SC is an elegant, medium-weight serif font with a classic and scholarly feel, featuring sharp, triangular serifs and a small caps design. Its refined proportions and clear letterforms make it ideal for sophisticated editorial and screen-based reading.\",\n\t\"Spicy Rice\": \"Spicy Rice is a bold, festive display font with a playful, retro-inspired feel, featuring heavy, irregular strokes and whimsical, flared terminals. Its chunky, hand-drawn aesthetic gives it a lively and informal personality, perfect for eye-catching headlines.\",\n\t\"Spinnaker\": \"Spinnaker is a clean, low-contrast sans-serif font with a modern and approachable feel, inspired by French travel signage. It features wide proportions, open apertures, and slightly rounded terminals that give it a friendly yet professional appearance.\",\n\t\"Spirax\": \"Spirax is a whimsical display font characterized by its elegant, spiraling swashes and high-contrast strokes that evoke a sense of mystery and storytelling. Its unique blend of classic serif structures with playful, curly terminals gives it a charming and slightly gothic personality.\",\n\t\"Splash\": \"This is a dynamic, expressive script font with a raw, hand-painted aesthetic, featuring heavy ink splatters and a gritty, textured finish. Its energetic, slanted letterforms and irregular edges create a bold, rebellious, and artistic mood.\",\n\t\"Spline Sans\": \"Spline Sans is a clean, modern neo-grotesque sans-serif font with a medium weight and a professional, balanced feel. It features open apertures and a high x-height, making it highly legible and well-suited for UI and digital interfaces.\",\n\t\"Spline Sans Mono\": \"Spline Sans Mono is a clean, modern monospaced font featuring a medium weight and a geometric, technical aesthetic. Its design is characterized by open apertures and distinct, legible letterforms, making it ideal for coding and user interface design.\",\n\t\"Sprat\": \"Sprat is a high-contrast, elegant serif font with a modern, sophisticated feel, featuring sharp, wedge-like serifs and elongated terminals. Its light weight and dramatic stroke variations give it a refined, editorial aesthetic suitable for luxury branding.\",\n\t\"Squada One\": \"Squada One is a bold, condensed sans-serif display font with a strong, geometric feel and slightly rounded corners. Its tall, narrow letterforms and thick strokes create a modern, athletic, and impactful aesthetic suitable for headlines and branding.\",\n\t\"Square Peg\": \"Square Peg is a casual, handwritten script font with a medium weight and a fluid, organic feel. It features expressive, slightly irregular letterforms and elongated descenders that create a personal and informal mood.\",\n\t\"Sree Krushnadevaraya\": \"Sree Krushnadevaraya is a classic serif font with a medium weight that conveys a formal and traditional mood. It features sharp, prominent serifs and a high contrast between thick and thin strokes, making it well-suited for elegant editorial or body text.\",\n\t\"Sriracha\": \"Sriracha is a casual, handwritten-style display font with a medium weight and a friendly, informal mood. It features rounded terminals, a slight italic slant, and organic, brush-like strokes that give it a natural and approachable feel.\",\n\t\"Srisakdi\": \"Srisakdi is an elegant, decorative script font featuring fluid, calligraphic strokes with sharp, thorn-like terminals. Its playful yet sophisticated mood is defined by high-contrast lines and ornate, swirling flourishes that give it a distinct, handcrafted feel.\",\n\t\"St Martin\": \"St. Martin is a bold, modern sans-serif display font characterized by unique, sharp decorative notches and spurs on the stems. Its high-contrast geometric structure and clean lines create a sophisticated yet edgy aesthetic.\",\n\t\"Staatliches\": \"Staatliches is a clean, condensed sans-serif display font with a bold weight and a strong, industrial feel. Its geometric construction and uniform stroke widths evoke a modern, authoritative aesthetic inspired by mid-century design.\",\n\t\"Stack Sans Headline\": \"A clean, geometric sans-serif typeface with a medium weight and a modern, professional feel. It features open apertures and uniform stroke widths, making it highly legible for headlines and display use.\",\n\t\"Stack Sans Notch\": \"A clean, medium-weight sans-serif font with a modern, geometric feel, characterized by distinctive rectangular 'notches' or gaps where strokes meet, such as in the 'a', 'n', and 'h'.\",\n\t\"Stack Sans Text\": \"A clean, geometric sans-serif typeface with a medium weight and a modern, professional feel. It features open apertures and balanced proportions, making it highly legible for body text and UI applications.\",\n\t\"Stalemate\": \"Stalemate is a vintage-inspired script font with a light, hand-drawn feel, featuring elegant flourishes and a whimsical, personal mood. Its thin, expressive strokes and unique letterforms, like the stylized 'S' and 'e', give it a sophisticated yet approachable aesthetic.\",\n\t\"Stalinist One\": \"Stalinist One is an ultra-bold, wide display font with a rigid, industrial aesthetic characterized by its blocky, geometric construction and sharp, angular terminals. Its heavy weight and constructivist-inspired design evoke a sense of strength, authority, and retro-futurism.\",\n\t\"Stardom\": \"Stardom is an elegant, high-contrast serif display font that exudes a sophisticated and modern fashion-forward mood. It features dramatic transitions between thick and thin strokes, sharp triangular serifs, and unique stencil-like gaps that give it a refined, editorial aesthetic.\",\n\t\"Stardos Stencil\": \"Stardos Stencil is a classic serif stencil typeface that combines a traditional, high-contrast aesthetic with industrial, utilitarian cutouts. Its bold weight and military-inspired gaps evoke a sense of vintage authority and ruggedness.\",\n\t\"Stick\": \"Stick is a playful, geometric display font characterized by its blocky, angular construction and irregular, hand-cut aesthetic. Its thick, uniform strokes and sharp corners give it a bold, modern look reminiscent of paper cutouts or digital pixel art.\",\n\t\"Stick No Bills\": \"Stick No Bills is a bold, sans-serif stencil font with a clean, industrial aesthetic. Its geometric letterforms feature distinct gaps and sharp terminals, evoking a modern, utilitarian mood reminiscent of street signage and urban environments.\",\n\t\"Stint Ultra Condensed\": \"Stint Ultra Condensed is a high-contrast, slab-serif display font featuring extremely narrow letterforms and a tall x-height. Its rigid, vertical structure and flat serifs create a formal, authoritative mood suitable for space-constrained headlines.\",\n\t\"Stint Ultra Expanded\": \"Stint Ultra Expanded is a wide, slab-serif display font with a monolinear stroke weight and a clean, technical feel. Its extremely horizontal proportions and flat serifs give it a modern, architectural appearance suitable for headlines and branding.\",\n\t\"Stix Two Text\": \"STIX Two Text is a classic, scholarly serif font with a formal and authoritative mood, featuring sharp serifs and high-contrast strokes that ensure excellent legibility for academic and technical publishing.\",\n\t\"Stoke\": \"Stoke is a semi-serif display font with a high-contrast, elegant feel, featuring slender strokes and distinctive, elongated serifs that give it a classic yet slightly whimsical appearance. Its tall x-height and unique letterforms, like the hooked 't' and 'k', create a sophisticated and legible aesthetic suitable for headlines.\",\n\t\"Story Script\": \"Story Script is a bold, italicized brush script font with a friendly and informal feel. It features fluid, hand-drawn strokes with varying thicknesses and rounded terminals, giving it a dynamic and approachable appearance.\",\n\t\"Strait\": \"Strait is a modern, minimalist sans-serif font with a clean and slightly industrial feel. It features unique, subtle angular cuts on the ascenders and terminals, giving it a distinct, tech-oriented personality.\",\n\t\"Striper\": \"Striper is a bold, playful display font characterized by its heavy sans-serif letterforms filled with high-contrast black and white horizontal and radial stripes. Its eclectic, optical-art style creates a vibrant, energetic mood suitable for creative and experimental designs.\",\n\t\"Style Script\": \"Style Script is an upright, retro-inspired script font with a casual yet elegant feel, featuring fluid, connected strokes and a medium weight. Its playful loops and vintage aesthetic evoke the look of mid-century advertising and hand-lettered signage.\",\n\t\"Stylish\": \"This is a playful, hand-drawn display font with a medium weight and organic, irregular outlines. Its rounded terminals and slightly wobbly strokes give it a friendly, informal, and artisanal feel.\",\n\t\"Styro\": \"Styro is an ultra-bold, condensed display font with a playful, modular feel, featuring thick vertical strokes and rounded terminals that mimic the look of cut foam or stencil art. Its tight spacing and abstract, geometric letterforms create a modern, high-impact aesthetic suitable for experimental branding.\",\n\t\"Sue Ellen Francisco\": \"Sue Ellen Francisco is a tall, slender handwriting font with a casual and personal feel. It features irregular, hand-drawn strokes and a playful, organic mood that mimics natural printing.\",\n\t\"Suez One\": \"Suez One is a heavy, blocky display serif font with a rugged, hand-carved feel and high-contrast strokes. Its chunky, angular serifs and organic outlines give it a bold, historic, and slightly playful personality.\",\n\t\"Sulphur Point\": \"Sulphur Point is a clean, geometric sans-serif font with a modern and minimalist feel, characterized by its uniform line weight and open, circular letterforms. Its tall x-height and subtle rounded terminals give it a friendly yet professional appearance suitable for both display and body text.\",\n\t\"Sumana\": \"Sumana is a classic serif font with a balanced weight and a scholarly, traditional feel. It features sharp, bracketed serifs and high-contrast strokes that provide excellent legibility for long-form text.\",\n\t\"Sunflower\": \"A clean, modern sans-serif font with a medium weight and a friendly, approachable mood. It features rounded terminals and open apertures, giving it a soft yet professional appearance.\",\n\t\"Sunshiney\": \"Sunshiney is a playful, hand-drawn display font featuring a medium weight and a whimsical, casual mood. Its irregular, textured edges and curly flourishes on letters like 'S' and 'y' give it a charming, personal feel.\",\n\t\"Supermercado One\": \"Supermercado One is a low-contrast, semi-geometric display font with a playful, retro-modern feel. It features unique, rounded letterforms and unexpected details, such as the distinctive open 'O' and 'S', giving it a friendly and creative personality.\",\n\t\"Supreme\": \"A clean, geometric sans-serif font with a medium weight and a modern, minimalist aesthetic. It features high-contrast circular curves and straight terminals, conveying a sense of clarity and contemporary sophistication.\",\n\t\"Sura\": \"Sura is a bold, high-contrast serif font with a classic yet slightly rustic feel, featuring distinctive chiseled edges and sharp, angular terminals. Its sturdy construction and calligraphic influence give it a formal, authoritative presence with a touch of hand-crafted character.\",\n\t\"Suranna\": \"Suranna is a classic serif font with a high-contrast stroke weight that exudes elegance and formality. It features sharp, flat serifs and rounded terminals, making it well-suited for sophisticated editorial or headline use.\",\n\t\"Suravaram\": \"Suravaram is a classic serif font with a medium weight and a formal, scholarly mood. It features elegant, slightly curved terminals and a high-contrast stroke width that gives it a traditional, calligraphic feel.\",\n\t\"Suse\": \"A clean, geometric sans-serif font with a modern and technical feel, featuring uniform stroke weights and distinctively squared-off curves in letters like 'U' and 'E'.\",\n\t\"Suse Mono\": \"A clean, monospaced sans-serif font with a modern and technical feel, featuring uniform stroke weights and distinct, open letterforms for high legibility.\",\n\t\"Suwannaphum\": \"Suwannaphum is a classic serif typeface with a medium weight and a formal, traditional feel. It features sharp, prominent slab-like serifs and a high x-height, making it highly legible for body text and academic contexts.\",\n\t\"Swanky And Moo Moo\": \"Swanky and Moo Moo is a casual, handwritten display font with a playful and whimsical mood. It features irregular, slightly shaky strokes and a medium weight that gives it an authentic, hand-drawn appearance.\",\n\t\"Switzer\": \"Switzer is a clean, neo-grotesque sans-serif font with a medium weight that exudes a modern and professional mood. It features high legibility, balanced proportions, and sharp terminals, making it ideal for both digital and print interfaces.\",\n\t\"Syncopate\": \"Syncopate is a modern, wide-set sans-serif display font with a light weight and a clean, futuristic feel. It features unique, unconventional letterforms and generous tracking that give it a sophisticated and airy appearance.\",\n\t\"Syne\": \"Syne is a modern geometric sans-serif font with a bold, experimental character, featuring unique structural details like the sharp, diagonal descender on the 'y' and a wide, open feel. It conveys a contemporary and artistic mood, making it ideal for distinctive branding and display use.\",\n\t\"Syne Mono\": \"Syne Mono is a distinctive monospaced display font featuring a hand-drawn, organic feel with irregular, angular strokes and a playful, avant-garde mood. Its medium weight and unique, slightly distorted letterforms give it a modern, artistic character that stands out from traditional coding fonts.\",\n\t\"Syne Tactile\": \"Syne Tactile is a bold, expressive display font with a hand-drawn, calligraphic feel, featuring irregular strokes and sharp, angular terminals. Its raw, energetic aesthetic gives it a modern, edgy, and highly tactile personality.\",\n\t\"Synonym\": \"A clean, geometric sans-serif font with a modern and professional feel, featuring uniform line weight and open apertures. Its balanced proportions and minimalist design make it highly legible and versatile for contemporary branding.\",\n\t\"Tabular\": \"A clean, monospaced slab-serif font with a technical and utilitarian feel, featuring uniform stroke weights and prominent, flat serifs. Its structured, geometric design conveys a sense of precision and modern industrial clarity.\",\n\t\"Tac One\": \"Tac One is a bold, high-contrast display font with a modern, geometric feel, featuring sharp, angular terminals and unique, pointed counters that give it a dynamic and aggressive appearance.\",\n\t\"Tachyo\": \"Tachyo is a bold, italicized display font composed entirely of uniform dots, creating a retro-digital or scoreboard-inspired aesthetic. Its slanted, pixelated structure conveys a sense of speed and technological movement.\",\n\t\"Tagesschrift\": \"This is a bold, serif display font with a vintage, weathered aesthetic characterized by irregular, ink-bleed edges. It evokes a classic, historical feel reminiscent of old newspaper mastheads or traditional letterpress printing.\",\n\t\"Tai Heritage Pro\": \"Tai Heritage Pro is a classic serif typeface with a traditional, scholarly feel, featuring high stroke contrast and sharp, bracketed serifs. Its elegant, formal appearance is characterized by tall x-heights and refined terminals, making it well-suited for academic or historical contexts.\",\n\t\"Tajawal\": \"Tajawal is a clean, low-contrast sans-serif font with a modern and professional feel, featuring geometric shapes and open apertures. Its balanced proportions and neutral tone make it highly legible for both display and body text.\",\n\t\"Tangerine\": \"Tangerine is an elegant, calligraphic script font inspired by 16th and 17th-century chancery hands, featuring a tall x-height and graceful, sweeping flourishes. Its light weight and slanted, fluid strokes evoke a classic, sophisticated, and romantic mood.\",\n\t\"Tanker\": \"Tanker is a bold, condensed sans-serif display font with a heavy weight and rounded terminals, giving it a modern yet friendly industrial feel. Its thick strokes and tight spacing make it ideal for high-impact headlines and branding.\",\n\t\"Tanklager\": \"This is a bold, condensed sans-serif font with a modern, industrial feel, featuring clean lines and tight spacing that convey strength and efficiency.\",\n\t\"Tapestry\": \"Tapestry is a decorative, calligraphic serif font with a hand-drawn, organic feel, featuring high-contrast strokes and irregular, fluid edges. Its elegant yet rustic aesthetic evokes a sense of historical craftsmanship and artistic flair.\",\n\t\"Taprom\": \"Taprom is a bold, expressive script font with a hand-painted feel, featuring rough, textured edges and a dynamic, organic flow. Its slanted, cursive style conveys a sense of raw energy and informal elegance, making it ideal for artistic or adventurous branding.\",\n\t\"Tasa Explorer\": \"Tasa Explorer is a clean, modern sans-serif typeface with a medium weight and a professional, utilitarian mood. It features open counters and geometric influences, making it highly legible for both display and body text.\",\n\t\"Tasa Explorer Vf\": \"Tasa Explorer VF is a clean, geometric sans-serif font with a modern and professional feel, featuring high-contrast strokes and open apertures for excellent legibility. Its balanced proportions and minimalist design give it a sophisticated, tech-forward aesthetic suitable for both display and body text.\",\n\t\"Tasa Orbiter\": \"Tasa Orbiter is a clean, geometric sans-serif font with a modern and professional feel, featuring medium weight and balanced proportions. Its open apertures and uniform stroke widths give it a high-tech, utilitarian aesthetic suitable for digital interfaces.\",\n\t\"Tasa Orbiter Vf\": \"Tasa Orbiter VF is a clean, geometric sans-serif font with a modern and technical feel, featuring uniform stroke weights and open apertures. Its balanced proportions and minimalist design convey a sense of clarity and futuristic efficiency.\",\n\t\"Tauri\": \"Tauri is a semi-condensed sans-serif typeface with a clean, modern aesthetic and a medium weight. It features subtle, unique details like the slightly curved terminals on the 'a' and 'u', giving it a friendly yet professional character.\",\n\t\"Taviraj\": \"Taviraj is a formal serif typeface with a classic, elegant feel, featuring high stroke contrast and distinct ball terminals. Its wide proportions and sharp serifs give it a sophisticated and authoritative appearance suitable for editorial design.\",\n\t\"Teachers\": \"A clean, geometric sans-serif font with a modern and professional feel, featuring uniform stroke weights and open, circular letterforms. Its high x-height and clear terminals make it highly legible and approachable for educational or corporate contexts.\",\n\t\"Technor\": \"Technor is a modern, geometric sans-serif font with a futuristic, industrial feel, characterized by its unique angular curves and semi-blocked letterforms. Its medium weight and clean, architectural lines give it a high-tech and professional appearance.\",\n\t\"Tecnica\": \"Tecnica is a retro-style dot matrix display font composed of large, circular points arranged on a grid. It evokes a digital, lo-fi aesthetic reminiscent of early computer screens or scoreboard displays.\",\n\t\"Teko\": \"Teko is a bold, condensed sans-serif display font with a modern, industrial feel, featuring square proportions and subtle rounded corners. Its high x-height and narrow letterforms make it ideal for impactful headlines and digital interfaces.\",\n\t\"Tektur\": \"Tektur is a modern, industrial sans-serif display font featuring a rigid, modular construction with distinct 45-degree angled corners. Its square proportions and technical aesthetic evoke a futuristic, high-tech, or architectural mood.\",\n\t\"Telex\": \"Telex is a clean, humanist sans-serif font with a medium weight and a modern, professional feel. It features open apertures and a high x-height, making it highly legible for both digital and print applications.\",\n\t\"Telma\": \"Telma is an elegant, calligraphic script font with a classic and sophisticated mood, featuring high-contrast strokes and fluid, sweeping curves. Its italicized posture and sharp, tapered terminals give it a refined, hand-lettered appearance suitable for formal invitations or branding.\",\n\t\"Tenali Ramakrishna\": \"Tenali Ramakrishna is a tall, elegant serif font with a classic and scholarly feel, featuring high-contrast strokes and sharp, delicate terminals. Its narrow proportions and formal structure make it well-suited for sophisticated editorial or display use.\",\n\t\"Tenor Sans\": \"Tenor Sans is a humanist sans-serif typeface with a sophisticated, classic feel, featuring high-contrast strokes and open apertures that evoke the elegance of traditional serif typography. Its balanced proportions and graceful curves make it well-suited for body text and refined display use.\",\n\t\"Terminal Grotesque\": \"Terminal Grotesque is a pixelated, sans-serif display font that evokes a retro-digital and lo-fi aesthetic. Its blocky, aliased edges and uniform stroke weight give it a technical, computer-terminal feel while maintaining a clean, modern structure.\",\n\t\"Text Me One\": \"Text Me One is a clean, monolinear sans-serif font with a modern, tech-inspired feel, featuring rounded terminals and a tall x-height. Its light weight and open letterforms give it a friendly, legible appearance suitable for digital interfaces.\",\n\t\"Texturina\": \"Texturina is a bold, contemporary serif font that blends calligraphic blackletter influences with modern editorial design, featuring sharp, angular terminals and a high-contrast, rhythmic structure. Its chiseled appearance evokes a medieval yet sophisticated mood, making it ideal for expressive titling and branding.\",\n\t\"Thasadith\": \"Thasadith is a clean, light-weight sans-serif font with a modern and elegant feel, featuring tall x-heights and subtle, rounded terminals that give it a friendly yet professional appearance.\",\n\t\"The Girl Next Door\": \"This is a casual, handwritten script font with a light weight and a youthful, informal mood. It features irregular letter heights and organic, slightly shaky strokes that mimic natural penmanship.\",\n\t\"The Nautigal\": \"The Nautigal is an elegant, fluid script font with a hand-drawn, calligraphic feel, featuring dramatic flourishes and varying stroke weights. Its sweeping curves and informal, breezy aesthetic evoke a sense of sophisticated movement and coastal charm.\",\n\t\"Thestral Neue\": \"Thestral Neue is a bold, high-contrast serif font that exudes a classic yet slightly gothic and mysterious mood. It features sharp, flared serifs and elegant, sweeping curves, making it ideal for dramatic display purposes.\",\n\t\"Tienne\": \"Tienne is a classic serif font with a warm, bookish feel, featuring soft, rounded terminals and a gentle calligraphic influence. Its moderate weight and organic curves give it a friendly yet sophisticated appearance suitable for body text and titles.\",\n\t\"Tiktok Sans\": \"TikTok Sans is a clean, geometric sans-serif typeface with a modern and approachable feel, featuring a medium weight and high legibility. Its design is characterized by open apertures and simplified letterforms, making it optimized for digital readability across various screen sizes.\",\n\t\"Tillana\": \"Tillana is a casual, handwritten display font with a medium weight and a rhythmic, organic feel. It features expressive, slightly angular strokes and flared terminals that give it a lively, artistic, and informal personality.\",\n\t\"Tilt Neon\": \"Tilt Neon is a modern, geometric sans-serif display font featuring rounded terminals and a monolinear stroke weight that mimics the look of neon tube signage. Its clean, playful aesthetic is characterized by open counters and a friendly, approachable feel.\",\n\t\"Tilt Prism\": \"Tilt Prism is a bold, geometric display font featuring a 3D prismatic effect with sharp, chiseled outlines. Its architectural and retro-futuristic style creates a sense of depth and structural elegance, making it ideal for high-impact headlines.\",\n\t\"Tilt Warp\": \"Tilt Warp is a bold, geometric sans-serif display font with a modern, high-impact feel. It features thick, uniform strokes and a subtle horizontal shear that creates a sense of dynamic motion and perspective.\",\n\t\"Timmana\": \"Timmana is a bold, italicized display font with a friendly and informal feel, characterized by its thick strokes and rounded terminals. Its slightly irregular, hand-drawn quality gives it a playful yet sturdy appearance suitable for headlines and casual branding.\",\n\t\"Tinos\": \"Tinos is a classic serif font with a professional and traditional feel, featuring sharp serifs and a balanced weight that ensures high readability. It is designed as a metric-compatible alternative to Times New Roman, offering a familiar, formal aesthetic suitable for body text.\",\n\t\"Tiny5\": \"Tiny5 is a minimalist pixel or bitmap display font with a retro, 8-bit aesthetic, characterized by its blocky, low-resolution structure. Its ultra-simplified letterforms evoke a nostalgic, digital mood suitable for vintage gaming or tech-inspired designs.\",\n\t\"Tiro Bangla\": \"Tiro Bangla is a classic serif typeface with a formal and scholarly mood, featuring high stroke contrast and elegant, traditional proportions. Its design includes sharp, triangular serifs and rounded terminals, making it well-suited for sophisticated editorial and literary contexts.\",\n\t\"Tiro Devanagari Hindi\": \"Tiro Devanagari Hindi is a classic serif typeface with a formal and scholarly mood, featuring high-contrast strokes and traditional proportions. Its elegant, sharp serifs and balanced weight make it highly legible for academic and literary publishing.\",\n\t\"Tiro Devanagari Marathi\": \"A classic serif font with a traditional, scholarly feel, featuring moderate stroke contrast and sharp, elegant serifs. Its balanced proportions and clear letterforms make it highly legible and suitable for formal text.\",\n\t\"Tiro Devanagari Sanskrit\": \"Tiro Devanagari Sanskrit is a classic serif typeface with a formal and scholarly mood, featuring moderate stroke contrast and traditional proportions. Its elegant, well-defined serifs and clear letterforms make it highly legible for academic and literary texts.\",\n\t\"Tiro Gurmukhi\": \"Tiro Gurmukhi is a classic serif typeface featuring elegant, high-contrast strokes and sharp, traditional serifs. Its sophisticated and formal appearance makes it well-suited for academic or literary contexts.\",\n\t\"Tiro Kannada\": \"Tiro Kannada is a classic serif typeface with a formal and scholarly mood, featuring high-contrast strokes and sharp, elegant serifs. Its traditional proportions and refined details make it well-suited for academic and literary publishing.\",\n\t\"Tiro Tamil\": \"Tiro Tamil is a classic serif typeface with a formal and scholarly feel, featuring high stroke contrast and elegant, traditional proportions. Its design includes sharp, bracketed serifs and distinctive ball terminals, making it well-suited for sophisticated editorial and literary contexts.\",\n\t\"Tiro Telugu\": \"Tiro Telugu is a classic serif font with a formal and scholarly mood, featuring high-contrast strokes and sharp, traditional serifs. Its elegant, balanced proportions make it highly legible and suitable for sophisticated editorial or academic contexts.\",\n\t\"Tirra\": \"Tirra is a clean, modern sans-serif font with a medium weight and a sophisticated, minimalist mood. It features unique, sharp terminal cuts on the 'r' and a perfectly circular tittle on the 'i', giving it a distinct contemporary character.\",\n\t\"Titan One\": \"Titan One is a bold, heavy-weight display sans-serif with a playful and friendly personality. It features thick, rounded strokes and slightly irregular, bubbly letterforms that give it a cheerful, high-impact look.\",\n\t\"Titillium Web\": \"Titillium Web is a modern, geometric sans-serif typeface with a clean, industrial feel, characterized by its square-shaped curves and high legibility. Its structured, technical appearance makes it well-suited for digital interfaces and contemporary branding.\",\n\t\"Tmt Limkin\": \"An elegant, ultra-light serif font with a sophisticated and modern feel, featuring high-contrast strokes and delicate, sharp serifs. Its elongated proportions and minimalist aesthetic give it a high-fashion, editorial look.\",\n\t\"Tmt Limkin Pixel\": \"A retro-style pixel display font composed of small, uniform dots that create a light, airy texture. Its minimalist, digital aesthetic evokes a nostalgic, tech-focused mood suitable for low-resolution or vintage gaming themes.\",\n\t\"Tmt Mini Mochi\": \"Tmt Mini Mochi is an ultra-bold, playful display font featuring soft, rounded block shapes and distinctive circular cutouts. Its chunky, squishy aesthetic gives it a friendly, toy-like appearance suitable for casual or juvenile designs.\",\n\t\"Tmt Paint\": \"Tmt Paint is a bold, blocky pixel font with a retro, low-resolution aesthetic reminiscent of early digital interfaces and video games. Its heavy weight and jagged, aliased edges create a nostalgic and playful mood.\",\n\t\"Tomorrow\": \"Tomorrow is a modern, geometric sans-serif display font with a futuristic, tech-inspired aesthetic. It features distinct chamfered corners and a modular, octagonal structure that gives it a clean, digital, and industrial feel.\",\n\t\"Tourney\": \"Tourney is a bold, geometric display font with a modern, athletic feel, featuring an outlined blocky structure and distinct chamfered corners. Its wide, industrial aesthetic evokes the look of sports jerseys and high-tech branding.\",\n\t\"Trade Winds\": \"Trade Winds is a bold, weathered display font with a nautical, adventurous feel, featuring rough, hand-painted edges and a slight italic lean. Its irregular, brush-like strokes evoke the spirit of high-seas exploration and vintage maritime signage.\",\n\t\"Train One\": \"Train One is a unique display sans-serif font characterized by its double-line structure, which creates a rhythmic, retro-futuristic feel. Its geometric forms and inline aesthetic evoke a sense of motion and industrial design, making it ideal for bold headlines.\",\n\t\"Tranche Type\": \"Tranche Type is an ultra-minimalist, low-resolution pixel font with a heavy weight and a retro-digital aesthetic. Its characters are constructed from a very small grid of blocks, creating a highly abstract and experimental display style.\",\n\t\"Transom Hoog\": \"Transom Hoog is a bold, ultra-geometric display font with a futuristic, industrial aesthetic. It features heavy, blocky letterforms with sharp 45-degree angles and distinctive stencil-like gaps, creating a high-impact, sci-fi appearance.\",\n\t\"Trench Slab\": \"Trench Slab is a bold, high-contrast slab serif font that blends a classic, authoritative feel with unique decorative flourishes, such as the concave curves on the serifs and terminals. Its sturdy weight and sharp, angular details give it a modern, industrial look while maintaining a sense of traditional craftsmanship.\",\n\t\"Triodion\": \"Triodion is a classic serif font with a calligraphic, hand-inked feel, featuring irregular stroke widths and sharp, wedge-like serifs. Its organic, slightly rustic aesthetic evokes a sense of tradition and historical craftsmanship.\",\n\t\"Trirong\": \"Trirong is a formal serif typeface with a classic, elegant feel, featuring sharp, wedge-like serifs and a high-contrast stroke weight. Its tall x-height and open counters give it a sophisticated and legible appearance suitable for editorial design.\",\n\t\"Trispace\": \"Trispace is a modern, wide-set sans-serif font with a clean, geometric structure and a medium weight. Its generous letter spacing and open apertures create a professional, tech-oriented feel suitable for digital interfaces and branding.\",\n\t\"Trocchi\": \"Trocchi is a sturdy, slab-serif typeface with a classic yet casual feel, featuring heavy, unbracketed serifs and ball terminals that give it a distinct, scholarly personality.\",\n\t\"Trochut\": \"Trochut is a high-contrast display serif font with a modern, elegant feel, featuring dramatic stroke variations and unique, sweeping curves on the terminals. Its tall x-height and condensed proportions give it a sophisticated and artistic appearance suitable for editorial design.\",\n\t\"Truculenta\": \"Truculenta is a quirky, condensed display font with a hand-drawn, rustic feel, featuring irregular, jagged outlines and a tall x-height. Its playful yet slightly aggressive aesthetic makes it ideal for expressive headlines or informal branding.\",\n\t\"Trykker\": \"Trykker is a classic serif typeface with a medium weight and a scholarly, traditional feel. It features sharp, angular serifs and a high x-height, making it highly legible for body text while maintaining a distinct, slightly rustic character.\",\n\t\"Tsukimi Rounded\": \"Tsukimi Rounded is a light-weight, sans-serif display font featuring soft, fully rounded terminals and a friendly, modern aesthetic. Its design is characterized by high-waisted letterforms and a gentle, organic flow that gives it a clean yet approachable feel.\",\n\t\"Tuffy\": \"Tuffy is a clean, humanist sans-serif font with a friendly and approachable mood, featuring rounded terminals and a tall x-height. Its design balances geometric clarity with subtle calligraphic touches, such as the curved tails on the 'f' and 'y', making it highly legible for both display and body text.\",\n\t\"Tulpen One\": \"Tulpen One is an ultra-condensed, thin-stroke display sans-serif with an elegant, elongated aesthetic. It features unique geometric letterforms with high-waisted proportions and a mix of sharp angles and soft curves, giving it a modern, sophisticated feel.\",\n\t\"Turret Road\": \"Turret Road is a geometric, sans-serif display font with a futuristic, industrial feel, characterized by its rigid, octagonal letterforms and uniform stroke weight. Its sharp angles and technical aesthetic evoke a sense of science fiction and modern engineering.\",\n\t\"Twinkle Star\": \"Twinkle Star is a playful, hand-drawn script font featuring whimsical curls, rounded terminals, and a medium weight. Its bouncy baseline and decorative flourishes give it a charming, storybook-like quality that feels both friendly and creative.\",\n\t\"Ubuntu\": \"Ubuntu is a modern, humanist sans-serif font characterized by its rounded, open curves and distinctive angled terminals. It conveys a friendly and accessible mood while maintaining high legibility for digital interfaces.\",\n\t\"Ubuntu Condensed\": \"A modern, humanist sans-serif font with a narrow, condensed width and a clean, technical feel. It features distinctive rounded terminals and a tall x-height, making it highly legible and space-efficient.\",\n\t\"Ubuntu Mono\": \"Ubuntu Mono is a modern, monospaced sans-serif font featuring a clean and technical aesthetic with distinctive rounded terminals. Its regular weight and open counters provide excellent legibility, making it ideal for programming and terminal environments.\",\n\t\"Ubuntu Sans\": \"Ubuntu Sans is a modern, humanist sans-serif font featuring a clean and friendly aesthetic with distinctive rounded terminals and a medium weight. Its open counters and unique curves give it a contemporary, tech-oriented feel that is highly legible for both screen and print.\",\n\t\"Ubuntu Sans Mono\": \"Ubuntu Sans Mono is a clean, modern monospaced font featuring a medium weight and distinctive rounded terminals that give it a friendly, approachable feel. Its open counters and uniform character widths ensure high legibility, making it ideal for technical environments and coding.\",\n\t\"Uchen\": \"Uchen is a classic serif font with a formal and scholarly feel, featuring sharp, wedge-like serifs and a high stroke contrast. Its tall x-height and elegant, traditional proportions make it well-suited for academic or literary contexts.\",\n\t\"Ufo\": \"This is a highly stylized, experimental display font with a futuristic, sci-fi mood. It features thick, blocky letterforms constructed from rounded, pixel-like segments that create a sense of digital abstraction and movement.\",\n\t\"Ultra\": \"Ultra is an ultra-bold slab serif display font that features dramatic contrast and a powerful, retro-inspired presence. Its chunky letterforms and sharp, heavy serifs create a commanding and impactful aesthetic suitable for headlines.\",\n\t\"Unbounded\": \"Unbounded is a modern, geometric sans-serif font with a bold weight and a clean, expansive feel. It features wide proportions and circular counters that give it a contemporary and highly legible appearance.\",\n\t\"Uncial Antiqua\": \"Uncial Antiqua is a calligraphic display font that blends medieval uncial script with classical Roman proportions, featuring high-contrast strokes and elegant, sweeping curves. Its historic and scholarly mood is defined by unique letterforms like the rounded 'U' and 'A', giving it a sophisticated, ancient aesthetic.\",\n\t\"Uncut Sans Variable\": \"A clean, geometric sans-serif font with a modern and neutral aesthetic, featuring uniform stroke weights and open apertures. Its tall x-height and minimalist design give it a professional, highly legible appearance suitable for both display and body text.\",\n\t\"Undefined\": \"This is a blocky, pixel-art display font with a retro, digital aesthetic. It features a monospaced, low-resolution design with sharp, square edges and a medium weight, evoking a nostalgic 8-bit gaming or early computing mood.\",\n\t\"Underdog\": \"Underdog is a bold, angular display font with a hand-cut, woodblock aesthetic, featuring sharp geometric edges and irregular letterforms that create a rugged, rebellious mood. Its unique construction blends elements of blackletter and folk art, making it ideal for expressive, high-impact headlines.\",\n\t\"Unica One\": \"Unica One is a condensed sans-serif display font with a modern, geometric feel and a uniform stroke weight. Its tall, narrow letterforms and clean curves give it a sleek, technical appearance suitable for headlines and contemporary branding.\",\n\t\"Unifrakturcook\": \"UnifrakturCook is a bold, blackletter display font with a traditional Fraktur style, featuring sharp, angular strokes and a dense, gothic aesthetic. Its heavy weight and intricate, calligraphic forms evoke a classic, historical mood suitable for formal or vintage designs.\",\n\t\"Unifrakturmaguntia\": \"UnifrakturMaguntia is a classic blackletter or Fraktur-style display font featuring heavy, angular strokes and intricate, decorative flourishes. It evokes a traditional, medieval, or gothic mood with its high contrast and ornate calligraphic details.\",\n\t\"Unkempt\": \"Unkempt is a casual, hand-drawn display font with a playful and slightly irregular feel, featuring uneven stroke weights and rough, textured edges. Its quirky, slab-serif-inspired letterforms give it a whimsical, storybook quality that feels both informal and expressive.\",\n\t\"Unlock\": \"Unlock is a bold, heavy-weight slab serif display font with a sturdy and authoritative feel. It features thick, blocky serifs and high-contrast strokes that give it a classic, industrial, and impactful appearance.\",\n\t\"Unna\": \"Unna is a neoclassical serif font characterized by high stroke contrast and a soft, elegant mood. Its delicate serifs and vertical stress give it a sophisticated, classic appearance suitable for editorial design.\",\n\t\"Uoqmunthenkhung\": \"This is a classic serif font with a medium weight and a formal, academic mood. It features sharp, bracketed serifs and a high contrast between thick and thin strokes, reminiscent of traditional book typography.\",\n\t\"Updock\": \"Updock is a playful and elegant script font featuring fluid, calligraphic strokes with a high contrast between thick and thin lines. Its whimsical loops and upright posture give it a modern yet classic feel, perfect for decorative or formal invitations.\",\n\t\"Urbanist\": \"Urbanist is a clean, low-contrast geometric sans-serif font that exudes a modern and sophisticated feel. Its design features perfectly circular curves and straight, minimalist lines, making it highly legible and versatile for contemporary digital and print media.\",\n\t\"Urlaub Grotesk\": \"Urlaub Grotesk is a clean, geometric sans-serif font with a medium weight that exudes a modern and professional mood. It features open apertures and balanced proportions, making it highly legible and versatile for both display and body text.\",\n\t\"Utara\": \"Utara is a bold, geometric sans-serif display font with a futuristic, industrial feel, characterized by its wide proportions and distinctive squared-off curves.\",\n\t\"Vampiro One\": \"Vampiro One is a bold, low-contrast script font with a retro, gothic-inspired aesthetic. It features angular, geometric letterforms and a distinct break in the strokes, giving it a modern yet spooky, 20th-century horror-flick vibe.\",\n\t\"Varela\": \"Varela is a clean, modern sans-serif font featuring a balanced weight and rounded terminals that give it a friendly, approachable feel. Its geometric structure and open counters ensure excellent legibility, making it suitable for both digital and print applications.\",\n\t\"Varela Round\": \"Varela Round is a clean, geometric sans-serif font featuring distinctively rounded corners and terminals that create a friendly, modern, and approachable feel. Its consistent stroke weight and open curves ensure excellent legibility, making it ideal for both digital interfaces and casual display text.\",\n\t\"Varta\": \"Varta is a clean, low-contrast sans-serif typeface with a modern and functional aesthetic, featuring open apertures and slightly condensed proportions for high legibility. Its balanced weight and geometric influence give it a professional yet approachable feel suitable for both screen and print.\",\n\t\"Vast Shadow\": \"Vast Shadow is a bold, slab-serif display font with a vintage, Victorian-inspired feel, characterized by its prominent drop-shadow effect and wide, sturdy letterforms. Its architectural structure and decorative outline create a sense of depth and classic Americana, making it ideal for headlines and signage.\",\n\t\"Vazirmatn\": \"Vazirmatn is a clean, modern sans-serif typeface with a balanced weight and a neutral, professional tone. It features open apertures and geometric influences, making it highly legible for both digital and print body text.\",\n\t\"Vend Sans\": \"Vend Sans is a clean, geometric sans-serif font with a medium weight that conveys a modern and professional tone. It features open apertures and balanced proportions, making it highly legible for both display and body text.\",\n\t\"Vesper Libre\": \"Vesper Libre is a high-contrast serif font with a classic, scholarly feel, featuring sharp, wedge-shaped serifs and a tall x-height. Its elegant yet sturdy construction makes it highly readable and sophisticated, suitable for long-form body text.\",\n\t\"Viaoda Libre\": \"Viaoda Libre is an elegant display serif font featuring high contrast between thick and thin strokes, giving it a sophisticated and classic feel. It is characterized by unique, stylized terminals and sharp serifs that provide a graceful, calligraphic quality.\",\n\t\"Vibes\": \"This is a whimsical, hand-drawn display font with a light weight and a playful, artistic mood. It features irregular, flowing strokes, oversized circular counters, and unique flourishes like the elongated tail on the 'e'.\",\n\t\"Vibur\": \"Vibur is a playful, casual script font with a medium weight and a hand-drawn feel. It features rounded terminals and fluid, loopy letterforms that give it a friendly and informal personality.\",\n\t\"Victor Mono\": \"Victor Mono is a clean, monospaced sans-serif font with a slender weight and a modern, technical aesthetic. It features high-contrast verticality and large apertures, making it highly legible for programming and digital interfaces.\",\n\t\"Vidaloka\": \"Vidaloka is a high-contrast Didone-style serif font that exudes a classic, elegant, and sophisticated mood. It features dramatic transitions between thick and thin strokes, distinctive ball terminals, and flat, hairline serifs.\",\n\t\"Viga\": \"Viga is a bold, heavy-weight sans-serif font with a modern and friendly personality, characterized by its soft, rounded terminals and high-contrast geometric shapes.\",\n\t\"Vina Sans\": \"Vina Sans is a bold, ultra-condensed display sans-serif with a modern, high-impact feel. It features tight letter spacing, flat terminals, and a distinctive horizontal bar over the 'i' instead of a dot.\",\n\t\"Voces\": \"Voces is a clean, modern sans-serif typeface with a medium weight and a friendly, approachable mood. It features wide, open apertures and slightly condensed proportions, making it highly legible for both display and body text.\",\n\t\"Volkhov\": \"Volkhov is a robust, high-contrast serif typeface with a classic and authoritative feel, featuring sharp, prominent serifs and a large x-height. Its sturdy construction and clear letterforms make it well-suited for both editorial body text and impactful headlines.\",\n\t\"Vollkorn\": \"Vollkorn is a robust, classic serif typeface with a modest, earthy feel, featuring heavy, wedge-shaped serifs and a high x-height. Its sturdy construction and slightly rounded terminals give it a warm, reliable character suitable for both body text and titles.\",\n\t\"Vollkorn Sc\": \"Vollkorn SC is a classic, sturdy serif font featuring small caps with a modest weight and a grounded, traditional feel. Its design is characterized by thick, wedge-shaped serifs and a high-contrast stroke that gives it a sophisticated and literary appearance.\",\n\t\"Voltaire\": \"Voltaire is a low-contrast, geometric sans-serif font with a modern and slightly industrial feel. It features sharp terminals, a tall x-height, and narrow proportions that give it a clean, efficient appearance suitable for display use.\",\n\t\"Voyager\": \"Voyager is a bold, experimental display font with a futuristic, sci-fi aesthetic, featuring blocky, geometric letterforms and a unique stencil-like construction. Its heavy weight and fragmented, modular design create a high-tech, digital mood suitable for modern branding and titles.\",\n\t\"Vt323\": \"VT323 is a retro, monospaced pixel font that mimics the low-resolution aesthetic of vintage computer terminals. It features blocky, aliased edges and a nostalgic, technical feel reminiscent of 1980s computing.\",\n\t\"Vujahday Script\": \"Vujahday Script is an elegant, handwritten-style font with a fluid, rhythmic flow and a medium weight. It features expressive, calligraphic strokes and a slight slant, conveying a personal, sophisticated, and artistic mood.\",\n\t\"Waiting For The Sunrise\": \"A casual, thin-weight handwriting font with a personal and informal feel. It features tall, narrow letterforms with irregular strokes and a playful, hand-drawn aesthetic.\",\n\t\"Wallpoet\": \"Wallpoet is a bold, stencil-style display font with a futuristic, industrial feel, featuring blocky, geometric letterforms and sharp, angled cuts. Its heavy weight and segmented construction evoke a sense of urban grit and high-tech machinery.\",\n\t\"Walter Turncoat\": \"Walter Turncoat is a casual, hand-drawn display font featuring irregular, slightly shaky strokes that evoke a playful and informal comic-book aesthetic. Its medium-weight, all-caps design has a charmingly unpolished feel with rounded terminals and a distinctively organic, human touch.\",\n\t\"Warnes\": \"Warnes is a bold, retro-style display script font with a distinct mid-century automotive feel, featuring connected lowercase letters and a heavy, horizontal baseline. Its rounded terminals and fluid, loopy strokes evoke a nostalgic, sporty, and energetic mood.\",\n\t\"Water Brush\": \"Water Brush is an expressive, hand-drawn script font featuring textured, dry-brush strokes that create a dynamic and artistic feel. Its fluid, cursive letterforms and varying line weights evoke a sense of spontaneous, elegant calligraphy.\",\n\t\"Waterfall\": \"Waterfall is an elegant, flowing script font with a calligraphic feel, featuring delicate, sweeping flourishes and a rhythmic, handwritten quality. Its varying stroke weights and graceful slants evoke a sense of classic sophistication and fluid movement.\",\n\t\"Wavetosh\": \"Wavetosh is a dynamic, italicized display font with a fluid, wave-like motion and high-contrast strokes. Its bold, sweeping curves and sharp terminals create a sense of speed and retro-modern energy.\",\n\t\"Wdxl Lubrifont Jp N\": \"This is a bold, monospaced sans-serif display font with a modern, industrial feel, featuring rounded corners and a distinctively squarish, mechanical structure.\",\n\t\"Wdxl Lubrifont Sc\": \"This is a bold, condensed sans-serif display font with a modern, industrial feel, featuring rounded corners and distinctively squared-off letterforms. Its uniform stroke weight and geometric structure give it a clean, technical appearance suitable for logos or headlines.\",\n\t\"Wdxl Lubrifont Tc\": \"This is a bold, condensed sans-serif display font with a modern, industrial feel, featuring rounded corners and distinctively squared-off letterforms. Its uniform stroke weight and geometric structure give it a clean, technical appearance suitable for branding or signage.\",\n\t\"Wellfleet\": \"Wellfleet is a playful, slab-serif display font with a hand-drawn, rustic feel, featuring irregular stroke widths and blocky, uneven serifs. Its casual and slightly whimsical appearance makes it ideal for informal designs that require a touch of personality and warmth.\",\n\t\"Wendy One\": \"Wendy One is a bold, sans-serif display font with a playful and quirky personality, featuring irregular letterforms and a hand-drawn feel. Its heavy weight and slightly tilted, bouncy alignment give it a friendly, informal appearance suitable for headlines and creative projects.\",\n\t\"Whisper\": \"Whisper is an elegant, flowing script font with a delicate, handwritten feel, featuring high-contrast strokes and sweeping flourishes. Its light weight and slanted posture evoke a sense of romanticism and sophisticated grace.\",\n\t\"Windsong\": \"Windsong is a delicate, hand-written script font with a romantic and airy feel, featuring elongated flourishes and a varying stroke weight that mimics natural calligraphy. Its elegant, flowing lines and informal structure give it a personalized, whimsical appearance suitable for invitations and artistic branding.\",\n\t\"Winky Rough\": \"Winky Rough is a playful, hand-drawn sans-serif display font featuring a medium weight and a textured, irregular outline that gives it a charmingly rustic and informal feel. Its slightly wobbly strokes and rounded terminals evoke a friendly, organic mood suitable for casual or creative designs.\",\n\t\"Winky Sans\": \"Winky Sans is a playful, handwritten sans-serif font with a casual and friendly mood. It features irregular, rounded strokes and a slight bounce, giving it a charming, hand-drawn aesthetic.\",\n\t\"Wire One\": \"Wire One is an ultra-condensed, monolinear sans-serif font with a modern, minimalist aesthetic. Its extremely thin strokes and elongated letterforms create a sleek, sophisticated look suitable for high-end display use.\",\n\t\"Wittgenstein\": \"Wittgenstein is a sophisticated serif typeface with a classic, intellectual feel, featuring sharp, wedge-shaped serifs and high stroke contrast. Its elegant proportions and distinctive details, like the circular tittle on the 'i', give it a refined and scholarly appearance.\",\n\t\"Wix Madefor Display\": \"Wix Madefor Display is a clean, geometric sans-serif font with a modern and professional feel, featuring a medium weight and balanced proportions. Its open apertures and crisp terminals make it highly legible and well-suited for digital interfaces and branding.\",\n\t\"Wix Madefor Text\": \"Wix Madefor Text is a clean, geometric sans-serif font with a modern and professional feel. It features a medium weight with balanced proportions and open apertures, making it highly legible for digital body text.\",\n\t\"Work Sans\": \"Work Sans is a clean, modern sans-serif typeface with a balanced weight and a professional, utilitarian feel. It features open apertures and generous spacing, making it highly legible and versatile for both digital and print applications.\",\n\t\"Workbench\": \"Workbench is a bold, experimental display font constructed from horizontal, pill-shaped segments that create a digital, industrial, or mechanical aesthetic. Its modular, stencil-like structure gives it a heavy, rhythmic feel that is both modern and utilitarian.\",\n\t\"Writer\": \"This is a slab-serif typewriter-style font with a medium weight and a classic, intellectual mood. It features monospaced proportions, flat rectangular serifs, and a distinctive circular tittle on the 'i'.\",\n\t\"Xanh Mono\": \"Xanh Mono is a monospaced serif font that blends a classic, elegant aesthetic with a modern, technical structure. It features high-contrast strokes, sharp horizontal serifs, and distinctive ball terminals, giving it a sophisticated and scholarly appearance.\",\n\t\"Xx Libert\u00E9\": \"A bold, geometric sans-serif font with a clean, modern aesthetic, featuring high-contrast stroke widths and sharp, square terminals.\",\n\t\"Xx Stardust\": \"Xx Stardust is an ultra-bold, psychedelic display font featuring heavy, rounded letterforms and distinctive four-pointed star cutouts. Its retro-futuristic aesthetic evokes a playful, 1970s cosmic vibe with high-contrast shapes and tight spacing.\",\n\t\"Yaldevi\": \"Yaldevi is a clean, modern sans-serif font with a light-to-medium weight and a tall x-height. It features open apertures and subtle geometric influences, giving it a friendly yet professional appearance suitable for both display and body text.\",\n\t\"Yanone Kaffeesatz\": \"Yanone Kaffeesatz is a condensed sans-serif display font with a modern, slightly retro feel, characterized by its tall letterforms and subtly rounded corners. Its narrow proportions and clean lines give it a sophisticated yet approachable look, reminiscent of mid-20th-century coffee shop aesthetics.\",\n\t\"Yantramanav\": \"Yantramanav is a clean, geometric sans-serif typeface with a modern and industrial feel, featuring uniform stroke weights and open apertures. Its design is highly legible and balanced, making it suitable for both technical documentation and contemporary digital interfaces.\",\n\t\"Yarndings 12\": \"A decorative dingbat font featuring pixelated, geometric symbols that resemble traditional cross-stitch or knitting patterns. The style is rustic and nostalgic, using a blocky grid to create floral and abstract motifs.\",\n\t\"Yarndings 12 Charted\": \"A pixelated dingbat font featuring geometric, folk-art inspired symbols that mimic traditional knitting or cross-stitch patterns. The style is rustic and craft-oriented, using a rigid grid to create intricate, symmetrical motifs.\",\n\t\"Yarndings 20\": \"Yarndings 20 is a decorative dingbat font featuring pixelated, geometric symbols that mimic traditional cross-stitch or knitting patterns. Its blocky, low-resolution aesthetic creates a cozy, folk-art mood reminiscent of winter textiles and retro digital crafts.\",\n\t\"Yarndings 20 Charted\": \"A decorative dingbat font featuring pixelated, folk-art symbols like flowers and snowflakes, designed to mimic traditional cross-stitch or knitting patterns on a grid.\",\n\t\"Yatra One\": \"Yatra One is a bold, Devanagari-inspired display font featuring heavy, calligraphic strokes and a distinct hand-painted feel. Its angular terminals and high-contrast weight give it a traditional yet energetic aesthetic, reminiscent of Indian hand-lettered signage.\",\n\t\"Yellowtail\": \"Yellowtail is a medium-weight, old-school brush script font that blends a vintage 1930s aesthetic with a casual, hand-painted feel. It features a distinct slant, connecting lowercase letters, and slightly rugged edges that give it a warm, nostalgic, and energetic personality.\",\n\t\"Yeon Sung\": \"Yeon Sung is a playful, calligraphic display font featuring irregular, hand-drawn strokes that mimic the texture of a brush or marker. Its organic shapes and varying line weights create a friendly, informal mood with a distinct handcrafted aesthetic.\",\n\t\"Yeseva One\": \"Yeseva One is a high-contrast display serif font with a feminine, elegant feel, featuring thick strokes and delicate, sharp serifs. Its soft curves and balanced proportions give it a classic yet modern editorial look, perfect for headlines and branding.\",\n\t\"Yesteryear\": \"Yesteryear is a retro-inspired script font with a heavy weight and a nostalgic, mid-century feel. It features sharp, angular terminals and a slight slant, evoking the look of vintage automotive signage or hand-painted brush lettering.\",\n\t\"Yomogi\": \"Yomogi is a casual, handwritten-style sans-serif font with a light weight and a friendly, personal mood. It features organic, slightly irregular strokes and rounded terminals that give it a charming, authentic felt-tip pen appearance.\",\n\t\"Young Serif\": \"Young Serif is a heavy-weight, old-style serif font with a classic yet friendly feel, featuring rounded terminals and high-contrast strokes that give it a bold, editorial presence.\",\n\t\"Yrsa\": \"Yrsa is a medium-weight serif font with a classic, scholarly feel, featuring slightly irregular, hand-carved edges that give it a rustic and organic texture. Its design balances traditional letterforms with a unique, weathered aesthetic, making it suitable for both body text and distinctive headings.\",\n\t\"Ysabeau\": \"Ysabeau is an elegant, humanist sans-serif font with a light-to-medium weight that blends modern minimalism with classical proportions. It features subtle calligraphic influences, seen in its open apertures and slightly flared stroke endings, creating a sophisticated and airy feel.\",\n\t\"Ysabeau Infant\": \"Ysabeau Infant is a clean, light-weight sans-serif font with a modern and elegant feel, featuring high-contrast strokes and unique, flared terminals that give it a sophisticated, calligraphic touch.\",\n\t\"Ysabeau Office\": \"Ysabeau Office is a clean, elegant sans-serif font with a professional and modern feel, featuring high-contrast strokes and subtle flared terminals that suggest a calligraphic influence. Its open counters and balanced proportions make it highly legible and sophisticated for both display and body text.\",\n\t\"Ysabeau Sc\": \"Ysabeau SC is an elegant, light-weight sans-serif font featuring a small caps design with a clean, modern, and sophisticated aesthetic. Its open letterforms and balanced proportions give it a refined, high-fashion feel suitable for editorial and branding purposes.\",\n\t\"Yuji Boku\": \"Yuji Boku is a calligraphic display font featuring expressive, hand-painted brushstrokes with a raw, textured finish. Its irregular letterforms and varying line weights create a traditional yet dynamic aesthetic that mimics authentic ink on paper.\",\n\t\"Yuji Hentaigana Akari\": \"This is a decorative, handwritten-style display font with a light weight and a whimsical, calligraphic feel. It features fluid, looping strokes and organic, irregular letterforms that evoke a sense of traditional Japanese brushwork applied to Latin characters.\",\n\t\"Yuji Hentaigana Akebono\": \"This is a calligraphic, handwritten-style display font with a light weight and a graceful, artistic mood. It features fluid, sweeping strokes and decorative loops that evoke the elegance of traditional Japanese brushwork.\",\n\t\"Yuji Mai\": \"Yuji Mai is a calligraphic display font with a hand-brushed aesthetic, featuring organic, irregular strokes and elegant flourishes that evoke a traditional, artistic mood. Its medium weight and fluid, ink-like texture give it a unique, handcrafted character suitable for expressive headings.\",\n\t\"Yuji Syuku\": \"Yuji Syuku is a calligraphic serif font with a hand-brushed feel, featuring irregular, organic edges and a medium weight. It conveys a traditional, artisanal mood through its expressive strokes and unique, slightly rustic letterforms.\",\n\t\"Yunga\": \"Yunga is an experimental, highly abstract display font featuring fluid, amoebic shapes and a psychedelic, liquid-like aesthetic. Its heavy, bulbous strokes and lack of traditional structure create a surreal, organic mood that prioritizes artistic expression over legibility.\",\n\t\"Yusei Magic\": \"Yusei Magic is a friendly, medium-weight sans-serif display font with a hand-drawn feel, featuring rounded terminals and slightly irregular stroke widths that give it a casual, approachable mood.\",\n\t\"Zain\": \"Zain is a contemporary sans-serif font with a friendly, approachable mood, characterized by its rounded terminals and geometric letterforms. Its medium weight and clean, open counters give it a modern and highly legible appearance suitable for both digital and print interfaces.\",\n\t\"Zalando Sans\": \"Zalando Sans is a clean, geometric sans-serif typeface with a modern and professional aesthetic. It features uniform stroke weights, open apertures, and a balanced structure that ensures high legibility for digital interfaces.\",\n\t\"Zalando Sans Expanded\": \"A clean, geometric sans-serif font with an expanded width and medium weight, conveying a modern, professional, and highly legible aesthetic. It features open apertures and uniform stroke thickness, giving it a balanced and contemporary feel.\",\n\t\"Zalando Sans Semiexpanded\": \"A clean, modern sans-serif typeface with a semi-expanded width that provides a spacious and highly legible appearance. Its geometric structure and balanced weight convey a professional yet approachable and contemporary aesthetic.\",\n\t\"Zcool Kuaile\": \"Zcool Kuaile is a playful, hand-drawn display font featuring irregular, blocky strokes and a whimsical, geometric construction. Its quirky, uneven baselines and varying letter widths create a cheerful, informal mood suitable for creative and child-friendly designs.\",\n\t\"Zcool Qingke Huangyou\": \"A modern, geometric sans-serif display font featuring rounded corners and a tall, condensed structure. Its uniform stroke weight and modular design give it a clean, technological, and friendly appearance.\",\n\t\"Zcool Xiaowei\": \"ZCOOL XiaoWei is a graceful serif font featuring high contrast between thick and thin strokes, giving it a sophisticated and classic feel. Its most notable features are the elegant, sweeping curves on the terminals and the sharp, refined serifs that evoke a sense of traditional calligraphy.\",\n\t\"Zen Antique\": \"Zen Antique is a classic serif font with a medium weight that exudes a formal and traditional feel. It features sharp, triangular serifs and a high contrast between thick and thin strokes, giving it an elegant, book-like quality.\",\n\t\"Zen Antique Soft\": \"Zen Antique Soft is a classic serif font with a medium weight that exudes a warm, nostalgic mood. It features rounded corners and soft edges that give the traditional letterforms a gentle, weathered appearance reminiscent of vintage printing.\",\n\t\"Zen Dots\": \"Zen Dots is a futuristic, wide-set display font featuring a bold weight and a clean, sci-fi aesthetic. Its letterforms are characterized by a mix of sharp angles and smooth, rounded outer corners, giving it a modern, high-tech feel.\",\n\t\"Zen Kaku Gothic Antique\": \"Zen Kaku Gothic Antique is a clean, light-weight sans-serif font with a modern and minimalist aesthetic. It features balanced proportions and open apertures, giving it a sophisticated yet highly legible appearance suitable for both display and body text.\",\n\t\"Zen Kaku Gothic New\": \"Zen Kaku Gothic New is a clean, modern sans-serif font with a light weight and a minimalist, professional feel. It features balanced proportions and open apertures, making it highly legible and versatile for contemporary design.\",\n\t\"Zen Kurenaido\": \"Zen Kurenaido is a slender, monolinear sans-serif font with a clean and modern aesthetic. It features rounded terminals and a tall x-height, giving it a friendly, approachable, and minimalist feel.\",\n\t\"Zen Loop\": \"Zen Loop is a thin, ultra-condensed sans-serif display font with a minimalist and modern aesthetic. It features elongated vertical strokes and narrow, oval-shaped curves that create a clean, airy, and sophisticated feel.\",\n\t\"Zen Maru Gothic\": \"Zen Maru Gothic is a rounded sans-serif font with a soft, friendly, and modern aesthetic. It features monolinear strokes and distinctively circular terminals that give it a gentle and approachable feel.\",\n\t\"Zen Old Mincho\": \"Zen Old Mincho is a classic serif font with a medium weight that exudes a traditional and scholarly mood. It features high-contrast strokes and sharp, elegant serifs that give it a refined, timeless appearance suitable for formal text.\",\n\t\"Zen Tokyo Zoo\": \"Zen Tokyo Zoo is a bold, decorative display font characterized by its unique multi-line structure, where each letterform is composed of three parallel strokes. This geometric, sans-serif design evokes a retro-futuristic or industrial mood, making it highly distinctive for headlines and creative branding.\",\n\t\"Zeyada\": \"Zeyada is a casual, handwritten script font with a light-to-medium weight and a personal, informal mood. It features expressive, slightly irregular strokes and a natural flow that mimics quick penmanship.\",\n\t\"Zhi Mang Xing\": \"Zhi Mang Xing is a bold, expressive brush script font that captures the fluid, energetic motion of traditional Chinese calligraphy. Its irregular stroke widths and organic, hand-drawn feel evoke a sense of artistic spontaneity and cultural heritage.\",\n\t\"Zilla Slab\": \"Zilla Slab is a contemporary slab serif typeface featuring heavy, blocky serifs and smooth curves that create a professional yet approachable industrial feel. Its balanced weight and open counters provide excellent legibility, making it feel both modern and grounded.\",\n\t\"Zilla Slab Highlight\": \"Zilla Slab Highlight is a contemporary slab serif font featuring a bold, industrial aesthetic with thick, blocky serifs and a unique 'highlight' effect where the white characters are set against a solid black rectangular background. It conveys a modern, tech-focused, and authoritative mood, reminiscent of digital terminal displays or journalistic branding.\",\n\t\"Zina\": \"Zina is a high-contrast, decorative serif display font that blends classic elegance with modern, artistic flair. It features dramatic stroke variations, sharp serifs, and unique, fluid letterforms that create a sophisticated and avant-garde aesthetic.\",\n\t\"Zodiak\": \"Zodiak is a contemporary serif typeface that blends classic elegance with modern sharpness, featuring high stroke contrast and distinct, flat serifs. Its sophisticated and sturdy appearance is characterized by large, circular counters and a clean, professional aesthetic.\"\n}\n", "import { REGULAR_FONT_WEIGHT } from \"@framerjs/app-shared\"\nimport { assertNever, getLogger } from \"@framerjs/shared\"\nimport { openTypeFeatureTagToMetadata } from \"document/components/chrome/properties/rows/OpenTypeRow/utils/getOpenTypeFeatureMetadata.ts\"\nimport { isDeprecatedFontFamily } from \"document/components/chrome/shared/FontPopout/utils/deprecatedFonts.ts\"\nimport type { StaticOpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { FontFamily, ReadonlyFont, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { keys } from \"utils/keys.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport fontDescriptionsByFamilyName from \"../../examples/font-descriptions.json\" with { type: \"json\" }\nimport type { AIFontFamilyBase, AIFontFamilyWithReason } from \"../fonts.ts\"\nimport { getOpenTypeFeatures, isExcludedFontVariant } from \"../fonts.ts\"\nimport type { FontFamilyCatalogEntry, FontFamilyPick } from \"./fontPicker.ts\"\nimport type { FontSearchOptions } from \"./queryFonts.ts\"\n\nconst log = getLogger(\"ai:agents:fonts:utils\")\n\n//\n// Category, Style, and Weight Descriptors\n// ---------------------------\n\nconst fontCategoryDescriptors = [\"serif\", \"sans-serif\", \"slab\", \"monospace\", \"display\", \"handwriting\"] as const\nconst fontStyleDescriptors = [\"normal\", \"italic\"] as const\n\nconst fontWeightDescriptorMap = {\n\t100: \"thin\",\n\t200: \"extra-light\",\n\t300: \"light\",\n\t400: \"regular\",\n\t500: \"medium\",\n\t600: \"semibold\",\n\t700: \"bold\",\n\t800: \"extra-bold\",\n\t900: \"black\",\n} as const\nconst fontWeightDescriptorKeys = Object.values(fontWeightDescriptorMap)\n\ntype FontWeight = keyof typeof fontWeightDescriptorMap\ntype FontWeightDescriptor = (typeof fontWeightDescriptorMap)[FontWeight]\n\nfunction isFontWeight(weight: number): weight is FontWeight {\n\treturn weight in fontWeightDescriptorMap\n}\n\n/** Returns the descriptor key for a numeric font weight, e.g. 700 \u2192 \"bold\". */\nfunction fontWeightDescriptorKey(weight: FontWeight): FontWeightDescriptor {\n\treturn fontWeightDescriptorMap[weight]\n}\n\n//\n// OpenType Variation Axes\n// https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg\n// ---------------------------\n\nconst variationAxisTags = [\"ital\", \"opsz\", \"slnt\", \"wdth\", \"wght\"] as const\ntype VariationAxisTag = (typeof variationAxisTags)[number]\nconst isVariationAxisTag = (s: string): s is VariationAxisTag => {\n\treturn variationAxisTags.includes(s as VariationAxisTag)\n}\n\nconst variationAxisDescriptorTags = [\n\t\"variation-axis/ital\",\n\t\"variation-axis/opsz\",\n\t\"variation-axis/slnt\",\n\t\"variation-axis/wdth\",\n\t\"variation-axis/wght\",\n] as const satisfies FontVariationAxisTag[]\ntype FontVariationAxisTag = `variation-axis/${VariationAxisTag}`\n\n//\n// \"Static\" OpenType features are those that have a fixed set of tags and descriptions in the Spec.\n// We always know what impact they'll have some can serialise these directly into context/querying\n// ---------------------------\n\nconst staticOpenTypeFontFeatureDescriptorTags = new Set(\n\tkeys(openTypeFeatureTagToMetadata).map<StaticFontFeatureDescriptorTag>(tag => `feature/${tag}`),\n)\ntype StaticFontFeatureDescriptorTag = `feature/${StaticOpenTypeFeatureTag}`\n\n//\n// Character Variant and Stylistic Set features are technically \"static\" in that they have fixed tags (cv01 to cv99, ss01 to ss20),\n// but the effect of the feature depends on the font and can't be described in a generic way, ie. cv01 would affect an unknown character(s) and have a different effect in each font.\n// We need to build the lookups and context for these more dynamically\n// ---------------------------\n\nexport type CharacterVariantDescriptorTag = `feature/cv??/${string}`\nexport type StylisticSetDescriptorTag = `feature/ss??/${string}`\n\n// Final union of all font descriptors\n// ---------------------------\n\nexport const fontDescriptors = [\n\t...fontCategoryDescriptors,\n\t...fontWeightDescriptorKeys,\n\t...fontStyleDescriptors,\n\t...variationAxisDescriptorTags,\n\t...Array.from(staticOpenTypeFontFeatureDescriptorTags),\n] as const\ntype FontDescriptor = (typeof fontDescriptors)[number]\n\ntype ExhaustiveFontDescriptor = FontDescriptor | CharacterVariantDescriptorTag | StylisticSetDescriptorTag\n\n//\n// Utilities Functions\n// ---------------------------\n\nconst cachedFontFamilyDescriptors = new Map<string, Set<ExhaustiveFontDescriptor>>()\nconst cachedFontFamilyBaseData = new Map<string, AIFontFamilyBase>()\nconst cachedFontWithOT = new Map<string, ReadonlyFont>()\n\n/**\n * Flattens font family properties into a set of descriptors.\n * Also caches the base font family data (weights, styles, category) for later hydration.\n */\nasync function getCandidateDescriptorsFromFontFamily(\n\tfontFamily: ReadonlyFontFamily,\n): Promise<Set<ExhaustiveFontDescriptor>> {\n\tconst cachedDescriptors = cachedFontFamilyDescriptors.get(fontFamily.name.toLowerCase())\n\tif (cachedDescriptors) return cachedDescriptors\n\n\tconst descriptors = new Set<ExhaustiveFontDescriptor>()\n\tconst weights = new Set<number>()\n\tconst styles = new Set<NonNullable<AIFontFamilyBase[\"styles\"][number]>>()\n\tlet category: AIFontFamilyBase[\"category\"] = undefined\n\tlet variationAxes: AIFontFamilyBase[\"variationAxes\"] = undefined\n\tconst isSingleVariantFamily = fontFamily.fonts.length === 1\n\n\tfor (const font of fontFamily.fonts) {\n\t\tif (isExcludedFontVariant(font)) continue\n\n\t\tconst fontStyle = font.style ?? (isSingleVariantFamily ? \"normal\" : undefined)\n\t\tif (!isUndefined(fontStyle)) {\n\t\t\tdescriptors.add(fontStyle)\n\t\t\tstyles.add(fontStyle)\n\t\t}\n\t\tconst fontWeight = font.weight ?? (isSingleVariantFamily ? REGULAR_FONT_WEIGHT : undefined)\n\t\tif (!isUndefined(fontWeight)) {\n\t\t\tif (isFontWeight(fontWeight)) {\n\t\t\t\tdescriptors.add(fontWeightDescriptorKey(fontWeight))\n\t\t\t}\n\t\t\tweights.add(fontWeight)\n\t\t}\n\t\tif (font.category) {\n\t\t\tdescriptors.add(font.category)\n\t\t\tcategory ??= font.category\n\t\t}\n\t\tif (font.hasOpenTypeFeatures) {\n\t\t\tconst featureTags = await getOpenTypeFeatures(font)\n\t\t\tfor (const featureTag of featureTags ?? []) {\n\t\t\t\tswitch (featureTag.type) {\n\t\t\t\t\tcase \"static\":\n\t\t\t\t\t\tdescriptors.add(`feature/${featureTag.tag}`)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"character-variant\":\n\t\t\t\t\t\tfor (const character of featureTag.coverage) {\n\t\t\t\t\t\t\tdescriptors.add(`feature/cv??/${character}`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"stylistic-set\":\n\t\t\t\t\t\tfor (const character of featureTag.coverage) {\n\t\t\t\t\t\t\tdescriptors.add(`feature/ss??/${character}`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(featureTag, `Unhandled OpenType feature tag type: ${featureTag}`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!cachedFontWithOT.has(fontFamily.name.toLowerCase())) {\n\t\t\t\tcachedFontWithOT.set(fontFamily.name.toLowerCase(), font)\n\t\t\t}\n\t\t}\n\t\tif (font.variationAxes) {\n\t\t\tvariationAxes ??= Array.from(font.variationAxes)\n\n\t\t\tfor (const axis of variationAxes) {\n\t\t\t\tif (isVariationAxisTag(axis.tag)) {\n\t\t\t\t\tdescriptors.add(`variation-axis/${axis.tag}`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcachedFontFamilyDescriptors.set(fontFamily.name.toLowerCase(), descriptors)\n\tcachedFontFamilyBaseData.set(fontFamily.name.toLowerCase(), {\n\t\tname: fontFamily.name,\n\t\tweights: [...weights].sort((a, b) => a - b),\n\t\tstyles: [...styles],\n\t\tcategory,\n\t\t...(variationAxes && { variationAxes }),\n\t})\n\n\treturn descriptors\n}\n\ninterface FontFamilyCandidate {\n\tname: string\n\tdescriptors: Set<ExhaustiveFontDescriptor>\n}\n\nexport interface ScoredFontFamilyCandidate extends FontFamilyCandidate {\n\t/** Number of requested descriptors matched (higher = better fit). */\n\tscore?: number\n}\n\nexport async function getFontFamilyCandidates(\n\texcludedFamilyNames: Set<FontFamily[\"name\"]>,\n): Promise<FontFamilyCandidate[]> {\n\tconst availableFonts = fontStore.getAvailableFonts()\n\n\tconst families = new Set<FontFamily[\"name\"]>()\n\tconst candidates: FontFamilyCandidate[] = []\n\tfor (const font of availableFonts) {\n\t\tif (excludedFamilyNames.has(font.family.name)) continue\n\n\t\t// check if we've already added this family\n\t\tif (families.has(font.family.name)) continue\n\n\t\tif (isDeprecatedFontFamily(font.family)) continue\n\n\t\tconst descriptors = await getCandidateDescriptorsFromFontFamily(font.family)\n\t\tcandidates.push({\n\t\t\tname: font.family.name,\n\t\t\tdescriptors,\n\t\t})\n\n\t\tfamilies.add(font.family.name)\n\t}\n\n\treturn candidates\n}\n\nexport function rankFontFamilyCandidatesByDescriptors(\n\tcandidates: FontFamilyCandidate[],\n\tsearch: FontSearchOptions,\n): ScoredFontFamilyCandidate[] {\n\tif (candidates.length === 0) return []\n\n\t// Ranking can result in broad spread of scores and even dropping 0s can result in 500+ candidates\n\t// so we bucket the results by score and return all buckets until until the limit is reached\n\tconst softLimit = (search.limit ?? 5) * 5\n\n\tconst mustHaveDescriptors = search.mustHave\n\tconst mustHaveAlternativeCharacters = search.mustHaveAlternativeCharacters\n\n\t// no ranking criteria \u2014 return up to maxResults as-is\n\tif (!mustHaveDescriptors && !mustHaveAlternativeCharacters) {\n\t\treturn candidates\n\t}\n\n\tconst scored: ScoredFontFamilyCandidate[] = []\n\tfor (const candidate of candidates) {\n\t\tlet score = 0\n\n\t\tif (mustHaveDescriptors) {\n\t\t\tscore += candidate.descriptors.intersection(new Set(mustHaveDescriptors)).size\n\t\t}\n\n\t\tif (mustHaveAlternativeCharacters) {\n\t\t\tfor (const char of mustHaveAlternativeCharacters) {\n\t\t\t\tif (candidate.descriptors.has(`feature/ss??/${char}`) || candidate.descriptors.has(`feature/cv??/${char}`)) {\n\t\t\t\t\tscore++\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tscored.push({ ...candidate, score })\n\t}\n\n\tscored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n\n\t// Return ~softLimit candidates, expanding to include all ties at the cutoff.\n\t// if nothing scores >0, return everything\n\t// if anything scored >0, only return >0 scored candidates\n\tconst maxScore = scored[0]?.score ?? 0\n\tif (maxScore === 0) {\n\t\treturn scored\n\t}\n\n\tlet end = 0\n\tlet cutoff = 0\n\tfor (const { score = 0 } of scored) {\n\t\tif (score === 0) break\n\t\tif (end >= softLimit && score !== cutoff) break\n\t\tif (end === softLimit - 1) cutoff = score\n\t\tend++\n\t}\n\n\treturn scored.slice(0, end)\n}\n\nconst cachedDescriptionsByLowerName = new Map<string, string>()\n\n/**\n * Match the font families with their descriptions from the database,\n * and attach cv/ss alternative-character mappings when available.\n */\nexport function buildFontFamilyCatalogEntries(candidates: ScoredFontFamilyCandidate[]): FontFamilyCatalogEntry[] {\n\tif (cachedDescriptionsByLowerName.size === 0) {\n\t\tfor (const [familyName, description] of Object.entries(fontDescriptionsByFamilyName)) {\n\t\t\tcachedDescriptionsByLowerName.set(familyName.toLowerCase(), description)\n\t\t}\n\t}\n\n\tconst catalogEntries: FontFamilyCatalogEntry[] = []\n\tconst unmatchedNames: string[] = []\n\tfor (const candidate of candidates) {\n\t\tconst description = cachedDescriptionsByLowerName.get(candidate.name.toLowerCase())\n\t\tif (!description) {\n\t\t\tunmatchedNames.push(candidate.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst descriptors = candidate.descriptors.size > 0 ? [...candidate.descriptors] : undefined\n\t\tconst entry: FontFamilyCatalogEntry = { name: candidate.name, description, descriptors }\n\t\tcatalogEntries.push(entry)\n\t}\n\n\t// Unmatched fonts are expected \u2014 they are typically system/local fonts (e.g. Arial, Helvetica)\n\t// that don't have entries in the descriptions database. In the future we may want to add\n\t// descriptions for common system fonts so the LLM picker can recommend them too.\n\tlog.info(`${catalogEntries.length} font families matched, ${unmatchedNames.length} unmatched`, { unmatchedNames })\n\n\treturn catalogEntries\n}\n\n/**\n * Hydrates the font family picks with the base font family data (weights, styles, category,\n * openTypeFeatures) cached during candidate building. Prepares the fonts response for the agent.\n */\nexport async function hydrateFontFamilyPicks(picks: FontFamilyPick[]): Promise<AIFontFamilyWithReason[]> {\n\tconst resolved = await Promise.all(\n\t\tpicks.map<Promise<AIFontFamilyWithReason | undefined>>(async pick => {\n\t\t\tconst baseData = cachedFontFamilyBaseData.get(pick.name.toLowerCase())\n\t\t\tif (!baseData) {\n\t\t\t\tlog.warn(`Font family pick \"${pick.name}\" not found in cached base data, skipping`)\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\tconst fontRef = cachedFontWithOT.get(pick.name.toLowerCase())\n\t\t\tconst openTypeFeatures = fontRef ? await getOpenTypeFeatures(fontRef) : []\n\n\t\t\treturn {\n\t\t\t\t...baseData,\n\t\t\t\topenTypeFeatures,\n\t\t\t\treason: pick.reason,\n\t\t\t}\n\t\t}),\n\t)\n\n\treturn resolved.filter(r => !isUndefined(r))\n}\n", "import { getLogger } from \"@framerjs/shared\"\nimport { z } from \"zod/v4\"\nimport type { AgentInteractionHandle } from \"../../../raindrop/AgentInteraction.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"../../../tracing/openRouterTrace.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport type { AIFontFamily, AIFontFamilyWithReason } from \"../fonts.ts\"\nimport { type FontFamilyPicker, pickFontFamilies, pickFontFamiliesByName } from \"./fontPicker.ts\"\nimport {\n\tbuildFontFamilyCatalogEntries,\n\tfontDescriptors,\n\tgetFontFamilyCandidates,\n\thydrateFontFamilyPicks,\n\trankFontFamilyCandidatesByDescriptors,\n} from \"./utils.ts\"\n\n/**\n * Human-readable descriptions for font descriptors used in the system prompt.\n * Category, style, and weight descriptors are listed individually.\n *\n * Note: Features + Variation axes are not included here as they are more complex and utilise the mustHave enum and mustHaveAlterativeCharacters list combined model knowledge instead\n */\nexport const fontDescriptorDescriptions: Record<string, string> = {\n\tserif: \"Serif family.\",\n\t\"sans-serif\": \"Sans-serif family.\",\n\tslab: \"Slab-serif family.\",\n\tmonospace: \"Monospace family.\",\n\tdisplay: \"Display/heading-oriented family.\",\n\thandwriting: \"Handwriting/script style family.\",\n\tnormal: \"Normal style available.\",\n\titalic: \"Italic styles available.\",\n\tthin: \"Thin weight (100) available.\",\n\t\"extra-light\": \"Extra light weight available (200).\",\n\tlight: \"Light weight (300) available.\",\n\tregular: \"Regular/normal weight (400) available.\",\n\tmedium: \"Medium weight (500) available.\",\n\tsemibold: \"Semi bold weight (600) available.\",\n\tbold: \"Bold weight (700) available.\",\n\t\"extra-bold\": \"Extra bold weight (800) available.\",\n\tblack: \"Black/heavy weight (900) available.\",\n}\n\nexport const FontSearchQuerySchema = z.object({\n\tname: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(`Find a specific font by name. Mutually exclusive with ${escapeValue(\"query\")}.`),\n\tquery: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(`Style description for finding fonts. Mutually exclusive with ${escapeValue(\"name\")}.`),\n\tlimit: z\n\t\t.number()\n\t\t.optional()\n\t\t.describe(`Number of results. Required with ${escapeValue(\"query\")}.`),\n\tmustHave: z\n\t\t.array(z.enum(fontDescriptors))\n\t\t.optional()\n\t\t.describe(`Required descriptors. Only used with ${escapeValue(\"query\")}.`),\n\tmustHaveAlternativeCharacters: z\n\t\t.array(z.string())\n\t\t.optional()\n\t\t.describe(`Characters needing alternates. Only used with ${escapeValue(\"query\")}.`),\n})\nexport type FontSearchOptions = z.infer<typeof FontSearchQuerySchema>\n\ninterface QueryFontsParams {\n\tcontextFontFamilies: AIFontFamily[]\n\tsearch: FontSearchOptions\n\tpickFontFamilies?: FontFamilyPicker\n\ttraceConfig: OpenRouterFeatureStepTraceConfig\n\tparentInteraction?: AgentInteractionHandle\n\tdisableRaindropTelemetry?: boolean\n}\n\nconst log = getLogger(\"ai:agents:fonts\")\n\n/**\n * Searches for font families matching the given query and descriptors.\n *\n * Name searches are resolved locally. Descriptive searches go through the full\n * pipeline: build candidates, filter by descriptors, let the LLM picker select\n * best matches, and hydrate with full font family data.\n */\nexport async function queryFonts({\n\tsearch,\n\tcontextFontFamilies,\n\tpickFontFamilies: pickFontFamiliesOverride = pickFontFamilies,\n\ttraceConfig,\n\tparentInteraction,\n\tdisableRaindropTelemetry,\n}: QueryFontsParams): Promise<AIFontFamilyWithReason[]> {\n\tlog.info(\"Font search requested\", { search, contextFontFamiliesCount: contextFontFamilies.length })\n\n\tconst excludedFamilyNames = new Set(contextFontFamilies.map(f => f.name))\n\tconst candidates = await getFontFamilyCandidates(excludedFamilyNames)\n\n\tif (search.name) {\n\t\tconst picks = await pickFontFamiliesByName({ search, catalog: candidates, traceConfig })\n\t\treturn hydrateFontFamilyPicks(picks)\n\t}\n\n\tconst rankedCandidates = rankFontFamilyCandidatesByDescriptors(candidates, search)\n\n\tconst catalog = buildFontFamilyCatalogEntries(rankedCandidates)\n\tlog.info(\"Built catalog entries:\", catalog.length, {\n\t\trankedCandidates,\n\t\tcatalog,\n\t\tinitialCatalog: candidates,\n\t})\n\n\tconst picks = await pickFontFamiliesOverride({\n\t\tsearch,\n\t\tcatalog,\n\t\ttraceConfig,\n\t\tparentInteraction,\n\t\tdisableRaindropTelemetry,\n\t})\n\n\tconst hydratedPicks = await hydrateFontFamilyPicks(picks)\n\tlog.info(\"Final font picks after hydration:\", hydratedPicks.length, { picks: hydratedPicks })\n\n\treturn hydratedPicks\n}\n", "import { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert, ModuleType, getLogger, localModuleIdForStableName } from \"@framerjs/shared\"\nimport { bundleDataAttr, importMapDataAttr, mainBundleName, mainTagId } from \"@framerjs/shared/src/ssg/constants.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { ColorStyleTokenListNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport type { LoadedLayoutTemplateNode } from \"document/models/CanvasTree/nodes/LayoutTemplateNode.ts\"\nimport { getExportTokenCSSRules } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport type { ModulesStoreSnapshot } from \"document/stores/ModulesStore.ts\"\nimport { framerCSSMarker } from \"library/index.ts\"\nimport { extendImportMap, getStaticImportMap } from \"modules/importMapManager.ts\"\nimport { defaultFontSites } from \"renderer/setDefaultFont.ts\"\nimport { getRouterLocales } from \"utils/getRouterLocales.ts\"\nimport { createLocalModuleImportMap } from \"./exportToHTML.ts\"\nimport { generateFonts } from \"./generateFonts.ts\"\nimport { globalStylesForExport } from \"./globalStylesForExport.ts\"\n\nconst log = getLogger(\"exportLayoutTemplate\")\n\nexport async function generateLayoutTemplateHTMLForScreenshot({\n\tengine,\n\tscopeNode,\n}: {\n\tengine: VekterEngine\n\tscopeNode: LoadedLayoutTemplateNode\n}): Promise<string> {\n\tconst modulesSnapshot = engine.stores.modulesStore.takeSnapshot()\n\tconst componentLoaderSnapshot = new ComponentLoader(engine.componentLoader)\n\n\tconst moduleLocalId = localModuleIdForStableName(ModuleType.LayoutTemplate, scopeNode.id)\n\tconst persistedModule = modulesSnapshot.getPersistedModuleByLocalId(moduleLocalId)\n\tassert(persistedModule, \"Layout template module must exist\")\n\tconst moduleURL = persistedModule.moduleURL\n\n\tconst importMap = getLayoutTemplateImportMap(engine, modulesSnapshot)\n\n\tconst { fontCSS, fontLinkTags } = await generateFonts(\n\t\tcomponentLoaderSnapshot,\n\t\tmodulesSnapshot,\n\t\tengine.stores.assetStore,\n\t\t[],\n\t\t[scopeNode],\n\t)\n\n\tconst tree = engine.stores.treeStore.tree\n\tconst tokenCSS = getExportTokenCSSRules(ColorStyleTokenListNode.getAllTokenNodes(tree)).join(\"\\n\")\n\n\treturn createLayoutTemplateHTMLFromTemplate({\n\t\tadaptLayoutToTextDirection: tree.root.adaptLayoutToTextDirection,\n\t\tfontCSS,\n\t\tfontLinkTags,\n\t\timportMap: JSON.stringify(importMap),\n\t\tlanguage: tree.root.webMetadata?.language,\n\t\tlocales: JSON.stringify(getRouterLocales(tree, \"excludeDrafts\")),\n\t\tmoduleURL,\n\t\ttokenCSS,\n\t})\n}\n\nfunction getLayoutTemplateImportMap(engine: VekterEngine, modulesSnapshot: ModulesStoreSnapshot) {\n\tconst importMap = extendImportMap(\n\t\tgetStaticImportMap(\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.reactBuild,\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.reactVersionOverride,\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.schedulerVersionOverride,\n\t\t),\n\t\tcreateLocalModuleImportMap(modulesSnapshot),\n\t)\n\n\tconst userImportMapContent = modulesSnapshot.dependenciesModule?.importMapContent\n\tif (!userImportMapContent) return importMap\n\n\ttry {\n\t\tconst userImportMap = JSON.parse(userImportMapContent)\n\t\tif (userImportMap?.imports) return extendImportMap(importMap, userImportMap)\n\t} catch (error) {\n\t\tlog.warn(\"Failed to parse user import map content\", { error })\n\t}\n\n\treturn importMap\n}\n\nfunction createLayoutTemplateHTMLFromTemplate({\n\tadaptLayoutToTextDirection,\n\tfontCSS,\n\tfontLinkTags,\n\timportMap,\n\tlanguage,\n\tlocales,\n\tmoduleURL,\n\ttokenCSS,\n}: {\n\tadaptLayoutToTextDirection: boolean\n\tfontCSS: string\n\tfontLinkTags: string[]\n\timportMap: string\n\tlanguage: string | undefined\n\tlocales: string\n\tmoduleURL: string\n\ttokenCSS: string\n}): string {\n\tconst escapedModuleURL = JSON.stringify(moduleURL)\n\n\treturn /* html */ `<!doctype html>\n<!-- Made in Framer \u00B7 framer.com \u2728 -->\n<html${language ? ` lang=\"${language}\"` : \"\"}>\n<head>\n\t<meta charset=\"utf-8\">\n\t<script type=\"importmap\" ${importMapDataAttr}>${importMap}</script>\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<style ${framerCSSMarker}>\n\t\t${globalStylesForExport.trimStart()}\n\t\t${defaultFontSites}\n\t\t${tokenCSS}\n\t</style>\n\t<style data-framer-font-css>${fontCSS}</style>\n\t${fontLinkTags.join(\"\\n    \")}\n</head>\n<body>\n\t<div id=\"${mainTagId}\"></div>\n\t<script>typeof document<\"u\"&&(window.process={...window.process,env:{...window.process?.env,NODE_ENV:\"production\"}});</script>\n\t<script type=\"module\" async ${bundleDataAttr}=\"${mainBundleName}\">\n\t\timport * as React from \"react\"\n\t\timport * as ReactDOM from \"react-dom/client\"\n\t\timport * as Framer from \"framer\"\n\n\t\twindow.__framer_events = window.__framer_events || []\n\t\twindow.__framer_importFromPackage = (packageAndFilename, exportIdentifier) => () => {\n\t\t\treturn React.createElement(Framer.ErrorPlaceholder, {\n\t\t\t\terror: 'Package component not supported: \"' + exportIdentifier + '\" in \"' + packageAndFilename + '\"',\n\t\t\t})\n\t\t}\n\n\t\tFramer.initLazyModulesCache?.()\n\t\tFramer.installFlexboxGapWorkaroundIfNeeded?.()\n\n\t\tconst mod = await import(${escapedModuleURL})\n\t\tconst LayoutTemplateComponent = mod.default ?? mod.Component\n\t\tif (!LayoutTemplateComponent) throw new Error(\"Layout template module does not expose a default export\")\n\n\t\tconst previewRouteId = \"layout-template-preview\"\n\t\tconst locales = ${locales}\n\t\tconst PlaceholderPage = () => React.createElement(\"div\", { style: { flex: \"1 0 0px\", background: \"transparent\" } })\n\t\tconst NotFoundPage = () => null\n\t\tconst LayoutTemplate = ({ webPageId, children, style }) => {\n\t\t\tif (webPageId !== previewRouteId) return children(false)\n\t\t\treturn React.createElement(LayoutTemplateComponent, { style }, children(true))\n\t\t}\n\n\t\tconst routes = {\n\t\t\t[previewRouteId]: {\n\t\t\t\tpath: \"/\",\n\t\t\t\tpage: PlaceholderPage,\n\t\t\t},\n\t\t}\n\n\t\tconst container = document.getElementById(\"${mainTagId}\")\n\t\tReactDOM.createRoot(container).render(\n\t\t\tReact.createElement(Framer.PageRoot, {\n\t\t\t\tisWebsite: true,\n\t\t\t\tenvironment: \"site\",\n\t\t\t\trouteId: previewRouteId,\n\t\t\t\tpathVariables: {},\n\t\t\t\troutes,\n\t\t\t\tcollectionUtils: undefined,\n\t\t\t\tframerSiteId: undefined,\n\t\t\t\tnotFoundPage: NotFoundPage,\n\t\t\t\tlocaleId: locales[0]?.id,\n\t\t\t\tlocales,\n\t\t\t\tadaptLayoutToTextDirection: ${JSON.stringify(adaptLayoutToTextDirection)},\n\t\t\t\tLayoutTemplate,\n\t\t\t})\n\t\t)\n\t</script>\n</body>\n</html>\n`\n}\n", "import { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert, ModuleType, getLogger, localModuleIdForStableName } from \"@framerjs/shared\"\nimport { bundleDataAttr, importMapDataAttr, mainBundleName, mainTagId } from \"@framerjs/shared/src/ssg/constants.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { ColorStyleTokenListNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport type { LoadedSmartComponentNode } from \"document/models/CanvasTree/nodes/SmartComponentNode.ts\"\nimport { isFrameNode, isSmartComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isTopLevelVariant, isVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { getExportTokenCSSRules } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport type { ModulesStoreSnapshot } from \"document/stores/ModulesStore.ts\"\nimport { framerCSSMarker } from \"library/index.ts\"\nimport { extendImportMap, getStaticImportMap, getTailscaleScreenshotImportMap } from \"modules/importMapManager.ts\"\nimport { defaultFontSites } from \"renderer/setDefaultFont.ts\"\nimport { createLocalModuleImportMap } from \"./exportToHTML.ts\"\nimport { generateFonts } from \"./generateFonts.ts\"\nimport { globalStylesForExport } from \"./globalStylesForExport.ts\"\n\nconst log = getLogger(\"exportSmartComponent\")\n\n/**\n * Generates a minimal standalone HTML document that renders a single smart\n * component variant. Unlike {@link generateHTML}, the output is not a site \u2014\n * there is no router, page metadata, or SSG plumbing. The only goal is to\n * produce a visually faithful render of the target variant so that an agent\n * screenshot can be taken against it.\n *\n * The render contract mirrors the in-app smart component preview: render the\n * smart component's {@link ModuleType.Canvas} module, passing the variant node\n * id through the `variant` prop.\n */\nexport async function generateSmartComponentVariantHTMLForScreenshot({\n\tengine,\n\tscopeNode,\n\tvariantNodeId,\n}: {\n\tengine: VekterEngine\n\tscopeNode: LoadedSmartComponentNode\n\tvariantNodeId: NodeID\n}): Promise<string> {\n\tassertIsTopLevelVariantOf(engine, scopeNode, variantNodeId)\n\n\tconst modulesSnapshot = engine.stores.modulesStore.takeSnapshot()\n\tconst componentLoaderSnapshot = new ComponentLoader(engine.componentLoader)\n\n\tconst moduleLocalId = localModuleIdForStableName(ModuleType.Canvas, scopeNode.id)\n\tconst persistedModule = modulesSnapshot.getPersistedModuleByLocalId(moduleLocalId)\n\tassert(persistedModule, \"Smart component module must exist\")\n\tconst moduleURL = persistedModule.moduleURL\n\n\tlet importMap = getSmartComponentImportMap(engine, modulesSnapshot)\n\n\t// Start the server with `TAILSCALE_URL` local tunnel in order to serve local dev assets to the screenshot agent\n\tconst tailscaleScreenshotImportMap = getTailscaleScreenshotImportMap()\n\tif (tailscaleScreenshotImportMap) {\n\t\timportMap = extendImportMap(importMap, tailscaleScreenshotImportMap, \"source-wins\")\n\t}\n\n\tconst { fontCSS, fontLinkTags } = await generateFonts(\n\t\tcomponentLoaderSnapshot,\n\t\tmodulesSnapshot,\n\t\tengine.stores.assetStore,\n\t\t[scopeNode],\n\t\t[],\n\t)\n\n\tconst tree = engine.stores.treeStore.tree\n\tconst tokenCSS = getExportTokenCSSRules(ColorStyleTokenListNode.getAllTokenNodes(tree)).join(\"\\n\")\n\n\treturn createSmartComponentHTMLFromTemplate({\n\t\timportMap: JSON.stringify(importMap),\n\t\ttokenCSS,\n\t\tfontCSS,\n\t\tfontLinkTags,\n\t\tlanguage: tree.root.webMetadata?.language,\n\t\tmoduleURL,\n\t\tvariantNodeId,\n\t})\n}\n\nfunction getSmartComponentImportMap(engine: VekterEngine, modulesSnapshot: ModulesStoreSnapshot) {\n\tconst importMap = extendImportMap(\n\t\tgetStaticImportMap(\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.reactBuild,\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.reactVersionOverride,\n\t\t\tengine.stores.debugStore.debuggingOfPublishedSites.schedulerVersionOverride,\n\t\t),\n\t\tcreateLocalModuleImportMap(modulesSnapshot),\n\t)\n\n\tconst userImportMapContent = modulesSnapshot.dependenciesModule?.importMapContent\n\tif (!userImportMapContent) return importMap\n\n\ttry {\n\t\tconst userImportMap = JSON.parse(userImportMapContent)\n\t\tif (userImportMap?.imports) return extendImportMap(importMap, userImportMap)\n\t} catch (error) {\n\t\tlog.warn(\"Failed to parse user import map content\", { error })\n\t}\n\n\treturn importMap\n}\n\nfunction assertIsTopLevelVariantOf(engine: VekterEngine, scopeNode: LoadedSmartComponentNode, variantNodeId: NodeID) {\n\tconst variantNode = engine.stores.treeStore.tree.get(variantNodeId)\n\tassert(variantNode, \"Variant node must exist\")\n\tassert(isFrameNode(variantNode) && isVariant(variantNode), \"Variant node must be a frame variant\")\n\tassert(variantNode.parentid === scopeNode.id, \"Variant node must be a direct child of the smart component scope\")\n\tassert(isTopLevelVariant(variantNode), \"Variant node must be a top-level variant\")\n}\n\n/**\n * The renderer mirrors the smart component preview contract\n * used by `getRenderInfoForPreviewItem()` / `ComponentPreview`: render the\n * smart component's default export and pass the variant id via the `variant`\n * prop (which is a `ControlType.Enum` keyed off variant node ids).\n */\nfunction createSmartComponentHTMLFromTemplate({\n\timportMap,\n\ttokenCSS,\n\tfontCSS,\n\tfontLinkTags,\n\tlanguage,\n\tmoduleURL,\n\tvariantNodeId,\n}: {\n\timportMap: string\n\ttokenCSS: string\n\tfontCSS: string\n\tfontLinkTags: string[]\n\tlanguage: string | undefined\n\tmoduleURL: string\n\tvariantNodeId: NodeID\n}): string {\n\tconst escapedModuleURL = JSON.stringify(moduleURL)\n\tconst escapedVariantId = JSON.stringify(variantNodeId)\n\n\treturn /* html */ `<!doctype html>\n<!-- Made in Framer \u00B7 framer.com \u2728 -->\n<html${language ? ` lang=\"${language}\"` : \"\"}>\n<head>\n\t<meta charset=\"utf-8\">\n\t<script type=\"importmap\" ${importMapDataAttr}>${importMap}</script>\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<style ${framerCSSMarker}>\n\t\t${globalStylesForExport.trimStart()}\n\t\t${defaultFontSites}\n\t\t${tokenCSS}\n\t\t/* Smart component canvas/preview renders inside a bounded container, so\n\t\t   clip overflow here to keep the screenshot matching that framing. */\n\t\thtml, body { overflow: clip; }\n\t</style>\n\t<style data-framer-font-css>${fontCSS}</style>\n\t${fontLinkTags.join(\"\\n    \")}\n</head>\n<body>\n\t<div id=\"${mainTagId}\"></div>\n\t<script>typeof document<\"u\"&&(window.process={...window.process,env:{...window.process?.env,NODE_ENV:\"production\"}});</script>\n\t<script type=\"module\" async ${bundleDataAttr}=\"${mainBundleName}\">\n\t\timport * as React from \"react\"\n\t\timport * as ReactDOM from \"react-dom/client\"\n\t\timport * as Framer from \"framer\"\n\n\t\t// The smart component modules expect these globals in the same way as published sites.\n\t\twindow.__framer_events = window.__framer_events || []\n\t\twindow.__framer_importFromPackage = (packageAndFilename, exportIdentifier) => () => {\n\t\t\treturn React.createElement(Framer.ErrorPlaceholder, {\n\t\t\t\terror: 'Package component not supported: \"' + exportIdentifier + '\" in \"' + packageAndFilename + '\"',\n\t\t\t})\n\t\t}\n\n\t\tFramer.initLazyModulesCache?.()\n\t\tFramer.installFlexboxGapWorkaroundIfNeeded?.()\n\n\t\tconst mod = await import(${escapedModuleURL})\n\t\tconst Component = mod.default ?? mod.Component\n\t\tif (!Component) throw new Error(\"Smart component module does not expose a default export\")\n\n\t\tconst container = document.getElementById(\"${mainTagId}\")\n\t\tconst element = React.createElement(Component, { variant: ${escapedVariantId} })\n\t\tReactDOM.createRoot(container).render(element)\n\t</script>\n</body>\n</html>\n`\n}\n\nexport function isScreenshotableSmartComponentVariant(node: CanvasNode | null | undefined, scope: CanvasNode): boolean {\n\tif (!node) return false\n\tif (!isSmartComponentNode(scope)) return false\n\tif (!isFrameNode(node) || !isVariant(node)) return false\n\treturn node.parentid === scope.id\n}\n", "import { isObject } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { useCompressionStream } from \"web/pages/project/lib/compressionStream.ts\"\nimport { z } from \"zod/v4\"\n\nexport const AgentScreenshotThemeSchema = z.enum([\"light\", \"dark\"])\nexport type AgentScreenshotTheme = z.infer<typeof AgentScreenshotThemeSchema>\n\ninterface AgentScreenshotRequestBase {\n\tselectors: string[]\n\ttheme: AgentScreenshotTheme\n\tviewport?: {\n\t\twidth: number\n\t\theight: number\n\t}\n}\n\ninterface AgentScreenshotHTMLRequest extends AgentScreenshotRequestBase {\n\thtmlBase64: string\n\turl?: never\n}\n\ninterface AgentScreenshotURLRequest extends AgentScreenshotRequestBase {\n\thtmlBase64?: never\n\turl: string\n}\n\nexport type AgentScreenshotRequest = AgentScreenshotHTMLRequest | AgentScreenshotURLRequest\n\ninterface SuccessResult {\n\turl: string\n}\ninterface ErrorResult {\n\terror: {\n\t\tcode: string\n\t\tmessage: string\n\t}\n}\n\ntype AgentScreenshotSelectorResult = SuccessResult | ErrorResult\n\nexport interface AgentScreenshotResponse {\n\tresults: Record<string, AgentScreenshotSelectorResult>\n}\n\nfunction encodeBytesToBase64(bytes: Uint8Array): string {\n\tconst binaryChunks: string[] = []\n\tconst chunkSize = 0x8000\n\tfor (let i = 0; i < bytes.length; i += chunkSize) {\n\t\tbinaryChunks.push(String.fromCharCode(...bytes.subarray(i, i + chunkSize)))\n\t}\n\treturn btoa(binaryChunks.join(\"\"))\n}\n\nexport async function encodeHTMLForScreenshotting(html: string): Promise<string> {\n\tif (!useCompressionStream) {\n\t\treturn encodeBytesToBase64(new TextEncoder().encode(html))\n\t}\n\n\ttry {\n\t\tconst gzip = new window.CompressionStream(\"gzip\")\n\t\tconst input = new Blob([html], { type: \"text/html; charset=utf-8\" })\n\t\tconst compressed = await new Response(input.stream().pipeThrough(gzip)).arrayBuffer()\n\t\treturn encodeBytesToBase64(new Uint8Array(compressed))\n\t} catch {\n\t\treturn encodeBytesToBase64(new TextEncoder().encode(html))\n\t}\n}\n\nconst successResultKey = \"url\" satisfies keyof SuccessResult\nexport function isSuccessResult(result: unknown): result is SuccessResult {\n\treturn isObject(result) && successResultKey in result\n}\n\nexport async function requestAgentScreenshot(request: AgentScreenshotRequest): Promise<AgentScreenshotResponse> {\n\treturn apiFetcher.post(\"/web/agents/screenshot\", request)\n}\n\nexport function isAgentScreenshotURLRequest(request: AgentScreenshotRequest): request is AgentScreenshotURLRequest {\n\treturn \"url\" in request\n}\n\nexport function isAgentScreenshotHTMLRequest(request: AgentScreenshotRequest): request is AgentScreenshotHTMLRequest {\n\treturn \"htmlBase64\" in request\n}\n", "import type { PatchedDeploymentTreeState } from \"@framerjs/app-shared/src/Deployments.ts\"\nimport { ResolvablePromise, assert, getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { nodeNeedsContainer } from \"code-generation/utils/builtInCodeComponents.ts\"\nimport { createFramerClassName, RuleType } from \"code-generation/utils/createFramerClassName.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { getWebPagePath } from \"document/components/utils/getWebPagePath.ts\"\nimport type { CanvasNode, NodeID, ScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport type { LoadedScopeNode } from \"document/models/CanvasTree/nodes/ScopeNode.ts\"\nimport {\n\tisLayoutTemplateNode,\n\tisSmartComponentNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getGeneratedValue } from \"document/models/CanvasTree/traits/Generated.ts\"\nimport { hasCollectionDataSource } from \"document/models/CanvasTree/traits/WithCollectionDataSource.ts\"\nimport { isBreakpointVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport type { PublishStore } from \"document/stores/PublishStore.ts\"\nimport { getFramerRelease } from \"environment/getFramerRelease.ts\"\nimport { generateLayoutTemplateHTMLForScreenshot } from \"export/exportLayoutTemplateToHTMLForScreenshot.ts\"\nimport {\n\tgenerateSmartComponentVariantHTMLForScreenshot,\n\tisScreenshotableSmartComponentVariant,\n} from \"export/exportSmartComponentToHTMLForScreenshot.ts\"\nimport { generateHTML } from \"export/exportToHTML.ts\"\nimport { isTailscaleScreenshotConfigured } from \"modules/importMapManager.ts\"\nimport { getSamplePathVariablesForCMSPage } from \"utils/collectionUtils.ts\"\nimport { isObject } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport type { TreeResolver } from \"../../TreeResolver.ts\"\nimport type { ChatPart, EmitChatPart, ChatPartUpdater } from \"../../types.ts\"\nimport { SCREENSHOT_QUERY } from \"../readProjectQueryTypes.ts\"\nimport { getPublishUrlsFromPublishStore } from \"./getPublishUrls.ts\"\nimport {\n\tAgentScreenshotThemeSchema,\n\tencodeHTMLForScreenshotting,\n\tisSuccessResult,\n\trequestAgentScreenshot,\n\ttype AgentScreenshotResponse,\n\ttype AgentScreenshotRequest,\n\ttype AgentScreenshotTheme,\n\tisAgentScreenshotURLRequest,\n} from \"./requestAgentScreenshot.ts\"\nimport { wrapExecutionInChatPartUpdater } from \"./wrapExecutionInUpdater.ts\"\n\nconst log = getLogger(\"ai:agents:screenshots\")\n\nexport const ExternalScreenshotRequestSchema = z.object({\n\turl: z.string(),\n\ttheme: AgentScreenshotThemeSchema.optional(),\n\tviewport: z\n\t\t.object({\n\t\t\twidth: z.number(),\n\t\t\theight: z.number(),\n\t\t})\n\t\t.optional(),\n})\n\nexport const NodeScreenshotRequestSchema = z.object({\n\tid: z.string(),\n\ttheme: AgentScreenshotThemeSchema.optional(),\n})\n\ntype ExternalScreenshotRequest = z.infer<typeof ExternalScreenshotRequestSchema>\ntype NodeScreenshotRequest = z.infer<typeof NodeScreenshotRequestSchema>\n\nexport const ScreenshotRequestSchema = z.union([ExternalScreenshotRequestSchema, NodeScreenshotRequestSchema])\n\ninterface ImageUrl {\n\timage_url: string\n}\n\ninterface NodeImageUrl extends ImageUrl {\n\tid: string\n}\n\nexport type Request = z.infer<typeof ScreenshotRequestSchema>\n\nconst imageUrlKey = \"image_url\" satisfies keyof ImageUrl\nexport function isScreenshotResult(result: unknown): result is SuccessResponse {\n\treturn isObject(result) && imageUrlKey in result\n}\n\nconst nodeImageUrlIdKey = \"id\" satisfies keyof NodeImageUrl\nexport function isNodeScreenshotResult(result: unknown): result is NodeImageUrl {\n\treturn isScreenshotResult(result) && nodeImageUrlIdKey in result\n}\n\ninterface ErrorResult {\n\tid?: string\n\turl?: string\n\ttheme?: AgentScreenshotTheme\n\terror: string\n}\n\ntype URLResult =\n\t| { url: string; theme: AgentScreenshotTheme; image_url: string; viewport?: { width: number; height: number } }\n\t| ({ url: string } & ErrorResult)\n\ntype NodeResult = { id: string; theme: AgentScreenshotTheme; image_url: string } | ({ id: string } & ErrorResult)\n\ninterface RedactedResult {\n\tredacted: true\n\treason: string\n}\n\nexport type Response = { type: typeof SCREENSHOT_QUERY } & (URLResult | NodeResult | ErrorResult | RedactedResult)\ntype SuccessResponse = Extract<Response, { image_url: string }>\n\ninterface PendingNodeRequest {\n\tid: NodeID\n\ttheme: AgentScreenshotTheme\n\tpromise: ResolvablePromise<Response>\n}\n\nexport function createErrorResult(request: Request, error: string): Response {\n\treturn isUrlRequest(request)\n\t\t? { type: SCREENSHOT_QUERY, url: request.url, theme: request.theme, viewport: request.viewport, error }\n\t\t: { type: SCREENSHOT_QUERY, id: request.id, theme: request.theme, error }\n}\n\n/** For internal screenshots even complex pages are well within this timeout, so waiting longer is unlikely to yield a result */\nconst DEFAULT_SCREENSHOT_TIMEOUT_MS = 15_000\n/** External URLs are less predictable so we wait longer */\nconst EXTERNAL_SCREENSHOT_TIMEOUT_MS = 30_000\nconst DEFAULT_VIEWPORT = { width: 1200, height: 1080 } as const\n\nconst urlKey = \"url\" satisfies keyof ExternalScreenshotRequest\nfunction isUrlRequest(request: Request): request is ExternalScreenshotRequest {\n\treturn urlKey in request\n}\n\nconst idKey = \"id\" satisfies keyof NodeScreenshotRequest\nfunction isNodeRequest(request: Request): request is NodeScreenshotRequest {\n\treturn idKey in request\n}\n\nconst genericError = \"Failed to capture screenshot\"\n\ntype NodeThemeKey = `${NodeID}:${AgentScreenshotTheme}`\ntype ScreenshotBlockingTask = Extract<ChatPart, { type: \"blocking-task\" }>\n\nexport class AgentScreenshots {\n\t/** Theme is part of the request identity, so key by node id + theme. */\n\tprivate readonly pendingNodeRequestsByKey = new Map<NodeThemeKey, PendingNodeRequest>()\n\tprivate readonly encodedHTMLCache = new Map<string, string>()\n\tprivate readonly uiUpdatesByScope = new Map<\n\t\tNodeID,\n\t\t{\n\t\t\tpart: ChatPartUpdater<Extract<ChatPart, { type: \"blocking-task\" }>> | undefined\n\t\t\trequestKeys?: Set<NodeThemeKey>\n\t\t\taccumulatedImageUrls: string[]\n\t\t\tpendingBatchCount: number\n\t\t}\n\t>()\n\n\tconstructor(\n\t\tprivate readonly engine: VekterEngine,\n\t\treadonly treeResolver: TreeResolver,\n\t\tprivate readonly onPart?: EmitChatPart,\n\t\tprivate readonly onCaptureScreenshot?: (response: Promise<Response>) => void,\n\t) {}\n\n\tasync createRequest(request: Request): Promise<Response> {\n\t\tif (isUrlRequest(request)) {\n\t\t\tconst theme = request.theme ?? (this.engine.stores.documentSettingsStore.hasDarkAppearance ? \"dark\" : \"light\")\n\t\t\tconst url = new URL(request.url)\n\t\t\tassertURLIsValidTarget(url, this.engine.stores.publishStore)\n\t\t\tconst response = await wrapExecutionInChatPartUpdater<\n\t\t\t\tSuccess | { status: \"timeout\" } | { status: \"error\" },\n\t\t\t\tScreenshotBlockingTask\n\t\t\t>(\n\t\t\t\tthis.onPart,\n\t\t\t\t{\n\t\t\t\t\ttype: \"blocking-task\",\n\t\t\t\t\ttask: \"screenshot\",\n\t\t\t\t\tmessage: formatScreenshotUrlMessage(url, this.engine.stores.publishStore),\n\t\t\t\t},\n\t\t\t\trequestAgentScreenshotWithTimeout({\n\t\t\t\t\turl: url.toString(),\n\t\t\t\t\tselectors: [\"body\"],\n\t\t\t\t\ttheme,\n\t\t\t\t\tviewport: request.viewport ?? DEFAULT_VIEWPORT,\n\t\t\t\t}),\n\t\t\t\ttaskResult => {\n\t\t\t\t\tconst results =\n\t\t\t\t\t\ttaskResult.status === \"ok\" && isSuccessResult(taskResult.results.body) ? taskResult.results : undefined\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t...(results ? { results } : {}),\n\t\t\t\t\t\t\timageUrls: extractUrlsOnSuccess(results),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tif (response.status !== \"ok\") {\n\t\t\t\tthrow new Error(response.status === \"timeout\" ? \"Screenshot request timed out\" : genericError)\n\t\t\t} else if (!isSuccessResult(response.results.body)) {\n\t\t\t\tthrow new Error(response.results.body?.error.message ?? genericError)\n\t\t\t} else {\n\t\t\t\tconst result = response.results.body\n\t\t\t\treturn { type: SCREENSHOT_QUERY, url: request.url, image_url: result.url, viewport: request.viewport, theme }\n\t\t\t}\n\t\t}\n\n\t\tassert(isNodeRequest(request), \"Invalid screenshot request\")\n\t\t// A Tailscale funnel (TAILSCALE_URL) exposes the local dev server, so the remote\n\t\t// screenshot service can reach it even when running from the framer tunnel.\n\t\tassert(\n\t\t\tisNotTunnel() || isTailscaleScreenshotConfigured(),\n\t\t\t\"Internal screenshots cannot be captured from the tunnel currently, failing fast\",\n\t\t)\n\n\t\tconst resolvedNode = this.treeResolver.get(request.id)\n\t\tassert(resolvedNode, `Node \"${request.id}\" not found`)\n\n\t\tconst nodeId = resolvedNode.id\n\t\tconst theme = request.theme ?? (this.engine.stores.documentSettingsStore.hasDarkAppearance ? \"dark\" : \"light\")\n\n\t\tconst nodeRequestKey: NodeThemeKey = `${nodeId}:${theme}`\n\t\tconst existing = this.pendingNodeRequestsByKey.get(nodeRequestKey)\n\t\tif (existing) {\n\t\t\tthis.captureScreenshot(existing.promise)\n\t\t\treturn existing.promise\n\t\t}\n\n\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(nodeId)\n\t\tassert(scopeNode, \"Scope node not found\")\n\n\t\tconst promise = new ResolvablePromise<Response>()\n\t\tthis.pendingNodeRequestsByKey.set(nodeRequestKey, { id: nodeId, theme, promise })\n\t\tthis.captureScreenshot(promise)\n\t\treturn promise\n\t}\n\n\t/**\n\t * Aggregate the screenshots by the scope node, even though it may be processed based on the\n\t * breakpoint.\n\t */\n\tprivate updateUIForAggregateNode(aggregateNode: ScopeNode, requestKey: NodeThemeKey): void {\n\t\tif (!isWebPageNode(aggregateNode) && !isSmartComponentNode(aggregateNode) && !isLayoutTemplateNode(aggregateNode)) {\n\t\t\treturn\n\t\t}\n\t\tconst existing = this.uiUpdatesByScope.get(aggregateNode.id)\n\t\tif (existing) {\n\t\t\texisting.requestKeys?.add(requestKey)\n\t\t\treturn\n\t\t}\n\t\tconst message = this.messageForAggregateScope(aggregateNode)\n\t\tthis.uiUpdatesByScope.set(aggregateNode.id, {\n\t\t\tpart: this.onPart?.({\n\t\t\t\ttype: \"blocking-task\",\n\t\t\t\ttask: \"screenshot\",\n\t\t\t\tmessage,\n\t\t\t})?.ui,\n\t\t\trequestKeys: new Set([requestKey]),\n\t\t\taccumulatedImageUrls: [],\n\t\t\tpendingBatchCount: 0,\n\t\t})\n\t}\n\n\tprivate messageForAggregateScope(scope: ScopeNode): string {\n\t\tconst tree = this.engine.stores.treeStore.tree\n\t\tif (isWebPageNode(scope)) {\n\t\t\tif (scope.id === tree.root.homePageNodeId) return Dictionary.Home\n\t\t\treturn getWebPagePath(tree, scope) ?? Dictionary.Page\n\t\t}\n\t\tif (isLayoutTemplateNode(scope)) {\n\t\t\treturn getGeneratedValue(scope.name) ?? Dictionary.Template\n\t\t}\n\t\t// Smart component: fall back to the component name so the user can\n\t\t// identify which component is being screenshotted.\n\t\treturn getGeneratedValue(scope.name) ?? Dictionary.Component\n\t}\n\n\tprivate updateScopePartIfCompleted(scopeNodeId: NodeID, response?: AgentScreenshotResponse): void {\n\t\tconst scopeUpdate = this.uiUpdatesByScope.get(scopeNodeId)\n\t\tif (!scopeUpdate) return\n\n\t\tconst newUrls = extractUrlsOnSuccess(response?.results)\n\t\tscopeUpdate.accumulatedImageUrls.push(...newUrls)\n\t\tscopeUpdate.pendingBatchCount--\n\n\t\tconst isComplete = scopeUpdate.pendingBatchCount <= 0\n\t\t// Snapshot accumulated URLs so the closure captures the current state,\n\t\t// not a reference that later callbacks may mutate before it executes.\n\t\tconst imageUrls = [...scopeUpdate.accumulatedImageUrls]\n\n\t\t// Progressively update the UI with accumulated image URLs as each batch\n\t\t// completes, so screenshots appear incrementally. Only mark done on the last batch.\n\t\tscopeUpdate.part?.((current, timestamp) => ({\n\t\t\t...current,\n\t\t\t...(isComplete ? { completedAt: timestamp } : {}),\n\t\t\tmetadata: {\n\t\t\t\timageUrls,\n\t\t\t},\n\t\t}))\n\n\t\tif (isComplete) {\n\t\t\tthis.uiUpdatesByScope.delete(scopeNodeId)\n\t\t}\n\t}\n\n\tasync flushRequests(): Promise<void> {\n\t\tconst screenshotBatches = new Map<\n\t\t\tNodeThemeKey,\n\t\t\t{\n\t\t\t\tgroundNodeId: NodeID\n\t\t\t\ttheme: AgentScreenshotTheme\n\t\t\t\ttargets: Map<NodeThemeKey, { id: NodeID; selector: string }>\n\t\t\t}\n\t\t>()\n\n\t\t// Aggregate the pending node requests by ground node and theme.\n\t\t// For page screenshots, the scope node itself is the aggregate node.\n\t\tfor (const [requestKey, { id, theme }] of this.pendingNodeRequestsByKey) {\n\t\t\ttry {\n\t\t\t\tconst node = this.treeResolver.get(id)\n\t\t\t\tassert(node, \"Node not found\")\n\t\t\t\tconst groundNode = this.treeResolver.getGroundNodeFor(node.id)\n\t\t\t\tassert(groundNode, \"Ground node not found\")\n\t\t\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(groundNode.id)\n\t\t\t\tassert(scopeNode, \"Scope node not found\")\n\n\t\t\t\tconst isWholePageCapture =\n\t\t\t\t\tisWebPageNode(node) ||\n\t\t\t\t\tisLayoutTemplateNode(node) ||\n\t\t\t\t\t(isBreakpointVariant(node) && node.parentid === scopeNode.id)\n\n\t\t\t\tlet selector: string | undefined\n\t\t\t\tif (isWholePageCapture) {\n\t\t\t\t\tselector = \"body\"\n\t\t\t\t} else {\n\t\t\t\t\tselector = `.${createFramerClassName(RuleType.Component, node.originalid ?? node.id)}`\n\t\t\t\t\tif (nodeNeedsContainer(node)) {\n\t\t\t\t\t\tselector = `${selector}-container`\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Web pages and layout templates are themselves scope nodes with no rect,\n\t\t\t\t// so when one is requested directly we fall back to its primary breakpoint\n\t\t\t\t// variant for viewport sizing and batching.\n\t\t\t\tconst isScopeNodeRequest =\n\t\t\t\t\t(isWebPageNode(scopeNode) || isLayoutTemplateNode(scopeNode)) && scopeNode.id === groundNode.id\n\t\t\t\tconst breakpointNode = isScopeNodeRequest ? scopeNode.getPrimaryVariant() : groundNode\n\n\t\t\t\tconst key: NodeThemeKey = `${breakpointNode.id}:${theme}`\n\t\t\t\tconst existing = screenshotBatches.get(key)\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.targets.set(requestKey, { id: node.id, selector })\n\t\t\t\t} else {\n\t\t\t\t\tscreenshotBatches.set(key, {\n\t\t\t\t\t\tgroundNodeId: breakpointNode.id,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t\ttargets: new Map([[requestKey, { id: node.id, selector }]]),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthis.updateUIForAggregateNode(scopeNode, requestKey)\n\t\t\t} catch (error) {\n\t\t\t\tthis.pendingNodeRequestsByKey.get(requestKey)?.promise.reject(error)\n\t\t\t}\n\t\t}\n\n\t\t// Update the components for each scope.\n\t\tconst seenSourceNodes = new Set<NodeID>()\n\t\tfor (const { groundNodeId } of screenshotBatches.values()) {\n\t\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(groundNodeId)\n\t\t\tif (!scopeNode || seenSourceNodes.has(scopeNode.id)) continue\n\t\t\tseenSourceNodes.add(scopeNode.id)\n\t\t\tawait this.engine.stores.codeGenerationStore.updateComponent(scopeNode.id)\n\t\t}\n\n\t\t// Wait for the components to be persisted.\n\t\tawait this.engine.stores.codeGenerationStore.persistence.process()\n\n\t\t// Count how many batches each scope expects so updateScopePartIfCompleted\n\t\t// can wait for all of them before emitting the final UI update.\n\t\tfor (const { groundNodeId } of screenshotBatches.values()) {\n\t\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(groundNodeId)\n\t\t\tif (!scopeNode) continue\n\t\t\tconst scopeUpdate = this.uiUpdatesByScope.get(scopeNode.id)\n\t\t\tif (scopeUpdate) scopeUpdate.pendingBatchCount++\n\t\t}\n\n\t\ttry {\n\t\t\t// Request screenshots for each aggregate node + theme in parallel.\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from(screenshotBatches.values(), ({ groundNodeId, theme, targets }) =>\n\t\t\t\t\tthis.requestAggregateScreenshot(theme, groundNodeId, targets)\n\t\t\t\t\t\t.then(response => {\n\t\t\t\t\t\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(groundNodeId)\n\t\t\t\t\t\t\tif (scopeNode) this.updateScopePartIfCompleted(scopeNode.id, response)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\t\t// If the request failed, reject all pending requests for any of the nodes in the batch\n\t\t\t\t\t\t\tfor (const requestKey of targets.keys()) {\n\t\t\t\t\t\t\t\tconst request = this.pendingNodeRequestsByKey.get(requestKey)\n\t\t\t\t\t\t\t\trequest?.promise.reject(error)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst scopeNode = this.treeResolver.getScopeNodeFor(groundNodeId)\n\t\t\t\t\t\t\tif (scopeNode) this.updateScopePartIfCompleted(scopeNode.id)\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t} finally {\n\t\t\tthis.encodedHTMLCache.clear()\n\t\t}\n\t}\n\n\t/**\n\t * Requests one screenshot batch for all selectors that can share a single rendered scope HTML\n\t */\n\tprivate async requestAggregateScreenshot(\n\t\ttheme: AgentScreenshotTheme,\n\t\tbreakpointId: NodeID,\n\t\ttargets: Map<NodeThemeKey, { id: NodeID; selector: string }>,\n\t): Promise<AgentScreenshotResponse> {\n\t\tconst breakpointNode = this.treeResolver.get(breakpointId)\n\t\tconst scopeNode = this.treeResolver.getLookupTree().getScopeNodeFor(breakpointNode)\n\t\tassert(breakpointNode, \"Breakpoint not found\")\n\t\tassert(scopeNode, \"Scope node not found\")\n\n\t\tconst viewport = getScreenshotViewportForCanvasNode(scopeNode, breakpointNode)\n\n\t\t// Smart component variants must be keyed per-variant because the HTML\n\t\t// embeds the variant id; webpages can share a single HTML render\n\t\t// across all descendants of the scope.\n\t\tconst isSmartComponentVariantCapture = isScreenshotableSmartComponentVariant(breakpointNode, scopeNode)\n\t\tconst htmlCacheKey = isSmartComponentVariantCapture ? `${scopeNode.id}:${breakpointNode.id}` : scopeNode.id\n\n\t\tlet encodedHTML = this.encodedHTMLCache.get(htmlCacheKey)\n\t\tif (!encodedHTML) {\n\t\t\tlog.trace(\"Cache miss for scope node\", htmlCacheKey)\n\t\t\tconst html = await generateHTMLForCapture({\n\t\t\t\tengine: this.engine,\n\t\t\t\tscopeNode,\n\t\t\t\tbreakpointNode,\n\t\t\t})\n\t\t\tencodedHTML = await encodeHTMLForScreenshotting(html)\n\t\t\tthis.encodedHTMLCache.set(htmlCacheKey, encodedHTML)\n\t\t} else {\n\t\t\tlog.trace(\"Cache hit for scope node\", htmlCacheKey)\n\t\t}\n\n\t\tconst response = await requestAgentScreenshotWithTimeout({\n\t\t\thtmlBase64: encodedHTML,\n\t\t\tselectors: Array.from(targets.values(), ({ selector }) => selector),\n\t\t\ttheme,\n\t\t\tviewport,\n\t\t})\n\n\t\tif (response.status !== \"ok\") {\n\t\t\tthrow new Error(response.status === \"timeout\" ? \"Screenshot request timed out\" : genericError)\n\t\t} else {\n\t\t\t// Otherwise, resolve the pending requests for the nodes that were successfully captured.\n\t\t\tfor (const [requestKey, { id, selector }] of targets) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = response.results[selector]\n\t\t\t\t\tassert(result, \"Result not found\")\n\t\t\t\t\tif (!isSuccessResult(result)) throw new Error(result.error.message)\n\t\t\t\t\tthis.pendingNodeRequestsByKey\n\t\t\t\t\t\t.get(requestKey)\n\t\t\t\t\t\t?.promise.resolve({ type: SCREENSHOT_QUERY, id: id, image_url: result.url, theme })\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.pendingNodeRequestsByKey.get(requestKey)?.promise.reject(error)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn response\n\t}\n\n\tprivate captureScreenshot(response: Promise<Response>): void {\n\t\ttry {\n\t\t\tthis.onCaptureScreenshot?.(response)\n\t\t} catch (error) {\n\t\t\tlog.reportError(error)\n\t\t}\n\t}\n}\n\ninterface Success extends AgentScreenshotResponse {\n\tstatus: \"ok\"\n}\n\nexport async function requestAgentScreenshotWithTimeout(\n\trequest: AgentScreenshotRequest,\n): Promise<Success | { status: \"timeout\" } | { status: \"error\" }> {\n\tconst timeout = new Promise<{ status: \"timeout\" }>(resolve => {\n\t\tsetTimeout(() => resolve({ status: \"timeout\" }), getScreenshotTimeoutMs(request))\n\t})\n\tconst pendingRequest = requestAgentScreenshot(request)\n\t\t.then(response => ({ status: \"ok\" as const, results: response.results }))\n\t\t.catch(() => ({ status: \"error\" as const }))\n\treturn Promise.race([pendingRequest, timeout])\n}\n\nfunction getDeviceHeightForViewportWidth(width: number): number {\n\t// mobileish\n\tif (width < 500) return 874\n\t// tabletish\n\tif (width < 850) return 1080\n\t// desktopish\n\tif (width < 1250) return 850\n\t// freakish\n\treturn 1200\n}\n\nexport function getScreenshotViewportForCanvasNode(\n\tscopeNode: ScopeNode,\n\tbreakpointNode: CanvasNode,\n): { width: number; height: number } {\n\tconst rect = breakpointNode.rect()\n\tconst width = Math.round(rect.width)\n\tconst height = isWebPageNode(scopeNode) ? getDeviceHeightForViewportWidth(width) : Math.round(rect.height)\n\tassert(width > 0 && height > 0, `Screenshot viewport must be positive, got ${width}x${height}`)\n\treturn { width, height }\n}\n\nfunction getScreenshotTimeoutMs(request: AgentScreenshotRequest): number {\n\tif (isAgentScreenshotURLRequest(request)) {\n\t\treturn EXTERNAL_SCREENSHOT_TIMEOUT_MS\n\t}\n\treturn DEFAULT_SCREENSHOT_TIMEOUT_MS\n}\n\nexport async function generateHTMLForCapture({\n\tengine,\n\tscopeNode,\n\tbreakpointNode,\n}: {\n\tengine: VekterEngine\n\tscopeNode: LoadedScopeNode\n\tbreakpointNode: CanvasNode\n}): Promise<string> {\n\tswitch (true) {\n\t\tcase isLayoutTemplateNode(scopeNode):\n\t\t\treturn generateLayoutTemplateHTMLForScreenshot({\n\t\t\t\tengine,\n\t\t\t\tscopeNode,\n\t\t\t})\n\t\tcase isSmartComponentNode(scopeNode):\n\t\t\treturn generateSmartComponentVariantHTMLForScreenshot({\n\t\t\t\tengine,\n\t\t\t\tscopeNode,\n\t\t\t\tvariantNodeId: breakpointNode.id,\n\t\t\t})\n\t\tcase isWebPageNode(scopeNode):\n\t\t\treturn generateWebPageHTML(engine, scopeNode)\n\t\tdefault:\n\t\t\tthrow new Error(\"Scope node must be a web page, layout template, or smart component\")\n\t}\n}\n\nasync function generateWebPageHTML(engine: VekterEngine, scopeNode: ScopeNode): Promise<string> {\n\tassert(isWebPageNode(scopeNode), \"Scope node not found\")\n\n\tconst initialPathVariables = hasCollectionDataSource(scopeNode)\n\t\t? getSamplePathVariablesForCMSPage(engine.stores.treeStore.tree, scopeNode)\n\t\t: undefined\n\n\tconst { html } = await generateHTML({\n\t\tassetStore: engine.stores.assetStore,\n\t\tcodeGenerationStore: engine.stores.codeGenerationStore,\n\t\tcomponentLoader: engine.componentLoader,\n\t\tdebugStore: engine.stores.debugStore,\n\t\tmodulesStore: engine.stores.modulesStore,\n\t\tprojectStore: engine.stores.projectStore,\n\t\tpublishStore: engine.stores.publishStore,\n\t\tscheduler: engine.scheduler,\n\t\ttreeStore: engine.stores.treeStore,\n\t\toverrides: {\n\t\t\tentryScreenNodeId: scopeNode.id,\n\t\t\tsearchIndexURL: \"\",\n\t\t\tsearchIndexFallbackURL: \"\",\n\t\t\tinitialRoute: {\n\t\t\t\trouteId: scopeNode.id,\n\t\t\t\tpathVariables: initialPathVariables,\n\t\t\t},\n\t\t\timportMapModuleTypeFilter: () => false,\n\t\t\tdisableEditorBar: true,\n\t\t\tlazyLayoutTemplates: true,\n\t\t},\n\t\tpatchedTreeState: getDetachedScreenshotTreeState(engine),\n\t})\n\n\treturn html\n}\n\n/**\n * Returns a synthetic deployment tree state for agent screenshot exports while the engine is detached.\n *\n * In evaluation runs, the editor can mount a detached tree with no remote deployment version. Export\n * paths still require deployment tree metadata, so this provides frontier-based state when available.\n */\nfunction getDetachedScreenshotTreeState(engine: VekterEngine): PatchedDeploymentTreeState | undefined {\n\tconst { treeStore } = engine.stores\n\tif (treeStore.timeline.remoteTreeVersion !== 0) return undefined\n\tif (treeStore.mode !== \"crdt\") return undefined\n\n\tconst timeline = treeStore.crdtTimeline\n\treturn {\n\t\tfrontier: timeline.store.manifest.toMaxSeqArray(),\n\t\tbaseDeploymentId: \"detached-agent-screenshot\",\n\t\tpatchedSnapshotId: `detached-${timeline.tree.root.id}`,\n\t}\n}\n\nfunction formatScreenshotUrlMessage(url: URL, publishStore: PublishStore): string {\n\tconst publishedUrlType = getPublishedUrlType(publishStore, url.hostname)\n\n\tif (publishedUrlType) {\n\t\treturn publishedUrlType === \"production\" ? Dictionary.Published : Dictionary.Staging\n\t}\n\n\tconst hostname = stripWWW(url.hostname)\n\treturn `${hostname}${url.pathname}${url.search}${url.hash}`\n}\n\nfunction getPublishedUrlType(publishStore: PublishStore, hostname: string): \"production\" | \"staging\" | undefined {\n\tconst publishUrls = getPublishUrlsFromPublishStore(publishStore)\n\tif (!publishUrls?.production) return undefined\n\n\tif (publishUrls.production) {\n\t\tconst productionUrl = new URL(publishUrls.production)\n\t\tif (productionUrl.hostname === hostname) return \"production\"\n\t}\n\n\tif (publishUrls.staging) {\n\t\tconst stagingUrl = new URL(publishUrls.staging)\n\t\tif (stagingUrl.hostname === hostname) return \"staging\"\n\t}\n\n\treturn undefined\n}\n\nfunction stripWWW(hostname: string): string {\n\treturn hostname.startsWith(\"www.\") ? hostname.slice(4) : hostname\n}\n\nfunction extractUrlsOnSuccess(results: AgentScreenshotResponse[\"results\"] | undefined): string[] {\n\tif (!results) return []\n\treturn Object.values(results)\n\t\t.filter(isSuccessResult)\n\t\t.map(r => r.url)\n}\n\nfunction isNotTunnel(): boolean {\n\tconst release = getFramerRelease(window)\n\treturn release?.override !== \"tunnel\"\n}\n\nfunction assertURLIsValidTarget(url: URL, publishStore: PublishStore) {\n\tconst publishUrls = getPublishUrlsFromPublishStore(publishStore)\n\tconst publishedUrlType = getPublishedUrlType(publishStore, url.hostname)\n\tif (publishUrls.protectedStaging && publishedUrlType === \"staging\") {\n\t\tthrow new Error(\"Cannot screenshot staging URL as it is protected, please inform the user\")\n\t}\n}\n\nexport function getScreenshotRequestKey(result: Request): string {\n\tif (isUrlRequest(result)) {\n\t\tconst base = `${result.url}:${result.theme}`\n\t\tconst viewport = result.viewport ?? DEFAULT_VIEWPORT\n\t\treturn `${base}:${viewport.width}x${viewport.height}`\n\t}\n\treturn `${result.id}:${result.theme}`\n}\n", "import type { JSONObject, JSONValue } from \"@ai-sdk/provider\"\nimport { emptyArray } from \"@framerjs/shared\"\nimport type { ToolResultPart } from \"ai\"\nimport { isObject } from \"utils/typeChecks.ts\"\nimport type { ReadProjectResponse } from \"./readProject.ts\"\nimport { SCREENSHOT_QUERY } from \"./readProjectQueryTypes.ts\"\nimport { isScreenshotResult } from \"./utils/AgentScreenshots.ts\"\n\ntype ToolResultOutput = ToolResultPart[\"output\"]\ntype ReadProjectToolResultContentPart = Extract<ToolResultOutput, { type: \"content\" }>[\"value\"][number]\ntype ReadProjectCustomContentPart = Extract<ReadProjectToolResultContentPart, { type: \"custom\" }>\n\nconst readProjectCustomContentPartProvider = \"framer\"\nconst readProjectCustomContentPartResponseKey = \"readProjectResponse\"\nconst queryResultsKey = \"queryResults\" satisfies keyof ReadProjectResponse\n\ninterface ReadProjectCustomContentPartPayload {\n\treadProjectResponse: ReadProjectResponse\n}\n\nexport function isReadProjectToolResponseValue(value: unknown): value is ReadProjectResponse {\n\treturn isObject(value) && queryResultsKey in value\n}\n\nexport function createReadProjectResponseCustomContentPart(\n\tresponse: ReadProjectResponse,\n): ReadProjectCustomContentPart {\n\tconst payload: ReadProjectCustomContentPartPayload = { readProjectResponse: response }\n\n\treturn {\n\t\ttype: \"custom\",\n\t\tproviderOptions: {\n\t\t\t[readProjectCustomContentPartProvider]: payload as unknown as JSONObject,\n\t\t},\n\t}\n}\n\nexport function parseReadProjectResponseCustomContentPart(\n\tpart: ReadProjectToolResultContentPart,\n): ReadProjectResponse | undefined {\n\tif (part.type !== \"custom\") return\n\n\tconst providerPayload = part.providerOptions?.[readProjectCustomContentPartProvider]\n\tif (!isObject(providerPayload)) return\n\n\tconst response = providerPayload[readProjectCustomContentPartResponseKey]\n\tif (!isReadProjectToolResponseValue(response)) return\n\treturn response\n}\n\nfunction getReadProjectImageUrls(response: ReadProjectResponse): readonly string[] {\n\treturn response.queryResults.flatMap(result => {\n\t\tif (result.type !== SCREENSHOT_QUERY || !isScreenshotResult(result)) return emptyArray()\n\t\treturn [result.image_url]\n\t})\n}\n\n/**\n * Converts a read-project response into the tool-output format expected by the model.\n * For image example queries we emit multimodal content so vision-capable models can\n * see images directly instead of only reading image URLs from JSON.\n */\nexport function getReadProjectToolResultOutput(response: ReadProjectResponse): ToolResultOutput {\n\tconst imageUrls = getReadProjectImageUrls(response)\n\n\tif (imageUrls.length === 0) {\n\t\treturn {\n\t\t\ttype: \"json\",\n\t\t\tvalue: response as unknown as JSONValue,\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"content\",\n\t\tvalue: [\n\t\t\t{ type: \"text\", text: JSON.stringify(response) },\n\t\t\tcreateReadProjectResponseCustomContentPart(response),\n\t\t\t...imageUrls.map(url => ({ type: \"image-url\" as const, url })),\n\t\t],\n\t}\n}\n", "import { LogLevel, assert, assertNever, getLogger } from \"@framerjs/shared\"\nimport { tool } from \"ai\"\nimport type { AgentInteractionHandle } from \"app/ai/raindrop/AgentInteraction.ts\"\nimport {\n\ttype ReadProjectTraceContext,\n\ttype ToolTraceContext,\n\ttype TraceDisplayMessages,\n\ttraceReadProjectQueryExecution,\n} from \"app/ai/raindrop/agentStreamTrace.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"../../tracing/openRouterTrace.ts\"\nimport { DESIGN_PLAN_LABEL } from \"../DocumentParser.ts\"\nimport type { AgentContext, SystemState } from \"../context/AgentContext.ts\"\nimport type { ComponentControl } from \"../context/componentDefinition.ts\"\nimport { type SerializedAIFontFamily, serializeFontsForContext } from \"../context/fonts.ts\"\nimport { type FontSearchOptions, FontSearchQuerySchema, queryFonts } from \"../context/fonts/queryFonts.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { isShaderName, type ShadersJsonDefinition } from \"../context/shaders.ts\"\nimport { type VectorControl, VectorSets } from \"../context/vectors.ts\"\nimport { formatElapsedMs } from \"../debug/utils.ts\"\nimport { AgentSystemPromptDictionary } from \"../prompt/systemPromptDictionary.ts\"\nimport type { REDACTED_EXAMPLE_MESSAGE } from \"../prompt/tools.ts\"\nimport { escapeValue } from \"../prompt/utils.ts\"\nimport {\n\tgetBlockingTaskCompletedMessage,\n\tgetBlockingTaskStartMessage,\n\tgetReadTaskDisplayMessage,\n} from \"../statusMessages.ts\"\nimport type { ChatPart, EmitChatPart } from \"../types.ts\"\nimport {\n\tCOMPONENT_DEFINITION_QUERY,\n\tFONT_SEARCH_QUERY,\n\tICON_SET_DEFINITION_QUERY,\n\tIMPLEMENTATION_GUIDE_FROM_INDEX_QUERY,\n\tSCREENSHOT_QUERY,\n\tSHADER_DEFINITION_QUERY,\n} from \"./readProjectQueryTypes.ts\"\nimport { getReadProjectToolResultOutput } from \"./readProjectToolResultOutput.ts\"\nimport { READ_PROJECT_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool, hasTraceExecutionContext } from \"./transformers/createUIConnectedTool.ts\"\nimport {\n\tAgentScreenshots,\n\tExternalScreenshotRequestSchema,\n\tNodeScreenshotRequestSchema,\n\tScreenshotRequestSchema,\n\tcreateErrorResult,\n\ttype Request as ScreenshotRequest,\n\ttype Response as ScreenshotResponse,\n} from \"./utils/AgentScreenshots.ts\"\nimport { AgentScreenshotThemeSchema } from \"./utils/requestAgentScreenshot.ts\"\nimport { wrapExecutionInChatPartUpdater } from \"./utils/wrapExecutionInUpdater.ts\"\n\nexport const readProjectQueries = [\n\tCOMPONENT_DEFINITION_QUERY,\n\tFONT_SEARCH_QUERY,\n\tICON_SET_DEFINITION_QUERY,\n\tIMPLEMENTATION_GUIDE_FROM_INDEX_QUERY,\n\tSCREENSHOT_QUERY,\n\tSHADER_DEFINITION_QUERY,\n] as const\n\nexport function createQuery(query: z.infer<typeof ReadProjectQuerySchema>): ReadProjectQuery {\n\treturn query\n}\n\nconst ReadProjectQuerySchema = z.discriminatedUnion(\"type\", [\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(FONT_SEARCH_QUERY),\n\t\t\t...FontSearchQuerySchema.shape,\n\t\t})\n\t\t.describe(\n\t\t\t`Search for additional fonts not in <${metadataTags.availableFonts}> tag. For creation strategy, use after the ${escapeValue(DESIGN_PLAN_LABEL)} block is closed. Set ${escapeValue<FontSearchOptions>(\"name\")} to find a font by name, or ${escapeValue<FontSearchOptions>(\"query\")} to find fonts by style description. Never use both. ${escapeValue<FontSearchOptions>(\"mustHave\")} only applies to ${escapeValue<FontSearchOptions>(\"query\")} searches.`,\n\t\t),\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(ICON_SET_DEFINITION_QUERY),\n\t\t\tname: z.string(),\n\t\t})\n\t\t.describe(\n\t\t\t`Request the available icons and controls for a specific icon set from <${VectorSets.availableSetsMetadataTag}> tag.`,\n\t\t),\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(COMPONENT_DEFINITION_QUERY),\n\t\t\tid: z.string(),\n\t\t})\n\t\t.describe(\n\t\t\t`Request the full component definition of a specific component from <${metadataTags.availableComponents}> tag.`,\n\t\t),\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY),\n\t\t\tname: z.string(),\n\t\t})\n\t\t.describe(\n\t\t\t`Request an implementation guidance document by name from ${AgentSystemPromptDictionary.ImplementationGuidanceDocumentationIndex}. For creation strategy, use after the ${escapeValue(DESIGN_PLAN_LABEL)} block is closed.`,\n\t\t),\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(SHADER_DEFINITION_QUERY),\n\t\t\tname: z.string().refine(name => isShaderName(name)),\n\t\t})\n\t\t.describe(\n\t\t\t`Fetch a shader definition when the full controls are not already present in <${metadataTags.shaderDefinition}>. Use a shader name from <${metadataTags.availableShaders}>.`,\n\t\t),\n\tz\n\t\t.object({\n\t\t\ttype: z.literal(SCREENSHOT_QUERY),\n\t\t\tid: NodeScreenshotRequestSchema.shape.id.optional(),\n\t\t\turl: ExternalScreenshotRequestSchema.shape.url.optional(),\n\t\t\tviewport: ExternalScreenshotRequestSchema.shape.viewport\n\t\t\t\t.optional()\n\t\t\t\t.describe(\"Optionally specify the viewport size for the external urlscreenshot.\"),\n\t\t\ttheme: AgentScreenshotThemeSchema.optional().describe(\n\t\t\t\t'Optionally force the screenshot in a specific browser color mode to capture color-tokens with a \"dark\" value. Defaults to the current editor theme the user is seeing.',\n\t\t\t),\n\t\t})\n\t\t.describe(\n\t\t\t\"Request screenshots for either a node id or an external url. Must not request screenshots of ComponentNode contents, or Replica contents.\",\n\t\t),\n])\n\n/** Some models might return the queries as a stringified JSON array. */\nconst ReadProjectQueriesSchema = z.preprocess(value => {\n\tif (!isString(value)) return value\n\ttry {\n\t\treturn JSON.parse(value)\n\t} catch {\n\t\treturn value\n\t}\n}, z.array(ReadProjectQuerySchema).min(1))\n\nexport const ReadProjectInputSchema = z.object({\n\tqueries: ReadProjectQueriesSchema,\n})\n\nconst log = getLogger(\"ai:agents\")\n\ninterface ErrorResult {\n\terror: string\n}\n\nexport type ReadProjectQuery = z.infer<typeof ReadProjectQuerySchema>\n\nexport type ReadProjectResult =\n\t| {\n\t\t\ttype: typeof FONT_SEARCH_QUERY\n\t\t\tresults: SerializedAIFontFamily[]\n\t  }\n\t| {\n\t\t\ttype: typeof ICON_SET_DEFINITION_QUERY\n\t\t\tname: string\n\t\t\tcontrols: Record<string, VectorControl | undefined>\n\t  }\n\t// This is used by #proj-local-agents. If changing this query, please give #proj-local-agents a heads-up\n\t| ({\n\t\t\ttype: typeof COMPONENT_DEFINITION_QUERY\n\t  } & (\n\t\t\t| { id: string; name: string; controls: Record<string, ComponentControl | undefined> }\n\t\t\t| ({ id: string } & ErrorResult)\n\t  ))\n\t| ({\n\t\t\ttype: typeof IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY\n\t\t\tname: string\n\t  } & ({ guide: string | typeof REDACTED_EXAMPLE_MESSAGE } | ErrorResult))\n\t| ScreenshotResponse\n\t| ({\n\t\t\ttype: typeof SHADER_DEFINITION_QUERY\n\t  } & ({ result: ShadersJsonDefinition } | ErrorResult))\n\nexport interface ReadProjectResponse {\n\tqueryResults: ReadProjectResult[]\n\tsystemState?: SystemState\n}\n\nexport function isNodeExampleResult(\n\tresult: ReadProjectResult,\n): result is Extract<ReadProjectResult, { type: typeof IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY }> {\n\treturn result.type === IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY\n}\n\nconst errorResultKey = \"error\" satisfies keyof ErrorResult\nexport function isExampleErrorResult(result: ReadProjectResult): result is Extract<ReadProjectResult, ErrorResult> {\n\treturn errorResultKey in result\n}\n\ninterface FontSearchTraceResult {\n\ttype: typeof FONT_SEARCH_QUERY\n\tresultCount: number\n\tresults: {\n\t\tname: string\n\t\treason?: string\n\t}[]\n}\n\nfunction summarizeFontSearchResultForTrace(result: Extract<ReadProjectResult, { type: typeof FONT_SEARCH_QUERY }>) {\n\treturn {\n\t\ttype: FONT_SEARCH_QUERY,\n\t\tresultCount: result.results.length,\n\t\tresults: result.results.map(font => ({\n\t\t\tname: font.name,\n\t\t\t...(font.reason && { reason: font.reason }),\n\t\t})),\n\t} satisfies FontSearchTraceResult\n}\n\nfunction summarizeReadProjectResultForTrace(result: ReadProjectResult): ReadProjectResult | FontSearchTraceResult {\n\tif (result.type !== FONT_SEARCH_QUERY) return result\n\treturn summarizeFontSearchResultForTrace(result)\n}\n\nfunction summarizeReadProjectResultsForTrace(results: readonly ReadProjectResult[]) {\n\treturn results.map(summarizeReadProjectResultForTrace)\n}\n\nfunction getReadProjectQueryTypes(queries: readonly ReadProjectQuery[]): Set<ReadProjectQuery[\"type\"]> {\n\tconst queryTypes = new Set<ReadProjectQuery[\"type\"]>()\n\tfor (const query of queries) queryTypes.add(query.type)\n\treturn queryTypes\n}\n\nconst blockingTaskQueryTypes = new Set([FONT_SEARCH_QUERY, SCREENSHOT_QUERY])\n\n/**\n * Create Chat Parts for read_project queries when there are no high-priority tasks that use larger\n * UI.\n */\nfunction getReadProjectStatusMessages(\n\tqueries: readonly ReadProjectQuery[],\n): Extract<ChatPart, { type: \"read\" }> | undefined {\n\t// If any of the queries are blocking tasks, return undefined because they will take longer than\n\t// the synchronous reads.\n\tconst queryTypes = getReadProjectQueryTypes(queries)\n\tif (queryTypes.intersection(blockingTaskQueryTypes).size > 0) return\n\n\treturn { type: \"read\" }\n}\n\nfunction getReadProjectQueryTraceDisplayMessages(query: ReadProjectQuery): TraceDisplayMessages {\n\tswitch (query.type) {\n\t\tcase FONT_SEARCH_QUERY:\n\t\t\treturn {\n\t\t\t\tstart: getBlockingTaskStartMessage(\"font-search\"),\n\t\t\t\tcompleted: getBlockingTaskCompletedMessage(\"font-search\"),\n\t\t\t}\n\t\tcase SCREENSHOT_QUERY:\n\t\t\treturn {\n\t\t\t\tstart: getBlockingTaskStartMessage(\"screenshot\"),\n\t\t\t\tcompleted: getBlockingTaskCompletedMessage(\"screenshot\"),\n\t\t\t}\n\n\t\tcase COMPONENT_DEFINITION_QUERY:\n\t\tcase IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY:\n\t\tcase SHADER_DEFINITION_QUERY:\n\t\tcase ICON_SET_DEFINITION_QUERY:\n\t\t\treturn { start: getReadTaskDisplayMessage(undefined) }\n\n\t\tdefault:\n\t\t\tassertNever(query)\n\t}\n}\n\nasync function executeSingleQuery(\n\tquery: ReadProjectQuery,\n\ttree: CanvasTree,\n\tctx: AgentContext,\n\tonScreenshotRequest: (request: ScreenshotRequest) => Promise<ScreenshotResponse>,\n\ttraceConfig: OpenRouterFeatureStepTraceConfig,\n\tonPart: EmitChatPart | undefined,\n\tagentInteraction: AgentInteractionHandle | undefined,\n\tdisableRaindropTelemetry: boolean | undefined,\n): Promise<ReadProjectResult> {\n\tswitch (query.type) {\n\t\tcase FONT_SEARCH_QUERY: {\n\t\t\tconst fonts = await wrapExecutionInChatPartUpdater(\n\t\t\t\tonPart,\n\t\t\t\t{ type: \"blocking-task\", task: \"font-search\" },\n\t\t\t\tqueryFonts({\n\t\t\t\t\tsearch: query,\n\t\t\t\t\tcontextFontFamilies: ctx.fonts,\n\t\t\t\t\ttraceConfig,\n\t\t\t\t\tparentInteraction: agentInteraction,\n\t\t\t\t\tdisableRaindropTelemetry,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\treturn { type: FONT_SEARCH_QUERY, results: serializeFontsForContext(fonts) }\n\t\t}\n\t\tcase ICON_SET_DEFINITION_QUERY: {\n\t\t\tconst controls = await ctx.vectorSets.requestCompleteSetDefinition(query.name)\n\t\t\treturn { type: ICON_SET_DEFINITION_QUERY, name: query.name, controls: controls ?? {} }\n\t\t}\n\t\tcase COMPONENT_DEFINITION_QUERY: {\n\t\t\tconst definition = await ctx.components.definitionForId(query.id)\n\t\t\treturn !isUndefined(definition)\n\t\t\t\t? {\n\t\t\t\t\t\ttype: COMPONENT_DEFINITION_QUERY,\n\t\t\t\t\t\tid: definition.id,\n\t\t\t\t\t\tname: definition.displayName,\n\t\t\t\t\t\tcontrols: definition.controls,\n\t\t\t\t\t}\n\t\t\t\t: { type: COMPONENT_DEFINITION_QUERY, id: query.id, error: \"Component definition not found.\" }\n\t\t}\n\t\tcase IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY: {\n\t\t\tconst result = await ctx.examples.loadImplementationGuide(query.name)\n\t\t\treturn { type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: query.name, ...result }\n\t\t}\n\t\tcase SHADER_DEFINITION_QUERY: {\n\t\t\ttry {\n\t\t\t\tconst result = await ctx.shaders.requestCompleteShaderDefinition(query.name)\n\t\t\t\treturn { ...query, result }\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\t...query,\n\t\t\t\t\terror: error instanceof Error ? error.message : \"Shader definition request failed.\",\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcase SCREENSHOT_QUERY: {\n\t\t\ttry {\n\t\t\t\tconst request = ScreenshotRequestSchema.parse(query)\n\t\t\t\ttry {\n\t\t\t\t\treturn await onScreenshotRequest(request)\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn createErrorResult(request, error instanceof Error ? error.message : \"Screenshot request failed.\")\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\ttype: SCREENSHOT_QUERY,\n\t\t\t\t\tid: query.id,\n\t\t\t\t\turl: query.url,\n\t\t\t\t\terror: \"Expected exactly one of 'id' or 'url'.\",\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(query, \"Invalid query type\")\n\t}\n}\n\nexport async function readProject(\n\tqueries: ReadProjectQuery[],\n\ttree: CanvasTree,\n\tctx: AgentContext,\n\ttraceConfig: OpenRouterFeatureStepTraceConfig,\n\ttraceContext: ReadProjectTraceContext | undefined,\n\tonPart?: EmitChatPart,\n\tagentInteraction?: AgentInteractionHandle,\n\tdisableRaindropTelemetry?: boolean,\n): Promise<ReadProjectResponse & { metrics: [\"sync\" | ReadProjectQuery, { elapsedMs: number }][] }> {\n\tconst queryPerformance = new Map<ReadProjectQuery, { elapsedMs: number }>()\n\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required\")\n\tconst screenshots = new AgentScreenshots(engine, ctx.treeResolver, onPart)\n\n\tconst queryStart = performance.now()\n\tconst resultPromises = queries.map(async (query): Promise<ReadProjectResult> => {\n\t\tconst traceEventId = traceContext?.eventId ?? agentInteraction?.traceEventId()\n\t\tconst traceParent = traceContext?.parent\n\t\tconst displayMessages = traceEventId ? getReadProjectQueryTraceDisplayMessages(query) : undefined\n\n\t\treturn traceReadProjectQueryExecution({\n\t\t\tqueryType: query.type,\n\t\t\tquery,\n\t\t\ttraceEventId,\n\t\t\ttraceParent,\n\t\t\tdisplayMessages,\n\t\t\tgetTraceOutput: summarizeReadProjectResultForTrace,\n\t\t\texecute: async () => {\n\t\t\t\tconst result = await executeSingleQuery(\n\t\t\t\t\tquery,\n\t\t\t\t\ttree,\n\t\t\t\t\tctx,\n\t\t\t\t\treq => screenshots.createRequest(req),\n\t\t\t\t\ttraceConfig,\n\t\t\t\t\tonPart,\n\t\t\t\t\tagentInteraction,\n\t\t\t\t\tdisableRaindropTelemetry,\n\t\t\t\t)\n\t\t\t\tqueryPerformance.set(query, { elapsedMs: performance.now() - queryStart })\n\t\t\t\treturn result\n\t\t\t},\n\t\t})\n\t})\n\n\t// Flush the screenshots requests, promises created in the queries map will resolve.\n\tvoid screenshots.flushRequests()\n\n\tconst queryResults = await Promise.all(resultPromises)\n\n\t// Create a system state update to inform the agent about the context.\n\treturn {\n\t\tqueryResults,\n\t\tsystemState: ctx.getToolResultSystemStateMessages(),\n\t\tmetrics: Array.from(queryPerformance.entries()),\n\t}\n}\n\nconst description =\n\t\"Query/lookup information about the current project, example implementations, and available fonts.\" as const\n\nfunction logReadProject(\n\tmessage: string,\n\titems: readonly (ReadProjectQuery | ReadProjectResult)[],\n\telapsedMs?: number,\n\t...extras: unknown[]\n) {\n\tif (log.level > LogLevel.Debug) return\n\n\tconst types = items.map(item => item.type).join(\", \")\n\tconst args: unknown[] = [items, ...extras]\n\tconst firstItem = items[0]\n\tif (items.length === 1 && firstItem) {\n\t\tconst { type: _, ...rest } = firstItem\n\t\tif (Object.keys(rest).length > 0) args.unshift(rest)\n\t}\n\tconst elapsedText = elapsedMs === undefined ? \"\" : ` | ${formatElapsedMs(elapsedMs)}`\n\tlog.debug(`${message} | %c${types}%c${elapsedText}`, \"font-weight: bold;\", \"\", ...args)\n}\n\nexport function createReadProjectTool(\n\ttreeStore: TreeStore,\n\tctx: AgentContext,\n\ttraceConfig: OpenRouterFeatureStepTraceConfig,\n\tsynchronize: () => Promise<void>,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t\tagentInteraction,\n\t\tdisableRaindropTelemetry,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t\tagentInteraction?: AgentInteractionHandle\n\t\tdisableRaindropTelemetry?: boolean\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: ReadProjectInputSchema,\n\t\t\texecute: async ({ queries }, options): Promise<ReadProjectResponse> => {\n\t\t\t\tlogReadProject(\"Tool called: readProject\", queries)\n\t\t\t\tconst startedAt = performance.now()\n\t\t\t\tconst response = await readProject(\n\t\t\t\t\tqueries,\n\t\t\t\t\ttreeStore.tree,\n\t\t\t\t\tctx,\n\t\t\t\t\ttraceConfig,\n\t\t\t\t\thasTraceExecutionContext(options) ? options.traceExecutionContext?.nestedTraceContext : undefined,\n\t\t\t\t\tonPart,\n\t\t\t\t\tagentInteraction,\n\t\t\t\t\tdisableRaindropTelemetry,\n\t\t\t\t)\n\t\t\t\tconst elapsedMs = Math.round(performance.now() - startedAt)\n\t\t\t\tlogReadProject(\"Tool response: readProject\", response.queryResults, elapsedMs, response)\n\n\t\t\t\treturn {\n\t\t\t\t\tqueryResults: response.queryResults,\n\t\t\t\t\tsystemState: response.systemState,\n\t\t\t\t}\n\t\t\t},\n\t\t\ttoModelOutput: ({ output }) => getReadProjectToolResultOutput(output),\n\t\t},\n\t\t{\n\t\t\ttoolName: READ_PROJECT_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t\tgetTraceInput: input => input.queries,\n\t\t\t\tgetTraceOutput: output => summarizeReadProjectResultsForTrace(output.queryResults),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: input => getReadProjectStatusMessages(input.queries),\n\t\t},\n\t)\n}\n\n/** Used by the Agent evals. */\nexport function createReadProjectToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: ReadProjectInputSchema,\n\t\ttoModelOutput: ({ output }) => getReadProjectToolResultOutput(output),\n\t})\n}\n", "import { ResolvablePromise } from \"@framerjs/shared\"\nimport { isString } from \"utils/typeChecks.ts\"\n\nconst abortedStream = Symbol(\"aborted-stream\")\n\n/**\n * When agent.cancel() abort the signal, it can take a noticeable amount of time for the SDK to\n * propagate the aborted fetch/stream. In order for the cancel to be instant, we race the abort\n * signal against the stream. On local abort, we reject the race with the signal reason.\n */\nexport async function* abortableStream<T>(\n\tstream: AsyncIterable<T>,\n\tabortSignal: AbortSignal | undefined,\n): AsyncGenerator<T, void, unknown> {\n\tconst iterator = stream[Symbol.asyncIterator]()\n\tconst abort = createAbortRace(abortSignal)\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst next = await raceIteratorNext(iterator, abort)\n\t\t\tif (next === abortedStream) throw getAbortError(abortSignal)\n\t\t\tif (next.done) return\n\t\t\tyield next.value\n\t\t}\n\t} finally {\n\t\tabort.cleanup()\n\t\tawait iterator.return?.()\n\t}\n}\n\nfunction raceIteratorNext<T>(\n\titerator: AsyncIterator<T>,\n\tabort: AbortRace,\n): Promise<IteratorResult<T> | typeof abortedStream> {\n\tif (!abort.promise) return iterator.next()\n\n\tconst nextPromise = iterator.next()\n\tnextPromise.catch(() => {}) // Prevent unhandled rejection when abort wins the race\n\treturn Promise.race([nextPromise, abort.promise])\n}\n\ninterface AbortRace {\n\tpromise?: Promise<typeof abortedStream>\n\tcleanup: () => void\n}\n\nfunction createAbortRace(abortSignal: AbortSignal | undefined): AbortRace {\n\tif (!abortSignal) return { cleanup: () => undefined }\n\tif (abortSignal.aborted) {\n\t\treturn {\n\t\t\tpromise: Promise.resolve(abortedStream),\n\t\t\tcleanup: () => undefined,\n\t\t}\n\t}\n\n\tconst promise = new ResolvablePromise<typeof abortedStream>()\n\tconst onAbort = () => promise.resolve(abortedStream)\n\tabortSignal.addEventListener(\"abort\", onAbort, { once: true })\n\n\treturn {\n\t\tpromise,\n\t\tcleanup: () => abortSignal.removeEventListener(\"abort\", onAbort),\n\t}\n}\n\nfunction getAbortError(abortSignal?: AbortSignal, fallbackReason: string = \"Signal aborted\"): Error {\n\tif (abortSignal?.reason instanceof Error) return abortSignal?.reason\n\tif (isString(abortSignal?.reason)) return new Error(abortSignal?.reason)\n\treturn new Error(fallbackReason)\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { join } from \"utils/join.ts\"\nimport { isReadonlyArray, isString } from \"utils/typeChecks.ts\"\n\nexport type MarkdownBlock = (depth: number, isFirstInParent?: boolean) => string\n\nfunction headingFromDepth(depth: number, heading: string): string {\n\treturn `${\"#\".repeat(depth)} ${heading}`\n}\n\ntype Content = string | MarkdownBlock | readonly string[]\n\nfunction contentOrString(content: Content, depth: number, isFirstInParent: boolean): string {\n\tif (isReadonlyArray(content)) {\n\t\tif (content.length <= 1) return join.linesFrom(content)\n\t\treturn join.linesFrom(content.map(item => `- ${item}`))\n\t}\n\tif (isString(content)) return content\n\treturn content(depth, isFirstInParent)\n}\n\nfunction serializeMarkdownBlock(block: string | MarkdownBlock | MarkdownBlock[]): string {\n\tif (isString(block)) return block\n\tif (isReadonlyArray(block)) return block.map(item => serializeMarkdownBlock(item)).join(\"\\n\\n\")\n\treturn block(1)\n}\n\nexport namespace Markdown {\n\texport function serialize(...content: MarkdownBlock[]): string {\n\t\treturn join.linesFrom(content.map(item => serializeMarkdownBlock(item))).trim()\n\t}\n\n\texport function section(heading: string, ...content: Content[]): MarkdownBlock {\n\t\treturn (depth: number, isFirstInParent = false) => {\n\t\t\tassert(depth <= 6, \"Depth must be less than or equal to 6\")\n\t\t\tconst items = content.map((item, index) => contentOrString(item, depth + 1, index === 0))\n\t\t\treturn (isFirstInParent ? \"\" : \"\\n\") + join.lines(headingFromDepth(depth, heading) + \"\\n\", ...items)\n\t\t}\n\t}\n}\n", "import { Markdown } from \"../../prompt/markdown.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\n\nexport const implementationGuidelines = Markdown.section(\n\t\"Implementation Guidelines\",\n\t\"Rules to follow when generating code, based on specific types of components. Most important for first time generation.\",\n\tMarkdown.section(\n\t\t\"General Rules\",\n\t\t`- Generate a component encapsulated in a single file. Only export a single component.\n- ALWAYS repeat the user's instructions in a comment at the top of the file.\n- Only use ${escapeValue(\"export default\")} to export the component. Never use named exports.\n- ALWAYS use function components with named \"function\" syntax.\n- Do not use any npm packages besides ${escapeValue('\"react\", \"react-dom\", \"framer\" and \"framer-motion\"')}; never import from anything else.\n- ${escapeValue(\"motion\")} and other ${escapeValue(\"framer-motion\")} things are imported from ${escapeValue('\"framer-motion\"')}, not from ${escapeValue('\"framer\"')}\n- Any ${escapeValue(\"@framerXX\")} annotations should go immediately above the component function in a BLOCK COMMENT.\n- IN A BLOCK COMMENT IMMEDIATELY ABOVE THE COMPONENT include ${escapeValue(\"@framerSupportedLayoutWidth\")} and ${escapeValue(\"@framerSupportedLayoutHeight\")} annotation based on the docs and use-case in the ${escapeValue(\"/** */\")} comment immediately ABOVE the component function.\n- If content has no intrinsic size, IT MUST USE ${escapeValue(\"@framerSupportedLayoutWidth/Height: fixed\")}, otherwise use ${escapeValue(\"@framerSupportedLayoutWidth/Height: auto\")} or ${escapeValue(\"any-prefer-fixed\")}\n- ALWAYS use relative positioning in the first HTML tag of the component. Let the parent frame handle layout - NEVER use ${escapeValue(\"position: fixed\")}\n- ALWAYS guard before using ${escapeValue(\"window\")} or ${escapeValue(\"document\")} by using ${escapeValue('if (typeof window !== \"undefined\") { ... } else { ... }')}. The component MUST render on the server successfully.\n- YOU MUST wrap React state updates (e.g. ${escapeValue(\"setFoo()\")}) in ${escapeValue(\"startTransition()\")} (e.g. ${escapeValue(\"startTransition(() => setFoo())\")}).\n- Make appropriate use of ${escapeValue(\"useMemo\")}, and ${escapeValue(\"useCallback\")}.\n\nWhen using animations, always optimize for performance by following the rules.\n\n- For very complex animations, use WebGL instead of ${escapeValue(\"framer-motion\")}.\n- Use the ${escapeValue(\"useIsStaticRenderer\")} hook from the ${escapeValue('\"framer\"')} package to avoid running animations if the hook returns ${escapeValue(\"true\")}. Show a static preview instead. Ensure the static preview is useful by including any static effects and not just text when possible.\n- Animations must be paused when they're not in the viewport by using the ${escapeValue(\"useInView\")} hook from ${escapeValue(\"framer-motion\")}.`,\n\t),\n\tMarkdown.section(\n\t\t\"Accessibility\",\n\t\t`- Add appropriate ${escapeValue(\"aria\")} roles to interactive elements.\n- Use semantic HTML elements (${escapeValue(\"button\")}, ${escapeValue(\"nav\")}, ${escapeValue(\"main\")}, etc.) where appropriate.\n- Add ${escapeValue('alt=\"\"')} to decorative ${escapeValue(\"img\")} tags.`,\n\t),\n\tMarkdown.section(\n\t\t\"Sizing\",\n\t\t`- ${escapeValue(\"auto\")} vs ${escapeValue(\"fixed\")} sizing can be detected on each axis by checking if the ${escapeValue(\"style\")} prop exists and if ${escapeValue(\"style.width\")} or ${escapeValue(\"style.height\")} is set to ${escapeValue('\"100%\"')} respectively.`,\n\t),\n\tMarkdown.section(\n\t\t\"Common Errors to avoid\",\n\t\t`- A common error is to forget to handle ${escapeValue(\"SecurityError: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The image element contains cross-origin data, and may not be loaded\")}.\n- A common error is for the image to be rendered upside down because of the coordinate system. Always check if the image is rendered vertically and accommodate for inverted y-axis.`,\n\t),\n\tMarkdown.section(\n\t\t\"Text\",\n\t\t`- When using auto-sized components with text, ALWAYS properly apply ${escapeValue(\"width: max-content\")} or ${escapeValue(\"minWidth: max-content\")} to the text element.`,\n\t),\n\tMarkdown.section(\n\t\t\"Types\",\n\t\t`- Use the ${escapeValue(\"MyComponentProps\")} name for the component props, always provide a type for the props.\n- Avoid using NodeJS types like ${escapeValue(\"Timeout\")} or ${escapeValue(\"NodeJS.Timeout\")} in the code. Use ${escapeValue(\"number\")} instead.`,\n\t),\n)\n", "import { createBlock } from \"../../fencedBlock.ts\"\nimport { Markdown } from \"../../prompt/markdown.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\n\nfunction codeBlock(language: \"javascript\" | \"tsx\" | \"typescript\", code: string) {\n\tconst infoString = language === \"javascript\" ? \"tsx\" : language\n\treturn createBlock(infoString, code.trim())\n}\n\ninterface ControlSectionOptions {\n\ttitle: string\n\tdescription: string\n\tproperties?: ControlSectionProperties\n\texample?: string\n\texampleMarkdown?: string\n}\n\ninterface ControlSectionProperty {\n\tname: string\n\tdescription: string\n}\n\ninterface ControlSectionPropertyGroup {\n\ttitle?: string\n\titems: ControlSectionProperty[]\n}\n\ntype ControlSectionProperties = ControlSectionProperty[] | ControlSectionPropertyGroup[]\n\nfunction isControlSectionPropertyGroup(\n\tproperty: ControlSectionProperty | ControlSectionPropertyGroup,\n): property is ControlSectionPropertyGroup {\n\treturn \"items\" in property\n}\n\nfunction isControlSectionPropertyGroupArray(\n\tproperties: ControlSectionProperties,\n): properties is ControlSectionPropertyGroup[] {\n\treturn properties.every(isControlSectionPropertyGroup)\n}\n\nfunction normalizeControlSectionProperties(properties: ControlSectionProperties): ControlSectionPropertyGroup[] {\n\tconst [firstProperty] = properties\n\tif (!firstProperty) return []\n\n\treturn isControlSectionPropertyGroupArray(properties) ? properties : [{ items: properties }]\n}\n\nfunction renderControlSectionProperties(properties?: ControlSectionProperties) {\n\tif (!properties || properties.length === 0) return undefined\n\n\tconst groups = normalizeControlSectionProperties(properties)\n\tconst renderedGroups = groups.map(group => {\n\t\tconst lines = group.items.map(property => `- ${escapeValue(property.name)}: ${property.description}`)\n\t\treturn [group.title ? `**${group.title}:**` : undefined, ...lines].filter(Boolean).join(\"\\n\")\n\t})\n\n\treturn `**Properties:**\\n${renderedGroups.join(\"\\n\\n\")}`\n}\n\nfunction renderControlSectionExample({\n\texample,\n\texampleMarkdown,\n}: Pick<ControlSectionOptions, \"example\" | \"exampleMarkdown\">) {\n\tif (exampleMarkdown) return `**Example:**\\n${exampleMarkdown}`\n\tif (!example) return undefined\n\n\treturn `**Example:**\\n${codeBlock(\"javascript\", example)}`\n}\n\nfunction controlSection({ title, description, properties, example, exampleMarkdown }: ControlSectionOptions) {\n\tconst renderedProperties = renderControlSectionProperties(properties)\n\tconst renderedExample = renderControlSectionExample({ example, exampleMarkdown })\n\n\treturn Markdown.section(\n\t\ttitle,\n\t\tdescription,\n\t\t...(renderedProperties ? [renderedProperties] : []),\n\t\t...(renderedExample ? [renderedExample] : []),\n\t)\n}\n\n// TODO: We should figure out how to make the property controls definitions stay always in sync with\n// the property controls api in Framer. A change of type to property control should not require a\n// manual update of the definitions. Introducing a new property control should automatically be\n// included in the definitions.\nexport const framerPropertyControls = [\n\t`Control types for property controls in Framer components. Each control type specifies a different user interface for receiving input. All control types accept ${escapeValue(\"title\")} and ${escapeValue(\"hidden\")} properties.`,\n\tcontrolSection({\n\t\ttitle: \"Boolean\",\n\t\tdescription: `A control that displays an on/off checkbox. The associated property will be ${escapeValue(\"true\")} or ${escapeValue(\"false\")}, depending on the state of the checkbox.`,\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: `Set to ${escapeValue(\"true\")} by default` },\n\t\t\t{ name: \"enabledTitle\", description: \"Customize the label when enabled\" },\n\t\t\t{ name: \"disabledTitle\", description: \"Customize the label when disabled\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame size={\"100%\"}>{props.showText ? \"Hello World\" : null}</Frame>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  showText: {\n\t\t\t    type: ControlType.Boolean,\n\t\t\t    title: \"Show Text\",\n\t\t\t    defaultValue: true,\n\t\t\t    enabledTitle: \"On\",\n\t\t\t    disabledTitle: \"Off\",\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Number\",\n\t\tdescription:\n\t\t\t\"A control that accepts any numeric value. This will be provided directly as a property. Displays an input field with a range slider by default.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"The default numeric value\" },\n\t\t\t{ name: \"min\", description: \"Minimum allowed value\" },\n\t\t\t{ name: \"max\", description: \"Maximum allowed value\" },\n\t\t\t{ name: \"unit\", description: 'Unit label (e.g., \"deg\", \"px\")' },\n\t\t\t{ name: \"step\", description: \"Increment value for the slider\" },\n\t\t\t{ name: \"displayStepper\", description: \"Enable to show a stepper control instead\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame rotateZ={props.rotation} size={\"100%\"}>{props.rotation}</Frame>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  rotation: {\n\t\t\t    type: ControlType.Number,\n\t\t\t    defaultValue: 0,\n\t\t\t    min: 0,\n\t\t\t    max: 360,\n\t\t\t    unit: \"deg\",\n\t\t\t    step: 0.1,\n\t\t\t    displayStepper: true,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"String\",\n\t\tdescription:\n\t\t\t\"A control that accepts plain text values. Displays an input field with an optional placeholder value.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"The default text value\" },\n\t\t\t{ name: \"placeholder\", description: \"Placeholder text\" },\n\t\t\t{ name: \"obscured\", description: \"Set to true to use a password input field\" },\n\t\t\t{ name: \"displayTextArea\", description: \"Enable for a multi-line input area\" },\n\t\t\t{ name: \"preventLocalization\", description: \"Prevents automatic translation of the text\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame>{props.title} - {props.body}</Frame>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  title: {\n\t\t\t    type: ControlType.String,\n\t\t\t    defaultValue: \"Framer\",\n\t\t\t    placeholder: \"Type something...\",\n\t\t\t  },\n\t\t\t  body: {\n\t\t\t    type: ControlType.String,\n\t\t\t    defaultValue: \"Lorem ipsum dolor sit amet.\",\n\t\t\t    placeholder: \"Type something...\",\n\t\t\t    displayTextArea: true,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Enum\",\n\t\tdescription:\n\t\t\t\"A property control that represents a list of options. The selected option will be provided as a property. Displayed as a dropdown menu.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"The default selected option\" },\n\t\t\t{ name: \"options\", description: \"Array of unique values\" },\n\t\t\t{ name: \"optionTitles\", description: \"Display names for the options\" },\n\t\t\t{ name: \"displaySegmentedControl\", description: \"Enable to display a segmented control instead\" },\n\t\t\t{\n\t\t\t\tname: \"segmentedControlDirection\",\n\t\t\t\tdescription: 'Direction of the segmented control (\"horizontal\" or \"vertical\")',\n\t\t\t},\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  const value = props.value || \"a\"\n\t\t\t  const colors = { a: \"red\", b: \"green\", c: \"blue\" }\n\t\t\t  return <Frame background={colors[value]} size={\"100%\"}>{value}</Frame>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  value: {\n\t\t\t    type: ControlType.Enum,\n\t\t\t    defaultValue: \"a\",\n\t\t\t    options: [\"a\", \"b\", \"c\"],\n\t\t\t    optionTitles: [\"Option A\", \"Option B\", \"Option C\"],\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Color\",\n\t\tdescription: `A control that represents a color value. The selected color is provided as a string in either HEX (${escapeValue('\"#fff\"')}) or HSL (${escapeValue(\"hsla(203, 87%, 50%, 0.5)\")}) notation.`,\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"The default color value\" },\n\t\t\t{ name: \"optional\", description: \"Whether the color is optional\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame background={props.background} size={\"100%\"} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  background: {\n\t\t\t    type: ControlType.Color,\n\t\t\t    defaultValue: \"#fff\",\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"ResponsiveImage\",\n\t\tdescription:\n\t\t\t\"A control that allows the user to pick an image resource. Displayed as an image picker with associated file picker.\",\n\t\tproperties: [\n\t\t\t{\n\t\t\t\ttitle: \"Returns an object with\",\n\t\t\t\titems: [\n\t\t\t\t\t{ name: \"src\", description: \"URL string of the full resolution image\" },\n\t\t\t\t\t{ name: \"srcSet\", description: \"Optional string with scaled image variants\" },\n\t\t\t\t\t{ name: \"alt\", description: \"Optional description of the image\" },\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <img src={props.image.src} srcSet={props.image.srcSet} alt={props.image.alt} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  image: {\n\t\t\t    type: ControlType.ResponsiveImage,\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"File\",\n\t\tdescription:\n\t\t\t\"A control that allows the user to pick a file resource. The selected file will be provided as a fully qualified URL.\",\n\t\tproperties: [{ name: \"allowedFileTypes\", description: \"Array specifying acceptable file types\" }],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return (\n\t\t\t    <Frame size={\"100%\"}>\n\t\t\t      <video\n\t\t\t        style={{ objectFit: \"contain\", width: props.width, height: props.height }}\n\t\t\t        src={props.filepath}\n\t\t\t        controls\n\t\t\t      />\n\t\t\t    </Frame>\n\t\t\t  )\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  filepath: {\n\t\t\t    type: ControlType.File,\n\t\t\t    allowedFileTypes: [\"mov\"],\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Array\",\n\t\tdescription:\n\t\t\t\"A control that allows multiple values per `ControlType`, provided as an array via properties. For most control types, this will display as an additional section in the properties panel.\",\n\t\tproperties: [\n\t\t\t{ name: \"control\", description: \"The control type to repeat\" },\n\t\t\t{ name: \"maxCount\", description: \"Maximum number of items\" },\n\t\t\t{ name: \"defaultValue\", description: \"Default array values\" },\n\t\t],\n\t\texampleMarkdown: `${codeBlock(\n\t\t\t\"javascript\",\n\t\t\t`\n\t\t\texport default function MyComponent(props) {\n\t\t\t  const frames = props.images.map(image => <Frame image={image} width={\"1fr\"} height={\"1fr\"} />)\n\t\t\t  return <Stack size={\"100%\"}>{frames}</Stack>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  images: {\n\t\t\t    type: ControlType.Array,\n\t\t\t    control: {\n\t\t\t      type: ControlType.ResponsiveImage\n\t\t\t    },\n\t\t\t    maxCount: 5,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t\t)}\n\n**Example with ComponentInstance:**\n${codeBlock(\n\t\"javascript\",\n\t`\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  children: {\n\t\t\t    type: ControlType.Array,\n\t\t\t    control: {\n\t\t\t      type: ControlType.ComponentInstance\n\t\t\t    },\n\t\t\t    maxCount: 5,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n)}\n\n**Example with Objects:**\n${codeBlock(\n\t\"javascript\",\n\t`\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  myArray: {\n\t\t\t    type: ControlType.Array,\n\t\t\t    control: {\n\t\t\t      type: ControlType.Object,\n\t\t\t      controls: {\n\t\t\t        title: { type: ControlType.String, defaultValue: \"Employee\" },\n\t\t\t        avatar: { type: ControlType.ResponsiveImage },\n\t\t\t      },\n\t\t\t    },\n\t\t\t    defaultValue: [\n\t\t\t      { title: \"Jorn\" },\n\t\t\t      { title: \"Koen\" },\n\t\t\t    ],\n\t\t\t  },\n\t\t\t})\n\t\t`,\n)}`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Slot\",\n\t\tdescription:\n\t\t\t\"A control that references one or more other components on the canvas, included in the component props as a React node.\",\n\t\tproperties: [{ name: \"maxCount\", description: \"Maximum number of components to be linked\" }],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Stack size={\"100%\"}>{props.children}</Stack>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  children: {\n\t\t\t    type: ControlType.Slot,\n\t\t\t    maxCount: 5,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"EventHandler\",\n\t\tdescription: \"A control that exposes events in the prototyping panel within the Framer UI.\",\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame onTap={props.onTap} size={\"100%\"} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  onTap: {\n\t\t\t    type: ControlType.EventHandler,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Font\",\n\t\tdescription: \"A control that allows for selecting a font to be used in the component.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"Default font settings\" },\n\t\t\t{ name: \"controls\", description: 'Specifies control options (\"basic\" or \"extended\")' },\n\t\t\t{ name: \"defaultFontType\", description: 'Default font type (\"sans-serif\" or \"monospace\")' },\n\t\t\t{ name: \"displayTextAlignment\", description: \"Whether to display text alignment options\" },\n\t\t\t{ name: \"displayFontSize\", description: \"Whether to display font size options\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame style={props.customFont} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  customFont: {\n\t\t\t    type: ControlType.Font,\n\t\t\t    defaultValue: {\n\t\t\t      fontSize: \"16px\",\n\t\t\t      variant: \"Bold\", // Controls font-weight and font-style\n\t\t\t      letterSpacing: \"-0.01em\",\n\t\t\t      lineHeight: \"1.2em\",\n\t\t\t      textAlign: \"right\",\n\t\t\t    },\n\t\t\t    controls: \"extended\",\n\t\t\t    defaultFontType: \"sans-serif\",\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Transition\",\n\t\tdescription: \"A control that allows for editing Framer Motion transition options within the Framer UI.\",\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return (\n\t\t\t    <Frame\n\t\t\t      animate={{ scale: 2 }}\n\t\t\t      transition={props.transition}\n\t\t\t    />\n\t\t\t  )\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  transition: {\n\t\t\t    type: ControlType.Transition,\n\t\t\t  },\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"BoxShadow\",\n\t\tdescription:\n\t\t\t\"A control that allows for exposing shadows. The value will be provided as a string with valid CSS box-shadow values.\",\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <motion.div style={{ boxShadow: props.shadow }} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  shadow: {\n\t\t\t    type: ControlType.BoxShadow,\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Link\",\n\t\tdescription: \"A control that allows for exposing web links.\",\n\t\tproperties: [{ name: \"defaultValue\", description: \"Default URL as string\" }],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <a href={props.link}>My Link</a>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  link: {\n\t\t\t    type: ControlType.Link,\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Date\",\n\t\tdescription: \"A control that allows for exposing dates. The value will be provided in toJSON() string format.\",\n\t\tproperties: [{ name: \"displayTime\", description: \"Whether to include time selection\" }],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  const formattedDate = React.useMemo(() => {\n\t\t\t    return new Date(props.date).toLocaleDateString()\n\t\t\t  }, [props.date])\n\t\t\t  return <div>{formattedDate}</div>\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  date: {\n\t\t\t    type: ControlType.Date,\n\t\t\t    displayTime: true\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Object\",\n\t\tdescription: \"A control that allows for grouping multiple properties as an object.\",\n\t\tproperties: [\n\t\t\t{ name: \"controls\", description: \"Object containing nested controls\" },\n\t\t\t{ name: \"defaultValue\", description: \"Default object values\" },\n\t\t\t{ name: \"buttonTitle\", description: \"Custom button title\" },\n\t\t\t{ name: \"optional\", description: \"Whether the object is optional\" },\n\t\t\t{\n\t\t\t\tname: \"icon\",\n\t\t\t\tdescription: 'Icon to display (\"object\", \"effect\", \"color\", \"interaction\", or \"boolean\")',\n\t\t\t},\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <Frame opacity={props.myObject.opacity} background={props.myObject.tint} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  myObject: {\n\t\t\t    type: ControlType.Object,\n\t\t\t    controls: {\n\t\t\t      opacity: { type: ControlType.Number },\n\t\t\t      tint: { type: ControlType.Color },\n\t\t\t    }\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"Border\",\n\t\tdescription: \"A control that represents a border.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"Default border settings\" },\n\t\t\t{ name: \"optional\", description: \"Whether the border is optional\" },\n\t\t],\n\t\texample: `\n\t\t\texport default function MyComponent(props) {\n\t\t\t  return <div style={props.border} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  border: {\n\t\t\t    type: ControlType.Border,\n\t\t\t    defaultValue: {\n\t\t\t      borderWidth: 1,\n\t\t\t      borderStyle: \"solid\",\n\t\t\t      borderColor: \"rgba(0, 0, 0, 0.5)\",\n\t\t\t    },\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tMarkdown.section(\n\t\t\"Cursor\",\n\t\t\"A control that allows specifying a web cursor that should be shown when mousing over the element assigned.\",\n\t),\n\tcontrolSection({\n\t\ttitle: \"Padding\",\n\t\tdescription: \"A control that represents CSS padding.\",\n\t\tproperties: [{ name: \"defaultValue\", description: \"Default padding value\" }],\n\t\texample: `\n\t\t\tfunction MyComponent({ padding }) {\n\t\t\t  return <div style={{ padding }} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  padding: {\n\t\t\t    type: ControlType.Padding,\n\t\t\t    defaultValue: \"8px\",\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tcontrolSection({\n\t\ttitle: \"BorderRadius\",\n\t\tdescription: \"A control that represents CSS border radius.\",\n\t\tproperties: [\n\t\t\t{ name: \"defaultValue\", description: \"Default border radius value\" },\n\t\t\t{ name: \"title\", description: \"Custom title for the control\" },\n\t\t],\n\t\texample: `\n\t\t\tfunction MyComponent({ borderRadius }) {\n\t\t\t  return <div style={{ borderRadius }} />\n\t\t\t}\n\n\t\t\taddPropertyControls(MyComponent, {\n\t\t\t  borderRadius: {\n\t\t\t    type: ControlType.BorderRadius,\n\t\t\t    defaultValue: \"16px\",\n\t\t\t    title: \"Radius\",\n\t\t\t  }\n\t\t\t})\n\t\t`,\n\t}),\n\tMarkdown.section(\n\t\t\"TypeScript Interfaces\",\n\t\t\"Below are the TypeScript interfaces that define the structure of each control type. These interfaces can be used when developing with TypeScript.\",\n\t\tMarkdown.section(\n\t\t\t\"Base Control Description\",\n\t\t\t\"All control descriptions extend this base interface:\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Base control description interface\n\t\t\t\t */\n\t\t\t\texport declare interface BaseControlDescription<P = any> {\n\t\t\t\t    title?: string\n\t\t\t\t    description?: string\n\t\t\t\t    hidden?(props: P, rootProps: any): boolean\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Boolean Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Boolean control description\n\t\t\t\t */\n\t\t\t\texport declare interface BooleanControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Boolean\n\t\t\t\t    defaultValue?: boolean\n\t\t\t\t    disabledTitle?: string\n\t\t\t\t    enabledTitle?: string\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Number Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Number control description\n\t\t\t\t */\n\t\t\t\texport declare interface NumberControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Number\n\t\t\t\t    defaultValue?: number\n\t\t\t\t    max?: number\n\t\t\t\t    min?: number\n\t\t\t\t    unit?: string\n\t\t\t\t    step?: number\n\t\t\t\t    displayStepper?: boolean\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"String Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * String control description\n\t\t\t\t */\n\t\t\t\texport declare interface StringControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.String\n\t\t\t\t    defaultValue?: string\n\t\t\t\t    placeholder?: string\n\t\t\t\t    obscured?: boolean\n\t\t\t\t    displayTextArea?: boolean\n\t\t\t\t    preventLocalization?: boolean\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Enum Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Enum control description\n\t\t\t\t */\n\t\t\t\texport declare interface EnumControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Enum\n\t\t\t\t    defaultValue?: string | boolean | number | undefined | null\n\t\t\t\t    options: (string | boolean | number | undefined | null)[]\n\t\t\t\t    optionTitles?: string[]\n\t\t\t\t    displaySegmentedControl?: boolean\n\t\t\t\t    segmentedControlDirection?: \"horizontal\" | \"vertical\"\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Color Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Color control description\n\t\t\t\t */\n\t\t\t\texport declare interface ColorControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Color\n\t\t\t\t    defaultValue?: string\n\t\t\t\t    optional?: boolean\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"ResponsiveImage Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Responsive image control description\n\t\t\t\t */\n\t\t\t\texport declare interface ResponsiveImageControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.ResponsiveImage\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"File Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * File control description\n\t\t\t\t */\n\t\t\t\texport declare interface FileControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.File\n\t\t\t\t    allowedFileTypes: string[]\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Component Instance Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Component instance description\n\t\t\t\t */\n\t\t\t\texport declare interface ComponentInstanceDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.ComponentInstance\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Array Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Array control description\n\t\t\t\t */\n\t\t\t\texport declare interface ArrayControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Array\n\t\t\t\t    control: ArrayItemControlDescription<P>\n\t\t\t\t    maxCount?: number\n\t\t\t\t    defaultValue?: any[]\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Object Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Object control description\n\t\t\t\t */\n\t\t\t\texport declare interface ObjectControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Object\n\t\t\t\t    controls: {\n\t\t\t\t        [key: string]: ObjectPropertyControlDescription\n\t\t\t\t    }\n\t\t\t\t    defaultValue?: {\n\t\t\t\t        [key: string]: any\n\t\t\t\t    }\n\t\t\t\t    buttonTitle?: string\n\t\t\t\t    optional?: boolean\n\t\t\t\t    icon?: \"object\" | \"effect\" | \"color\" | \"interaction\" | \"boolean\"\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Link Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Link control description\n\t\t\t\t */\n\t\t\t\texport declare interface LinkControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Link\n\t\t\t\t    defaultValue?: string\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Border Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Border control description\n\t\t\t\t */\n\t\t\t\texport declare interface BorderControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Border\n\t\t\t\t    defaultValue?: Border\n\t\t\t\t    optional?: boolean\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Padding Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Padding control description\n\t\t\t\t */\n\t\t\t\texport declare interface PaddingControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Padding\n\t\t\t\t    defaultValue?: string\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Border Radius Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Border radius control description\n\t\t\t\t */\n\t\t\t\texport declare interface BorderRadiusControlDescription<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.BorderRadius\n\t\t\t\t    defaultValue?: string\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Font Control\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Font control descriptions\n\t\t\t\t */\n\t\t\t\tinterface FontControlDescriptionBase<P = any> extends BaseControlDescription<P> {\n\t\t\t\t    type: ControlType.Font\n\t\t\t\t    controls?: \"basic\" | \"extended\"\n\t\t\t\t    displayTextAlignment?: boolean\n\t\t\t\t    displayFontSize?: boolean\n\t\t\t\t}\n\n\t\t\t\tinterface FontControlDescriptionSansSerif<P = any> extends FontControlDescriptionBase<P> {\n\t\t\t\t    defaultFontType?: \"sans-serif\"\n\t\t\t\t    defaultValue?: FontControlDefaultValueWithVariant\n\t\t\t\t}\n\n\t\t\t\tinterface FontControlDescriptionMonospace<P = any> extends FontControlDescriptionBase<P> {\n\t\t\t\t    defaultFontType?: \"monospace\"\n\t\t\t\t    defaultValue?: FontControlDefaultValueBase\n\t\t\t\t}\n\n\t\t\t\texport type FontControlDescription<P = any> = FontControlDescriptionSansSerif<P> | FontControlDescriptionMonospace<P>\n\n\t\t\t\tinterface FontControlDefaultValueBase {\n\t\t\t\t    textAlign?: \"left\" | \"right\" | \"center\"\n\t\t\t\t    fontSize?: string | number\n\t\t\t\t    letterSpacing?: string | number\n\t\t\t\t    lineHeight?: string | number\n\t\t\t\t}\n\n\t\t\t\tinterface FontControlDefaultValueWithVariant extends FontControlDefaultValueBase {\n\t\t\t\t    variant?: FramerFontVariant\n\t\t\t\t}\n\n\t\t\t\texport const framerFontVariants = [\n\t\t\t\t    \"Regular\",\n\t\t\t\t    \"Thin\",\n\t\t\t\t    \"Extra Light\",\n\t\t\t\t    \"Light\",\n\t\t\t\t    \"Medium\",\n\t\t\t\t    \"Semibold\",\n\t\t\t\t    \"Bold\",\n\t\t\t\t    \"Extra Bold\",\n\t\t\t\t    \"Black\",\n\t\t\t\t    \"Thin Italic\",\n\t\t\t\t    \"Extra Light Italic\",\n\t\t\t\t    \"Light Italic\",\n\t\t\t\t    \"Italic\",\n\t\t\t\t    \"Medium Italic\",\n\t\t\t\t    \"Semibold Italic\",\n\t\t\t\t    \"Bold Italic\",\n\t\t\t\t    \"Extra Bold Italic\",\n\t\t\t\t    \"Black Italic\",\n\t\t\t\t    \"Regular Italic\",\n\t\t\t\t    \"Variable\",\n\t\t\t\t    \"Variable Italic\",\n\t\t\t\t] as const\n\n\t\t\t\texport type FramerFontVariant = (typeof framerFontVariants)[number]\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"All Control Types\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Type for all possible control descriptions\n\t\t\t\t */\n\t\t\t\texport declare type ControlDescription<P = any> =\n\t\t\t\t    | NumberControlDescription<P>\n\t\t\t\t    | EnumControlDescription<P>\n\t\t\t\t    | BooleanControlDescription<P>\n\t\t\t\t    | StringControlDescription<P>\n\t\t\t\t    | ColorControlDescription<P>\n\t\t\t\t    | ResponsiveImageControlDescription<P>\n\t\t\t\t    | FileControlDescription<P>\n\t\t\t\t    | ComponentInstanceDescription<P>\n\t\t\t\t    | ArrayControlDescription<P>\n\t\t\t\t    | ObjectControlDescription<P>\n\t\t\t\t    | LinkControlDescription<P>\n\t\t\t\t    | BorderControlDescription<P>\n\t\t\t\t    | PaddingControlDescription<P>\n\t\t\t\t    | BorderRadiusControlDescription<P>\n\t\t\t\t    | FontControlDescription<P>\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Property Controls\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Property controls for components\n\t\t\t\t */\n\t\t\t\texport declare type PropertyControls<ComponentProps = any, ArrayTypes = any> = {\n\t\t\t\t    [K in keyof ComponentProps]?: ControlDescription<Partial<ComponentProps>>\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t),\n\tMarkdown.section(\n\t\t\"Associated Methods and Types\",\n\t\t\"Below are essential functions and types that are used alongside the control types.\",\n\t\tMarkdown.section(\n\t\t\t\"addPropertyControls\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Adds property controls to a component\n\t\t\t\t */\n\t\t\t\texport declare function addPropertyControls<Props = any>(\n\t\t\t\t    component: React.ComponentType<Props> | React.ForwardRefExoticComponent<Props>,\n\t\t\t\t    propertyControls: PropertyControls<Props>\n\t\t\t\t): void;\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"addFonts\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Adds fonts to a component\n\t\t\t\t */\n\t\t\t\texport declare function addFonts(\n\t\t\t\t    component: React.ComponentType<unknown>,\n\t\t\t\t    fonts: any[],\n\t\t\t\t    flags?: { supportsExplicitInterCodegen?: boolean }\n\t\t\t\t): void;\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Data API\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Data API for state management\n\t\t\t\t */\n\t\t\t\texport declare const Data: {\n\t\t\t\t    <T extends object = object>(initial?: Partial<T> | object): T;\n\t\t\t\t};\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Renderer Detection APIs\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Renderer detection APIs\n\t\t\t\t */\n\t\t\t\texport declare type RenderTarget = RenderTargetName;\n\n\t\t\t\texport declare const RenderTarget: {\n\t\t\t\t    canvas: RenderTargetName;\n\t\t\t\t    export: RenderTargetName;\n\t\t\t\t    thumbnail: RenderTargetName;\n\t\t\t\t    preview: RenderTargetName;\n\t\t\t\t    current: () => RenderTargetName;\n\t\t\t\t    hasRestrictions: () => boolean;\n\t\t\t\t};\n\n\t\t\t\t/**\n\t\t\t\t * Check if the caller is executed in a Framer Canvas or Export Canvas environment\n\t\t\t\t */\n\t\t\t\texport declare function isStaticRenderer(): boolean;\n\n\t\t\t\t/**\n\t\t\t\t * Hook to check if in a static renderer (Canvas or Export)\n\t\t\t\t */\n\t\t\t\texport declare function useIsStaticRenderer(): boolean;\n\n\t\t\t\t/**\n\t\t\t\t * Hook to observe data changes\n\t\t\t\t */\n\t\t\t\texport declare function useObserveData(): boolean;\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Border Interface\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Border interface\n\t\t\t\t */\n\t\t\t\texport declare interface Border {\n\t\t\t\t    borderColor?: string;\n\t\t\t\t    borderStyle?: 'solid' | 'dashed' | 'dotted' | 'double';\n\t\t\t\t    borderWidth?: number;\n\t\t\t\t    borderTopWidth?: number;\n\t\t\t\t    borderLeftWidth?: number;\n\t\t\t\t    borderRightWidth?: number;\n\t\t\t\t    borderBottomWidth?: number;\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Color Interface and Utilities\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Color interface and utilities\n\t\t\t\t */\n\t\t\t\texport declare interface Color {\n\t\t\t\t    r: number;\n\t\t\t\t    g: number;\n\t\t\t\t    b: number;\n\t\t\t\t    h: number;\n\t\t\t\t    s: number;\n\t\t\t\t    l: number;\n\t\t\t\t    a: number;\n\t\t\t\t    roundA: number;\n\t\t\t\t    format: ColorFormat;\n\t\t\t\t    initialValue?: string;\n\t\t\t\t    isValid?: boolean;\n\t\t\t\t    mix: any;\n\t\t\t\t    toValue: () => string;\n\t\t\t\t}\n\n\t\t\t\texport declare enum ColorFormat {\n\t\t\t\t    RGB = 'rgb',\n\t\t\t\t    HSL = 'hsl',\n\t\t\t\t    HSV = 'hsv',\n\t\t\t\t    HEX = 'hex',\n\t\t\t\t    NAME = 'name',\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Version\",\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\t/**\n\t\t\t\t * Version of the library\n\t\t\t\t */\n\t\t\t\texport declare const version: string;\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t),\n\tMarkdown.section(\n\t\t\"How to use Property Controls\",\n\t\t\"**MANDATORY**: EVERY component MUST have property controls. This is non-negotiable regardless of whether you're creating from scratch or replicating an image.\",\n\t\t`- Use ${escapeValue(\"addPropertyControls\")} from ${escapeValue('\"framer\"')} for configurable props with sensible defaults.\n- Use the detailed reference in this section as the source of truth for all available control types and how to structure them.\n- Maximize meaningful configurability for Framer usage, but do not expose internal implementation details as controls unless they are part of the intended API.\n- Repeated or structured content such as testimonials, FAQs, team members, menu links, and feature lists should usually be modeled with array/object-style controls instead of being hardcoded.\n- Provide at least one sensible default item for repeated structured content.\n- NEVER EVER USE \"ComponentName.defaultProps\". ALWAYS use \"defaultValue\" on the property control instead.\n- ALWAYS use ${escapeValue(\"addPropertyControls\")} for every prop in the component, even when replicating images. Apply the following rules:\n- ALWAYS use the ${escapeValue(\"ControlType\")} enum to generate the ${escapeValue(\"type\")} property.\n- ALWAYS use property controls for things that require flexibility and configurability. Don't overdo it. Hardcode the rest unless prompted by the user.\n- ALWAYS USE ${escapeValue(\"ControlType.Color\")} for every background and text colors. Re-use the same control prop for things with the same color.\n- ALWAYS USE ${escapeValue(\"ControlType.Font\")} for all text. Re-use the same control prop for text with the same font. Otherwise create a new one with a different name.\n- You can combine ${escapeValue(\"ControlType.Object\")} and ${escapeValue(\"ControlType.Array\")} to create props for grouped data for things that need to be configurable.\n- ALWAYS provide a ${escapeValue(\"defaultValue\")} for every prop. Also provide at least a single item in an ${escapeValue(\"ControlType.Array\")} control.\n- Image must use ${escapeValue(\"ControlType.ResponsiveImage\")} for every image prop.\n- Prefer sliders instead of steppers, unless step values are large.\n- When a control type does not support ${escapeValue(\"defaultValue\")} directly, provide the fallback through prop destructuring or component logic instead of ${escapeValue(\"defaultProps\")}.\n- Reuse the same control prop when multiple elements should stay visually in sync.`,\n\t\tMarkdown.section(\n\t\t\t\"When to add Property Controls?\",\n\t\t\t\"- The component should not have an overwhelming amount of property controls but still be flexible and configurable.\",\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Styling of text elements\",\n\t\t\t`When using Control Properties on text elements, do not introduce any new control properties for styles which can be applied with ${escapeValue(\"ControlType.Font\")} and ${escapeValue(\"FontControlDescription\")} respectively. Specifically:\n- ${escapeValue(\"FontControlDescription.defaultValue.fontSize\")} for ${escapeValue(\"font-size\")}\n- ${escapeValue(\"FontControlDescription.defaultValue.textAlign\")} for ${escapeValue(\"text-alignment\")}\n- ${escapeValue(\"FontControlDescription.defaultValue.letterSpacing\")} for ${escapeValue(\"letter-spacing\")}\n- ${escapeValue(\"FontControlDescription.defaultValue.lineHeight\")} for ${escapeValue(\"line-height\")}\n- ${escapeValue(\"FontControlDescription.defaultValue.variant\")} for ${escapeValue(\"font-weight\")} and/or ${escapeValue(\"font-style\")}\n- ${escapeValue(\"FontControlDescription.defaultValue.variant\")} can be set only if ${escapeValue(\"FontControlDescription.defaultFontType\")} is set to ${escapeValue('\"sans-serif\"')}`,\n\t\t\t`Remarks:\n- ${escapeValue(\"FontControlDescription.defaultValue.fontFamily\")} is not a valid default value\n- You are not allowed to set default value for the font family.\n- If you have been asked to set the font family, you must reply that the font family can be set only by the user on the font control\n- You must always set ${escapeValue(\"FontControlDescription.controls\")} to ${escapeValue('\"extended\"')} when working with ${escapeValue(\"ControlType.Font\")}`,\n\t\t\t`When you need to use font weight you should use ${escapeValue(\"FontControlDescription.defaultValue.variant\")}.\nThe variant encapsulates both the font weight and style together. Refer to the following object to determine the correct variant for a given font weight:`,\n\t\t\tcodeBlock(\n\t\t\t\t\"typescript\",\n\t\t\t\t`\n\t\t\t\tinterface ResolvedFontVariant {\n\t\t\t\t    fontStyle: \"normal\" | \"italic\"\n\t\t\t\t    fontWeight: number\n\t\t\t\t}\n\n\t\t\t\tconst variantNameToFontWeight: Record<FramerFontVariant, ResolvedFontVariant> = {\n\t\t\t\t    Regular: { fontStyle: \"normal\", fontWeight: 400 },\n\t\t\t\t    Thin: { fontStyle: \"normal\", fontWeight: 100 },\n\t\t\t\t    \"Extra Light\": { fontStyle: \"normal\", fontWeight: 200 },\n\t\t\t\t    Light: { fontStyle: \"normal\", fontWeight: 300 },\n\t\t\t\t    Medium: { fontStyle: \"normal\", fontWeight: 500 },\n\t\t\t\t    Semibold: { fontStyle: \"normal\", fontWeight: 600 },\n\t\t\t\t    Bold: { fontStyle: \"normal\", fontWeight: 700 },\n\t\t\t\t    \"Extra Bold\": { fontStyle: \"normal\", fontWeight: 800 },\n\t\t\t\t    Black: { fontStyle: \"normal\", fontWeight: 900 },\n\t\t\t\t    \"Thin Italic\": { fontStyle: \"italic\", fontWeight: 100 },\n\t\t\t\t    \"Extra Light Italic\": { fontStyle: \"italic\", fontWeight: 200 },\n\t\t\t\t    \"Light Italic\": { fontStyle: \"italic\", fontWeight: 300 },\n\t\t\t\t    Italic: { fontStyle: \"italic\", fontWeight: 400 },\n\t\t\t\t    \"Medium Italic\": { fontStyle: \"italic\", fontWeight: 500 },\n\t\t\t\t    \"Semibold Italic\": { fontStyle: \"italic\", fontWeight: 600 },\n\t\t\t\t    \"Bold Italic\": { fontStyle: \"italic\", fontWeight: 700 },\n\t\t\t\t    \"Extra Bold Italic\": { fontStyle: \"italic\", fontWeight: 800 },\n\t\t\t\t    \"Black Italic\": { fontStyle: \"italic\", fontWeight: 900 },\n\t\t\t\t    \"Regular Italic\": { fontStyle: \"italic\", fontWeight: 400 },\n\t\t\t\t    Variable: { fontStyle: \"normal\", fontWeight: 400 },\n\t\t\t\t    \"Variable Italic\": { fontStyle: \"italic\", fontWeight: 400 },\n\t\t\t\t}\n\t\t\t`,\n\t\t\t),\n\t\t\t`Example of a simple text component in Framer which demonstrates how to use Property Control of type ${escapeValue(\"ControlType.Font\")}.`,\n\t\t\tcodeBlock(\n\t\t\t\t\"tsx\",\n\t\t\t\t`\n\t\t\t\timport { addPropertyControls, ControlType } from \"framer\"\n\n\t\t\t\t/**\n\t\t\t\t * @framerSupportedLayoutWidth auto\n\t\t\t\t * @framerSupportedLayoutHeight auto\n\t\t\t\t */\n\t\t\t\texport default function SimpleText(props) {\n\t\t\t\t    const { label, heading } = props\n\t\t\t\t    return (\n\t\t\t\t        <span\n\t\t\t\t            style={{\n\t\t\t\t                fontSize: heading.fontSize,\n\t\t\t\t                textAlign: heading.textAlign,\n\t\t\t\t                fontWeight: heading.fontWeight,\n\t\t\t\t                fontFamily: heading.fontFamily,\n\t\t\t\t                lineHeight: heading.lineHeight,\n\t\t\t\t                letterSpacing: heading.letterSpacing,\n\t\t\t\t                fontStyle: heading.fontStyle,\n\t\t\t\t            }}\n\t\t\t\t        >\n\t\t\t\t            {label}\n\t\t\t\t        </span>\n\t\t\t\t    )\n\t\t\t\t}\n\n\t\t\t\taddPropertyControls(SimpleText, {\n\t\t\t\t    heading: {\n\t\t\t\t        type: ControlType.Font,\n\t\t\t\t        title: \"Heading 2 Font\",\n\t\t\t\t        defaultValue: {\n\t\t\t\t            textAlign: \"right\",\n\t\t\t\t            fontSize: 40,\n\t\t\t\t            variant: \"Extra Bold\",\n\t\t\t\t            letterSpacing: \"-0.03em\",\n\t\t\t\t            lineHeight: \"1em\",\n\t\t\t\t        },\n\t\t\t\t        controls: \"extended\",\n\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t    },\n\t\t\t\t    label: {\n\t\t\t\t        title: \"Label\",\n\t\t\t\t        type: ControlType.String,\n\t\t\t\t        defaultValue: \"Hello\",\n\t\t\t\t    },\n\t\t\t\t})\n\t\t\t`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Default Control Values\",\n\t\t\t\"Below are the recommended default values for some control types. Always use these values for consistency.\",\n\t\t\tMarkdown.section(\n\t\t\t\t\"Colors\",\n\t\t\t\t\"Use these exact values for all color controls\",\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"typescript\",\n\t\t\t\t\t`\n\t\t\t\t\tconst colors: Record<string, ColorControlDescription> = {\n\t\t\t\t\t    /** Use for main container backgrounds, cards, and primary surfaces */\n\t\t\t\t\t    background: {\n\t\t\t\t\t        type: ControlType.Color,\n\t\t\t\t\t        defaultValue: \"#FFFFFF\", // White: backgrounds\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for secondary backgrounds, input fields, and subtle visual elements */\n\t\t\t\t\t    subtleBackground: {\n\t\t\t\t\t        type: ControlType.Color,\n\t\t\t\t\t        defaultValue: \"#F5F5F5\", // Very light gray: subtle backgrounds, placeholders\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for borders, dividers, and visual separators */\n\t\t\t\t\t    darkBackground: {\n\t\t\t\t\t        type: ControlType.Color,\n\t\t\t\t\t        defaultValue: \"#EEEEEE\", // Light gray: borders, separators\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for secondary text, icons, and less prominent UI elements */\n\t\t\t\t\t    tertiary: {\n\t\t\t\t\t        type: ControlType.Color,\n\t\t\t\t\t        defaultValue: \"#CCCCCC\", // Medium gray: text, icons\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for primary text, icons, and key UI elements that need emphasis */\n\t\t\t\t\t    primary: {\n\t\t\t\t\t        type: ControlType.Color,\n\t\t\t\t\t        defaultValue: \"#000000\", // Black: text, icons\n\t\t\t\t\t    },\n\t\t\t\t\t}\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Images\",\n\t\t\t\t`Image property controls must ALWAYS have a default image, however ${escapeValue(\"type: ControlType.ResponsiveImage\")} does not support a default value:\ninstead, you MUST add these objects as default params to the image prop within the Component body.\nExample: ${escapeValue('const { image = { src: \"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\", alt: \"Gradient 1 - Blue\" } } = props')}\nWhen applying to image property to elements within the component body, use spreads like ${escapeValue(\"{...image}\")}`,\n\t\t\t\t`Use these exact image sources for all image controls\nThe images are in a gradient order - use in sequence when multiple are needed`,\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"typescript\",\n\t\t\t\t\t`\n\t\t\t\t\tconst images = {\n\t\t\t\t\t  /** Use for professional or corporate contexts, informational content, or quinary image slot */\n\t\t\t\t\t  image1: {\n\t\t\t\t\t    src: \"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",\n\t\t\t\t\t    alt: \"Gradient 1 - Blue\"\n\t\t\t\t\t  },\n\t\t\t\t\t  /** Use for creative or innovative contexts, feature highlights, or quaternary image slot */\n\t\t\t\t\t  image2: {\n\t\t\t\t\t    src: \"https://framerusercontent.com/images/aNsAT3jCvt4zglbWCUoFe33Q.jpg\",\n\t\t\t\t\t    alt: \"Gradient 2 - Purple\"\n\t\t\t\t\t  },\n\t\t\t\t\t  /** Use for energetic contexts, call-to-action backgrounds, or tertiary image slot */\n\t\t\t\t\t  image3: {\n\t\t\t\t\t    src: \"https://framerusercontent.com/images/BYnxEV1zjYb9bhWh1IwBZ1ZoS60.jpg\",\n\t\t\t\t\t    alt: \"Gradient 3 - Orange\"\n\t\t\t\t\t  },\n\t\t\t\t\t  /** Use for warm-toned contexts, product showcases, or secondary image slot */\n\t\t\t\t\t  image4: {\n\t\t\t\t\t    src: \"https://framerusercontent.com/images/2uTNEj5aTl2K3NJaEFWMbnrA.jpg\",\n\t\t\t\t\t    alt: \"Gradient 4 - Yellow\"\n\t\t\t\t\t  },\n\t\t\t\t\t  /** Use for nature-themed components, environmental contexts, or primary image slot */\n\t\t\t\t\t  image5: {\n\t\t\t\t\t    src: \"https://framerusercontent.com/images/f9RiWoNpmlCMqVRIHz8l8wYfeI.jpg\",\n\t\t\t\t\t    alt: \"Gradient 5 - Green\"\n\t\t\t\t\t  }\n\t\t\t\t\t}\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Typography\",\n\t\t\t\t\"Use these exact font definitions for all text elements\",\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"typescript\",\n\t\t\t\t\t`\n\t\t\t\t\tconst typography: Record<string, FontControlDescription> = {\n\t\t\t\t\t    /** Use for main page titles and primary headlines */\n\t\t\t\t\t    heading1: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Heading 1 Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            fontSize: \"40px\",\n\t\t\t\t\t            variant: \"Bold\",\n\t\t\t\t\t            letterSpacing: \"-0.04em\",\n\t\t\t\t\t            lineHeight: \"1em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for section titles and secondary headlines */\n\t\t\t\t\t    heading2: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Heading 2 Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            fontSize: \"32px\",\n\t\t\t\t\t            variant: \"Semibold\",\n\t\t\t\t\t            letterSpacing: \"-0.03em\",\n\t\t\t\t\t            lineHeight: \"1em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for subsection titles and feature headings */\n\t\t\t\t\t    heading3: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Heading 3 Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            fontSize: \"22px\",\n\t\t\t\t\t            variant: \"Semibold\",\n\t\t\t\t\t            letterSpacing: \"-0.01em\",\n\t\t\t\t\t            lineHeight: \"1.2em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for card titles, list headings, and UI element headers */\n\t\t\t\t\t    heading4: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Heading 4 Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            fontSize: \"15px\",\n\t\t\t\t\t            variant: \"Medium\",\n\t\t\t\t\t            letterSpacing: \"-0.01em\",\n\t\t\t\t\t            lineHeight: \"1em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for body text, descriptions, and general content */\n\t\t\t\t\t    paragraph: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Paragraph Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            fontSize: \"15px\",\n\t\t\t\t\t            variant: \"Medium\",\n\t\t\t\t\t            letterSpacing: \"-0.01em\",\n\t\t\t\t\t            lineHeight: \"1.3em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for buttons, links, and interactive text elements */\n\t\t\t\t\t    buttonText: {\n\t\t\t\t\t        type: ControlType.Font,\n\t\t\t\t\t        title: \"Button Text Font\",\n\t\t\t\t\t        defaultValue: {\n\t\t\t\t\t            variant: \"Semibold\",\n\t\t\t\t\t            fontSize: \"14px\",\n\t\t\t\t\t            letterSpacing: \"-0.01em\",\n\t\t\t\t\t            lineHeight: \"1em\",\n\t\t\t\t\t        },\n\t\t\t\t\t        controls: \"extended\",\n\t\t\t\t\t        defaultFontType: \"sans-serif\",\n\t\t\t\t\t    },\n\t\t\t\t\t}\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"File Types\",\n\t\t\t\t`IMPORTANT: Unlike other control types, ${escapeValue(\"ControlType.File\")} DOES NOT support ${escapeValue(\"defaultValue\")} in its property control.\nInstead, always set default values through component parameter destructuring.`,\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"typescript\",\n\t\t\t\t\t`\n\t\t\t\t\tconst fileTypes: Record<string, FileControlDescription> = {\n\t\t\t\t\t    /** Use for image upload fields, gallery components, and avatar selectors */\n\t\t\t\t\t    images: {\n\t\t\t\t\t        type: ControlType.File,\n\t\t\t\t\t        allowedFileTypes: [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"],\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for video players, media galleries, and promotional content */\n\t\t\t\t\t    videos: {\n\t\t\t\t\t        type: ControlType.File,\n\t\t\t\t\t        allowedFileTypes: [\"mp4\", \"webm\", \"mov\"],\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for document viewers, file download components, and resource sections */\n\t\t\t\t\t    documents: {\n\t\t\t\t\t        type: ControlType.File,\n\t\t\t\t\t        allowedFileTypes: [\"pdf\", \"doc\", \"docx\", \"txt\"],\n\t\t\t\t\t    },\n\t\t\t\t\t    /** Use for audio players, podcast components, and music interfaces */\n\t\t\t\t\t    audio: {\n\t\t\t\t\t        type: ControlType.File,\n\t\t\t\t\t        allowedFileTypes: [\"mp3\", \"wav\", \"ogg\"],\n\t\t\t\t\t    },\n\t\t\t\t\t}\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t\t\"Use the following values for each file type as default values:\",\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"typescript\",\n\t\t\t\t\t`\n\t\t\t\t\tconst defaultValues: Partial<Record<keyof typeof fileTypes, string>> = {\n\t\t\t\t\t    images: \"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",\n\t\t\t\t\t    videos: \"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",\n\t\t\t\t\t    audio: \"https://framerusercontent.com/assets/8w3IUatLX9a5JVJ6XPCVuHi94.mp3\",\n\t\t\t\t\t}\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t\t`Always use this pattern in your component to set default values for file controls.\nExample component showing proper default value handling:`,\n\t\t\t\tcodeBlock(\n\t\t\t\t\t\"tsx\",\n\t\t\t\t\t`\n\t\t\t\t\texport default function MyComponent(props) {\n\t\t\t\t\t    // CORRECT: Set file defaults through parameter destructuring\n\t\t\t\t\t    const {\n\t\t\t\t\t        imageFile = \"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",\n\t\t\t\t\t        videoFile = \"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",\n\t\t\t\t\t        audioFile = \"https://framerusercontent.com/assets/8w3IUatLX9a5JVJ6XPCVuHi94.mp3\",\n\t\t\t\t\t    } = props\n\n\t\t\t\t\t    return (\n\t\t\t\t\t        <div>\n\t\t\t\t\t            <img src={imageFile} />\n\t\t\t\t\t            <video src={videoFile} />\n\t\t\t\t\t            <audio src={audioFile} />\n\t\t\t\t\t        </div>\n\t\t\t\t\t    )\n\t\t\t\t\t}\n\n\t\t\t\t\taddPropertyControls(MyComponent, {\n\t\t\t\t\t    imageFile: {\n\t\t\t\t\t        type: ControlType.File,\n\t\t\t\t\t        allowedFileTypes: [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"],\n\t\t\t\t\t    },\n\t\t\t\t\t    // Additional file controls...\n\t\t\t\t\t})\n\t\t\t\t`,\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t),\n]\n", "import { Markdown } from \"../../prompt/markdown.ts\"\nimport { escapeValue } from \"../../prompt/utils.ts\"\nimport { implementationGuidelines } from \"./implementationGuidelinesPrompt.ts\"\nimport { framerPropertyControls } from \"./propControlsPrompt.ts\"\n\nexport const REQUEST_CODE_FILE_CHANGES_SYSTEM_PROMPT = Markdown.serialize(\n\tMarkdown.section(\"Role\", \"You are a code component generator for Framer.\"),\n\tMarkdown.section(\n\t\t\"Tool Use\",\n\t\t`CRITICAL: You MUST use the ${escapeValue(\"apply_patch\")} tool to create, update, or delete files. NEVER output code as plain text in your response. Your ONLY way to deliver code is through the ${escapeValue(\"apply_patch\")} tool. Any code or JSON written as text in your message will be ignored.`,\n\t),\n\tMarkdown.section(\n\t\t\"Input Expectations\",\n\t\t\"If the request names a component to create, treat that as the desired component/file name. Do not assume the caller will provide source code.\",\n\t\t\"The caller may summarize relevant project context such as layout constraints, spacing rhythm, palette, typography, and reused UI patterns. Treat that summary as the source of truth for project-specific styling context that you cannot observe directly.\",\n\t\t\"If the request describes repeated or page-specific user-facing content, prefer exposing that content through property controls whenever feasible instead of hardcoding large datasets into the component. Keep defaults minimal unless the request explicitly requires built-in content.\",\n\t\t\"Only treat literal pasted code as mandatory when the request explicitly provides code that must be preserved, transformed, or edited.\",\n\t),\n\tMarkdown.section(\n\t\t\"Component Shape\",\n\t\t\"- Generate a single self-contained file that default-exports one function component.\",\n\t\t`- Add a block comment immediately above the component with ${escapeValue(\"@framerSupportedLayoutWidth\")} and ${escapeValue(\"@framerSupportedLayoutHeight\")} annotations chosen to match the component's intended sizing behavior.`,\n\t\t`- Only import from ${escapeValue('\"react\"')}, ${escapeValue('\"react-dom\"')}, ${escapeValue('\"framer\"')}, and ${escapeValue('\"framer-motion\"')}.`,\n\t\t\"- Use inline styles, no CSS-in-JS.\",\n\t\t`- Define a ${escapeValue(\"MyComponentProps\")} interface for the component props.`,\n\t),\n\tMarkdown.section(\"Property Controls\", ...framerPropertyControls),\n\timplementationGuidelines,\n\tMarkdown.section(\n\t\t\"Runtime and Accessibility\",\n\t\t`- Handle SSR and avoid direct ${escapeValue(\"window\")}/${escapeValue(\"document\")} access without guards.`,\n\t\t`- When the component depends on animation, drag interactions, DOM measurement, or render-target-specific behavior, account for Framer's static/canvas environments and use APIs such as ${escapeValue(\"useIsStaticRenderer()\")} or ${escapeValue(\"isStaticRenderer()\")} when relevant to provide a useful static fallback.`,\n\t\t\"- Use semantic HTML and add appropriate accessibility attributes for interactive elements.\",\n\t\t`- Add ${escapeValue('alt=\"\"')} to decorative images, and meaningful alternative text when an image conveys content.`,\n\t\t`- For auto-sized text-heavy components, ensure the text can size correctly, for example with ${escapeValue('width: \"max-content\"')} or ${escapeValue('minWidth: \"max-content\"')} when needed.`,\n\t\t`- Let the parent/container handle placement; avoid ${escapeValue(\"position: fixed\")} and prefer relative positioning in the first HTML tag of the component.`,\n\t),\n\tMarkdown.section(\n\t\t\"TypeScript Errors\",\n\t\t`The ${escapeValue(\"apply_patch\")} tool will typecheck the file after each change. If it reports TypeScript errors, fix them with another ${escapeValue(\"apply_patch\")} call before finishing. Keep iterating until the latest ${escapeValue(\"apply_patch\")} result for the changed file is clean. Ignore errors clearly unrelated to your changes, or errors that you are unable to resolve after a few attempts.`,\n\t),\n\tMarkdown.section(\n\t\t\"Self-Check\",\n\t\t\"- Before finishing, confirm the component matches the requested behavior and visual contract, uses Framer-appropriate property controls, keeps page-instance data configurable when it should be editable, and respects SSR/static-render constraints.\",\n\t),\n\tMarkdown.section(\n\t\t\"Response\",\n\t\t`After using ${escapeValue(\"apply_patch\")}, fix the TypeScript errors per the earlier instructions. Then, respond with a brief summary of what was created or changed. Do not repeat the code or any TypeScript diagnostics.`,\n\t),\n)\n", "import { ZodSchema, ZodTypeDef } from 'zod/v3';\nimport { Refs, Seen } from './Refs';\nimport { JsonSchema7Type } from './parseDef';\n\nexport type Targets = 'jsonSchema7' | 'jsonSchema2019-09' | 'openApi3';\n\nexport type DateStrategy = 'format:date-time' | 'format:date' | 'string' | 'integer';\n\nexport const ignoreOverride = Symbol('Let zodToJsonSchema decide on which parser to use');\n\nexport type Options<Target extends Targets = 'jsonSchema7'> = {\n  name: string | undefined;\n  $refStrategy: 'root' | 'relative' | 'none' | 'seen' | 'extract-to-root';\n  basePath: string[];\n  effectStrategy: 'input' | 'any';\n  pipeStrategy: 'input' | 'output' | 'all';\n  dateStrategy: DateStrategy | DateStrategy[];\n  mapStrategy: 'entries' | 'record';\n  removeAdditionalStrategy: 'passthrough' | 'strict';\n  nullableStrategy: 'from-target' | 'property';\n  target: Target;\n  strictUnions: boolean;\n  definitionPath: string;\n  definitions: Record<string, ZodSchema | ZodTypeDef>;\n  errorMessages: boolean;\n  markdownDescription: boolean;\n  patternStrategy: 'escape' | 'preserve';\n  applyRegexFlags: boolean;\n  emailStrategy: 'format:email' | 'format:idn-email' | 'pattern:zod';\n  base64Strategy: 'format:binary' | 'contentEncoding:base64' | 'pattern:zod';\n  nameStrategy: 'ref' | 'duplicate-ref' | 'title';\n  override?: (\n    def: ZodTypeDef,\n    refs: Refs,\n    seen: Seen | undefined,\n    forceResolution?: boolean,\n  ) => JsonSchema7Type | undefined | typeof ignoreOverride;\n  openaiStrictMode?: boolean;\n};\n\nconst defaultOptions: Omit<Options, 'definitions' | 'basePath'> = {\n  name: undefined,\n  $refStrategy: 'root',\n  effectStrategy: 'input',\n  pipeStrategy: 'all',\n  dateStrategy: 'format:date-time',\n  mapStrategy: 'entries',\n  nullableStrategy: 'from-target',\n  removeAdditionalStrategy: 'passthrough',\n  definitionPath: 'definitions',\n  target: 'jsonSchema7',\n  strictUnions: false,\n  errorMessages: false,\n  markdownDescription: false,\n  patternStrategy: 'escape',\n  applyRegexFlags: false,\n  emailStrategy: 'format:email',\n  base64Strategy: 'contentEncoding:base64',\n  nameStrategy: 'ref',\n};\n\nexport const getDefaultOptions = <Target extends Targets>(\n  options: Partial<Options<Target>> | string | undefined,\n) => {\n  // We need to add `definitions` here as we may mutate it\n  return (\n    typeof options === 'string' ?\n      {\n        ...defaultOptions,\n        basePath: ['#'],\n        definitions: {},\n        name: options,\n      }\n    : {\n        ...defaultOptions,\n        basePath: ['#'],\n        definitions: {},\n        ...options,\n      }) as Options<Target>;\n};\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "import type { Immutable } from \"@framerjs/app-shared/src/lib/immer.ts\"\nimport type { LocalModuleId } from \"@framerjs/shared\"\nimport { assert, ModuleType } from \"@framerjs/shared\"\nimport { getUniqueName } from \"code-editor/utils.ts\"\nimport type { ModulesStore, ModuleSaveReference } from \"document/stores/ModulesStore.ts\"\nimport type { ModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { ModuleMetadata } from \"modules/types.ts\"\n\nexport function getUniquePath(modulesStore: ModulesStore, path: string): string {\n\tconst existingPaths = new Set<string>(Array.from(modulesStore.localModules.values(), m => m.name))\n\treturn getUniqueName(existingPaths, path)\n}\n\nexport async function createCodeFileModule(\n\tmodulesStore: ModulesStore,\n\tpath: string,\n\tsource: string,\n\tpluginId?: string,\n\teditViaPlugin: boolean = true,\n): Promise<Immutable<ModuleEntry>> {\n\tconst uniquePath = getUniquePath(modulesStore, path)\n\n\tconst localId = await modulesStore.forType(ModuleType.Code).create({\n\t\tname: uniquePath,\n\t\tsource,\n\t\tmetadata: pluginId\n\t\t\t? { [ModuleMetadata.PluginId]: pluginId, [ModuleMetadata.EditViaPlugin]: editViaPlugin }\n\t\t\t: undefined,\n\t})\n\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for file not found\", localId)\n\treturn entry\n}\n\nexport async function updateCodeFileModule(\n\tmodulesStore: ModulesStore,\n\tlocalId: LocalModuleId,\n\tsource: string,\n): Promise<Immutable<ModuleEntry>> {\n\tconst handle = modulesStore.forType(ModuleType.Code).getByLocalId(localId)\n\tawait handle.updateSource(source)\n\n\t// Squeeze getting the entry in-between `updateSource` and `persist`.\n\t// Maximizes chance of returning the entry resulting from this update.\n\t// Getting after `persist` may return something newer.\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for file not found\", localId)\n\n\tawait handle.persist({})\n\treturn entry\n}\n\nexport async function restoreCodeFileModule(\n\tmodulesStore: ModulesStore,\n\tlocalId: LocalModuleId,\n\tversion: ModuleSaveReference,\n\tprefetchedSource?: string,\n): Promise<Immutable<ModuleEntry>> {\n\tconst source = prefetchedSource ?? (await modulesStore.getSourceContentForModuleSave(version))\n\treturn updateCodeFileModule(modulesStore, localId, source)\n}\n\nexport async function renameCodeFileModule(\n\tmodulesStore: ModulesStore,\n\tlocalId: LocalModuleId,\n\tnewPath: string,\n): Promise<Immutable<ModuleEntry>> {\n\t// Verify that the module entry exists\n\t// We cannot check via the handle as they do not guarantee that the module exists.\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for file not found\", localId)\n\n\tconst uniquePath = getUniquePath(modulesStore, newPath)\n\n\tconst handle = modulesStore.forType(ModuleType.Code).getByLocalId(localId)\n\tawait handle.rename(uniquePath)\n\n\tconst renamedEntry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(renamedEntry, \"Module entry for renamed file not found\", localId)\n\treturn renamedEntry\n}\n\nexport async function deleteCodeFileModule(modulesStore: ModulesStore, localId: LocalModuleId) {\n\t// Verify that the module entry exists before deletion\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for file not found\", localId)\n\n\tconst handle = modulesStore.forType(ModuleType.Code).getByLocalId(localId)\n\tawait handle.delete()\n}\n", "import {\n\tModuleType,\n\ttype LocalModuleId,\n\tassertNever,\n\tgetLogger,\n\tassert,\n\tisLocalModuleIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { applyDiff } from \"@openai/agents/utils\"\nimport type { AgentContext } from \"app/ai/agents/context/AgentContext.ts\"\nimport { sanitizeFilePath } from \"code-editor/utils.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { isCodeComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { hasCodeOverride } from \"document/models/CanvasTree/traits/WithCodeOverride.ts\"\nimport { isEditableModuleEntry, type ModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { createCodeFileModule, deleteCodeFileModule, updateCodeFileModule } from \"utils/codeFiles.ts\"\nimport type { RequestCodeFileAppliedChange, RequestCodeFileHistoryChange } from \"../requestCodeFileChanges.ts\"\nimport type {\n\tApplyPatchOperation,\n\tCodeFileComponentReference,\n\tCodeFilePatchCompletedExecution,\n\tCodeFilePatchCreateExecution,\n\tCodeFilePatchDeleteExecution,\n\tCodeFilePatchExecutionResult,\n\tCodeFilePatchUpdateExecution,\n\tCodeFileRegistryEntry,\n\tCreateFileOperation,\n\tDeleteFileOperation,\n\tOpenAIApplyPatchInput,\n\tUpdateFileOperation,\n} from \"./applyPatchTypes.ts\"\n\nconst log = getLogger(\"ai:agents:request-code-file-changes\")\n\ntype ResolveCodeFileComponents = (localId: LocalModuleId) => Promise<readonly CodeFileComponentReference[]>\n\nexport class CodeFilesPatchSession {\n\tprivate readonly appliedPatches: CodeFilePatchCompletedExecution[] = []\n\tprivate readonly codeFileRegistry = new Map<string, CodeFileRegistryEntry>()\n\t// Preserves the component mapping for the prompted file so we can remove old identifiers\n\t// from the agent context if the patch changes exported components.\n\tprivate readonly initialComponentsByPath: ReadonlyMap<string, readonly CodeFileComponentReference[]>\n\n\tconstructor(\n\t\tprivate readonly engine: VekterEngine,\n\t\tprivate readonly resolveCodeFileComponents: ResolveCodeFileComponents,\n\t\tinitialResolvedComponents?: { path: string; components: readonly CodeFileComponentReference[] },\n\t) {\n\t\tthis.initialComponentsByPath = initialResolvedComponents\n\t\t\t? new Map([[initialResolvedComponents.path, initialResolvedComponents.components]])\n\t\t\t: new Map()\n\t}\n\n\tasync execute(args: OpenAIApplyPatchInput): Promise<CodeFilePatchExecutionResult> {\n\t\tconst operation = args.operation\n\t\ttry {\n\t\t\tconst result = await this.executeOperation(operation)\n\t\t\tthis.appliedPatches.push(result.execution)\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tlog.debug(\"apply_patch failed\", { error, operation })\n\t\t\treturn { status: \"failed\", output: String(error) }\n\t\t}\n\t}\n\n\tprivate async executeOperation(operation: ApplyPatchOperation): Promise<{\n\t\tstatus: \"completed\"\n\t\toutput: string\n\t\tfilePath: string\n\t\texecution: CodeFilePatchCompletedExecution\n\t}> {\n\t\tswitch (operation.type) {\n\t\t\tcase \"create_file\":\n\t\t\t\treturn this.createFile(operation)\n\t\t\tcase \"update_file\":\n\t\t\t\treturn this.updateFile(operation)\n\t\t\tcase \"delete_file\":\n\t\t\t\treturn this.deleteFile(operation)\n\t\t\tdefault:\n\t\t\t\tassertNever(operation)\n\t\t}\n\t}\n\n\tprivate async createFile(operation: CreateFileOperation): Promise<{\n\t\tstatus: \"completed\"\n\t\toutput: string\n\t\tfilePath: string\n\t\texecution: CodeFilePatchCreateExecution\n\t}> {\n\t\tconst content = applyOperationDiff(operation)\n\t\tconst sanitizedPath = sanitizeFilePath(operation.path).path\n\t\tconst entry = await createCodeFileModule(this.engine.stores.modulesStore, sanitizedPath, content)\n\t\tconst registryEntry = this.createRegistryEntry(entry)\n\t\tconst components = await this.resolveCodeFileComponents(registryEntry.localId)\n\t\tthis.codeFileRegistry.set(registryEntry.path, registryEntry)\n\t\tconst executionEntry = cloneRegistryEntry(registryEntry)\n\n\t\tlet output = `Created ${executionEntry.path}`\n\t\tif (operation.path !== executionEntry.path) {\n\t\t\toutput += `. (Sanitized from: ${operation.path}.) Use ${executionEntry.path} to work with this file going forward.`\n\t\t}\n\t\tlog.debug(\"Created code file\", { path: executionEntry.path, localId: executionEntry.localId })\n\t\treturn {\n\t\t\tstatus: \"completed\",\n\t\t\toutput,\n\t\t\tfilePath: executionEntry.path,\n\t\t\texecution: {\n\t\t\t\toperation,\n\t\t\t\tentry: executionEntry,\n\t\t\t\tcomponents,\n\t\t\t\toutput,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate async updateFile(operation: UpdateFileOperation): Promise<{\n\t\tstatus: \"completed\"\n\t\toutput: string\n\t\tfilePath: string\n\t\texecution: CodeFilePatchUpdateExecution\n\t}> {\n\t\tconst existing = this.getOrLoadCodeFileRegistryEntry(operation.path)\n\t\tif (!existing) {\n\t\t\tthrow new Error(`File not found: ${operation.path}`)\n\t\t}\n\n\t\tconst updatedSource = applyOperationDiff(operation, existing.source)\n\t\tconst entry = await updateCodeFileModule(this.engine.stores.modulesStore, existing.localId, updatedSource)\n\t\tconst registryEntry = this.createRegistryEntry(entry)\n\t\tconst components = await this.resolveCodeFileComponents(registryEntry.localId)\n\t\tthis.codeFileRegistry.delete(existing.path)\n\t\tthis.codeFileRegistry.set(registryEntry.path, registryEntry)\n\t\tconst executionEntry = cloneRegistryEntry(registryEntry)\n\t\tconst output = `Updated ${executionEntry.path}`\n\t\tlog.debug(\"Updated code file\", { path: executionEntry.path, localId: executionEntry.localId })\n\t\treturn {\n\t\t\tstatus: \"completed\",\n\t\t\toutput,\n\t\t\tfilePath: executionEntry.path,\n\t\t\texecution: {\n\t\t\t\toperation,\n\t\t\t\tentry: executionEntry,\n\t\t\t\tcomponents,\n\t\t\t\toutput,\n\t\t\t\tsaveIdBeforeChange: existing.saveId,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate async deleteFile(operation: DeleteFileOperation): Promise<{\n\t\tstatus: \"completed\"\n\t\toutput: string\n\t\tfilePath: string\n\t\texecution: CodeFilePatchDeleteExecution\n\t}> {\n\t\tconst existing = this.getOrLoadCodeFileRegistryEntry(operation.path)\n\t\tif (!existing) {\n\t\t\tthrow new Error(`File not found: ${operation.path}`)\n\t\t}\n\n\t\tconst nodesMap = this.getUsageMapForModule(existing.localId)\n\t\tif (nodesMap.size > 0) {\n\t\t\tthrow new Error(formatDeleteBlockedByNodeUsageMessage(existing.path, nodesMap))\n\t\t}\n\n\t\tconst executionEntry = cloneRegistryEntry(existing)\n\t\tawait deleteCodeFileModule(this.engine.stores.modulesStore, existing.localId)\n\t\tthis.codeFileRegistry.delete(existing.path)\n\n\t\tconst output = `Deleted ${executionEntry.path}`\n\t\tlog.debug(\"Deleted code file\", { path: executionEntry.path, localId: executionEntry.localId })\n\t\treturn {\n\t\t\tstatus: \"completed\",\n\t\t\toutput,\n\t\t\tfilePath: executionEntry.path,\n\t\t\texecution: {\n\t\t\t\toperation,\n\t\t\t\tentry: executionEntry,\n\t\t\t\toutput,\n\t\t\t},\n\t\t}\n\t}\n\n\t/**\n\t * Synchronizes the applied patches to the components index used by the main agent.\n\t */\n\tasync applyPatchesToComponentsContext(ctx: AgentContext): Promise<void> {\n\t\tconst componentsByPath = new Map(this.initialComponentsByPath)\n\t\tfor (const patch of this.appliedPatches) {\n\t\t\tswitch (patch.operation.type) {\n\t\t\t\tcase \"create_file\":\n\t\t\t\tcase \"update_file\": {\n\t\t\t\t\tassertIsUpsertPatch(patch)\n\t\t\t\t\tcomponentsByPath.set(patch.entry.path, patch.components)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"delete_file\": {\n\t\t\t\t\tawait ctx.components.removeDefinitions(\n\t\t\t\t\t\tcomponentsByPath.get(patch.entry.path)?.map(component => component.identifier) ?? [],\n\t\t\t\t\t)\n\t\t\t\t\tcomponentsByPath.delete(patch.entry.path)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(patch.operation)\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAppliedChanges(ctx: AgentContext): readonly RequestCodeFileAppliedChange[] {\n\t\tconst appliedChanges: RequestCodeFileAppliedChange[] = []\n\n\t\tfor (const patch of this.appliedPatches) {\n\t\t\tswitch (patch.operation.type) {\n\t\t\t\tcase \"create_file\":\n\t\t\t\tcase \"update_file\": {\n\t\t\t\t\tassertIsUpsertPatch(patch)\n\t\t\t\t\tconst entry = patch.entry\n\n\t\t\t\t\tappliedChanges.push({\n\t\t\t\t\t\toperation: patch.operation.type,\n\t\t\t\t\t\tpath: entry.path,\n\t\t\t\t\t\tcomponents: patch.components.map(component => ({\n\t\t\t\t\t\t\tid: component.id,\n\t\t\t\t\t\t\tdisplayName: ctx.components.getDisplayName(component.identifier),\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tsource: entry.source,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"delete_file\":\n\t\t\t\t\tappliedChanges.push({\n\t\t\t\t\t\toperation: patch.operation.type,\n\t\t\t\t\t\tpath: patch.entry.path,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(patch.operation)\n\t\t\t}\n\t\t}\n\n\t\treturn appliedChanges\n\t}\n\n\tgetHistoryChanges(): readonly RequestCodeFileHistoryChange[] {\n\t\tconst historyChanges: RequestCodeFileHistoryChange[] = []\n\n\t\tfor (const patch of this.appliedPatches) {\n\t\t\tswitch (patch.operation.type) {\n\t\t\t\tcase \"create_file\":\n\t\t\t\t\thistoryChanges.push({\n\t\t\t\t\t\tlocalId: patch.entry.localId,\n\t\t\t\t\t\tmoduleId: patch.entry.moduleId,\n\t\t\t\t\t\toperation: patch.operation.type,\n\t\t\t\t\t\tsaveId: patch.entry.saveId,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"update_file\":\n\t\t\t\t\tassertIsUpdatePatch(patch)\n\t\t\t\t\t// Multiple updates to the same file in one request should undo back to the\n\t\t\t\t\t// pre-request save while still guarding against the final produced save.\n\t\t\t\t\tmergeUpdateHistoryChange(historyChanges, {\n\t\t\t\t\t\tlocalId: patch.entry.localId,\n\t\t\t\t\t\tmoduleId: patch.entry.moduleId,\n\t\t\t\t\t\toperation: patch.operation.type,\n\t\t\t\t\t\tsaveId: patch.entry.saveId,\n\t\t\t\t\t\tsaveIdBeforeChange: patch.saveIdBeforeChange,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"delete_file\":\n\t\t\t\t\thistoryChanges.push({\n\t\t\t\t\t\tlocalId: patch.entry.localId,\n\t\t\t\t\t\tmoduleId: patch.entry.moduleId,\n\t\t\t\t\t\toperation: patch.operation.type,\n\t\t\t\t\t\tsaveIdBeforeChange: patch.entry.saveId,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(patch.operation)\n\t\t\t}\n\t\t}\n\n\t\treturn historyChanges\n\t}\n\n\tprivate getOrLoadCodeFileRegistryEntry(path: string): CodeFileRegistryEntry | undefined {\n\t\tconst cachedEntry = this.codeFileRegistry.get(path)\n\t\tif (cachedEntry) return cachedEntry\n\n\t\tconst moduleEntry = this.engine.stores.modulesStore.getModuleEntryByUniqueName(path)\n\t\tif (!moduleEntry) return undefined\n\n\t\tconst registryEntry = this.createRegistryEntry(moduleEntry)\n\t\tthis.codeFileRegistry.set(registryEntry.path, registryEntry)\n\t\treturn registryEntry\n\t}\n\n\tprivate createRegistryEntry(entry: ModuleEntry | undefined): CodeFileRegistryEntry {\n\t\treturn createRegistryEntry(this.engine.stores.modulesStore, entry)\n\t}\n\n\tprivate getUsageMapForModule(moduleId: LocalModuleId): ReadonlyMap<NodeID, NodeID> {\n\t\tconst nodes = new Map<NodeID, NodeID>()\n\t\tfor (const node of this.engine.stores.treeStore.query().partial(true).iterate()) {\n\t\t\tconst usesCodeFile =\n\t\t\t\t(hasCodeOverride(node) && referencesLocalCodeModule(node.codeOverrideIdentifier, moduleId)) ||\n\t\t\t\t(isCodeComponentNode(node) && referencesLocalCodeModule(node.codeComponentIdentifier, moduleId))\n\t\t\tif (!usesCodeFile) continue\n\n\t\t\tconst scope = this.engine.tree.getScopeNodeFor(node)\n\t\t\tassert(scope, `Scope not found for node: ${node.id}`)\n\t\t\tnodes.set(node.id, scope.id)\n\t\t}\n\t\treturn nodes\n\t}\n}\n\nfunction applyOperationDiff(operation: CreateFileOperation | UpdateFileOperation, previousSource = \"\"): string {\n\tif (operation.type === \"create_file\") return applyDiff(\"\", operation.diff, \"create\")\n\treturn applyDiff(previousSource, operation.diff)\n}\n\nfunction formatDeleteBlockedByNodeUsageMessage(path: string, nodesUsingCodeFile: ReadonlyMap<NodeID, NodeID>): string {\n\tconst sortedNodes = Array.from(nodesUsingCodeFile.entries()).sort(\n\t\t([leftNodeId, leftScopeId], [rightNodeId, rightScopeId]) => {\n\t\t\tif (leftScopeId !== rightScopeId) return leftScopeId.localeCompare(rightScopeId)\n\t\t\treturn leftNodeId.localeCompare(rightNodeId)\n\t\t},\n\t)\n\tconst blockingNodes: string[] = []\n\n\tfor (const [nodeId, scopeId] of sortedNodes) {\n\t\tblockingNodes.push(`- nodeId: ${nodeId}, scopeId: ${scopeId}`)\n\t}\n\n\treturn [\n\t\t`Cannot delete ${path} because this code file is still in use by the following canvas nodes:`,\n\t\tblockingNodes.join(\"\\n\"),\n\t].join(\"\\n\")\n}\n\nfunction referencesLocalCodeModule(identifier: string | undefined, moduleId: LocalModuleId): boolean {\n\tconst parsedIdentifier = parseModuleIdentifier(identifier)\n\tif (!isLocalModuleIdentifier(parsedIdentifier) || parsedIdentifier.type !== ModuleType.Code) return false\n\treturn parsedIdentifier.localId === moduleId\n}\n\nfunction cloneRegistryEntry(entry: CodeFileRegistryEntry): CodeFileRegistryEntry {\n\treturn {\n\t\tlocalId: entry.localId,\n\t\tmoduleId: entry.moduleId,\n\t\tsaveId: entry.saveId,\n\t\tpath: entry.path,\n\t\tsource: entry.source,\n\t}\n}\n\nfunction createRegistryEntry(\n\tmodulesStore: VekterEngine[\"stores\"][\"modulesStore\"],\n\tentry: ModuleEntry | undefined,\n): CodeFileRegistryEntry {\n\tif (!entry) {\n\t\tthrow new Error(\"Module entry not found\")\n\t}\n\tif (!isEditableModuleEntry(entry)) {\n\t\tthrow new Error(`Module entry is not editable: ${entry.name}`)\n\t}\n\tif (entry.type !== ModuleType.Code) {\n\t\tthrow new Error(`Module entry must be a code file: ${entry.name}`)\n\t}\n\n\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(entry.localId)\n\tassert(persistedModule, \"Persisted module entry not found\", entry.localId)\n\n\treturn {\n\t\tlocalId: entry.localId,\n\t\tmoduleId: persistedModule.id,\n\t\tsaveId: persistedModule.saveId,\n\t\tpath: entry.name,\n\t\tsource: entry.sourceContent,\n\t}\n}\n\nfunction assertIsUpsertPatch(\n\tpatch: CodeFilePatchCompletedExecution,\n): asserts patch is CodeFilePatchCreateExecution | CodeFilePatchUpdateExecution {\n\tif (patch.operation.type === \"create_file\" || patch.operation.type === \"update_file\") return\n\tthrow new Error(`Expected create_file or update_file patch, got ${patch.operation.type}`)\n}\n\nfunction assertIsUpdatePatch(patch: CodeFilePatchCompletedExecution): asserts patch is CodeFilePatchUpdateExecution {\n\tif (patch.operation.type === \"update_file\") return\n\tthrow new Error(`Expected update_file patch, got ${patch.operation.type}`)\n}\n\nfunction mergeUpdateHistoryChange(\n\thistoryChanges: RequestCodeFileHistoryChange[],\n\tnextChange: Extract<RequestCodeFileHistoryChange, { operation: \"update_file\" }>,\n) {\n\tconst existingIndex = historyChanges.findLastIndex(\n\t\tchange => change.localId === nextChange.localId && change.operation === \"update_file\",\n\t)\n\tif (existingIndex === -1) {\n\t\thistoryChanges.push(nextChange)\n\t\treturn\n\t}\n\n\tconst existingChange = historyChanges[existingIndex]\n\tassert(existingChange?.operation === \"update_file\", \"Expected update_file history change\")\n\thistoryChanges.splice(existingIndex, 1)\n\thistoryChanges.push({\n\t\t...nextChange,\n\t\tsaveIdBeforeChange: existingChange.saveIdBeforeChange,\n\t})\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport type { TextStreamPart, ToolSet } from \"ai\"\nimport { isObject, isString } from \"utils/typeChecks.ts\"\nimport type {\n\tChatPartUpdater,\n\tCodePatchChatPart,\n\tCodePatchOperation,\n\tCodePatchPart,\n\tEmitCodePatchPart,\n} from \"../../types.ts\"\nimport type { OpenAIApplyPatchInput, OpenAIApplyPatchToolResult } from \"./applyPatchTypes.ts\"\n\nconst WHITESPACE_REGEX = /\\s/u\n\ninterface ApplyPatchStreamState {\n\trawInput: string\n\tstreamedDiff: string\n\tfileName?: string\n\tfileNameExplicitlySet?: boolean\n\toperation?: CodePatchOperation\n\thasStreamedCode: boolean\n\tupdater?: ChatPartUpdater<CodePatchChatPart>\n}\n\ntype ApplyPatchStreamPart = Extract<\n\tTextStreamPart<ToolSet>,\n\t{ type: \"tool-input-start\" | \"tool-input-delta\" | \"tool-call\" | \"tool-result\" }\n>\ntype ApplyPatchNamedStreamPart = Exclude<ApplyPatchStreamPart, { type: \"tool-input-delta\" }>\n\nexport function createApplyPatchStreamHandler(onPart?: EmitCodePatchPart) {\n\tconst applyPatchStreams = new Map<string, ApplyPatchStreamState>()\n\n\treturn {\n\t\tupdateFileName(toolCallId: string, fileName: string): void {\n\t\t\tconst state =\n\t\t\t\tapplyPatchStreams.get(toolCallId) ?? createAndStoreApplyPatchStreamState(applyPatchStreams, toolCallId)\n\t\t\tstate.fileName = fileName\n\t\t\tstate.fileNameExplicitlySet = true\n\t\t},\n\t\thandlePart(part: ApplyPatchStreamPart): void {\n\t\t\tswitch (part.type) {\n\t\t\t\tcase \"tool-input-start\": {\n\t\t\t\t\tif (!isApplyPatchPart(part)) return\n\n\t\t\t\t\tconst toolCallId = getToolCallId(part)\n\t\t\t\t\tif (!toolCallId) return\n\n\t\t\t\t\tif (!applyPatchStreams.has(toolCallId)) {\n\t\t\t\t\t\tcreateAndStoreApplyPatchStreamState(applyPatchStreams, toolCallId)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcase \"tool-input-delta\": {\n\t\t\t\t\tconst toolCallId = getToolCallId(part)\n\t\t\t\t\tif (!toolCallId) return\n\n\t\t\t\t\tconst state = applyPatchStreams.get(toolCallId)\n\t\t\t\t\tif (!state) return\n\n\t\t\t\t\t// Use partial JSON deltas for the live diff preview while the model is still typing.\n\t\t\t\t\tupdateApplyPatchStreamState(state, part.delta, onPart)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcase \"tool-call\": {\n\t\t\t\t\tif (!isApplyPatchPart(part) || part.invalid) return\n\n\t\t\t\t\tconst state =\n\t\t\t\t\t\tapplyPatchStreams.get(part.toolCallId) ??\n\t\t\t\t\t\tcreateAndStoreApplyPatchStreamState(applyPatchStreams, part.toolCallId)\n\n\t\t\t\t\t// Once the SDK has parsed the full tool input, use it to correct or complete the preview.\n\t\t\t\t\tupdateApplyPatchStreamStateFromStructuredInput(state, part.input, onPart)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcase \"tool-result\": {\n\t\t\t\t\tif (!isApplyPatchPart(part)) return\n\n\t\t\t\t\tconst toolCallId = getToolCallId(part)\n\t\t\t\t\tif (toolCallId) {\n\t\t\t\t\t\tconst state = applyPatchStreams.get(toolCallId)\n\n\t\t\t\t\t\t// Finalize the streamed patch once the tool execution has finished.\n\t\t\t\t\t\tfinalizeApplyPatchStream(state, part.output, onPart)\n\t\t\t\t\t\tapplyPatchStreams.delete(toolCallId)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Some tool results do not include a call id. Only a single in-flight stream can\n\t\t\t\t\t// safely consume that anonymous result payload.\n\t\t\t\t\tconst anonymousOutput = applyPatchStreams.size === 1 ? part.output : undefined\n\t\t\t\t\tfor (const [toolCallId, state] of applyPatchStreams) {\n\t\t\t\t\t\tfinalizeApplyPatchStream(state, anonymousOutput, onPart)\n\t\t\t\t\t\tapplyPatchStreams.delete(toolCallId)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(part)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction isApplyPatchPart(part: ApplyPatchNamedStreamPart): boolean {\n\treturn part.toolName === \"apply_patch\"\n}\n\nfunction createAndStoreApplyPatchStreamState(\n\tapplyPatchStreams: Map<string, ApplyPatchStreamState>,\n\ttoolCallId: string,\n): ApplyPatchStreamState {\n\tconst state = createApplyPatchStreamState()\n\tapplyPatchStreams.set(toolCallId, state)\n\treturn state\n}\n\nfunction createApplyPatchStreamState(): ApplyPatchStreamState {\n\treturn {\n\t\trawInput: \"\",\n\t\tstreamedDiff: \"\",\n\t\thasStreamedCode: false,\n\t}\n}\n\nfunction streamDiffSuffix(state: ApplyPatchStreamState, nextDiff: string, onPart: EmitCodePatchPart | undefined): void {\n\tif (!state.fileName) return\n\n\tconst reset = state.streamedDiff.length > 0 && !nextDiff.startsWith(state.streamedDiff)\n\tif (reset) state.streamedDiff = \"\"\n\n\tconst suffix = nextDiff.slice(state.streamedDiff.length)\n\tif (!suffix) return\n\n\tstate.streamedDiff = nextDiff\n\tstate.hasStreamedCode = true\n\temitCodePart(onPart, state, { content: suffix, fileName: state.fileName, operation: state.operation, reset })\n}\n\nfunction parseJsonStringValue(raw: string, key: string): string | undefined {\n\tconst keyIndex = raw.lastIndexOf(`\"${key}\"`)\n\tif (keyIndex === -1) return\n\n\tconst colonIndex = raw.indexOf(\":\", keyIndex)\n\tif (colonIndex === -1) return\n\n\tlet i = colonIndex + 1\n\twhile (i < raw.length && WHITESPACE_REGEX.test(raw[i] ?? \"\")) i += 1\n\tif (raw[i] !== '\"') return\n\ti += 1\n\n\tlet value = \"\"\n\tlet escaping = false\n\tfor (; i < raw.length; i++) {\n\t\tconst char = raw[i] ?? \"\"\n\t\tif (escaping) {\n\t\t\tswitch (char) {\n\t\t\t\tcase \"n\":\n\t\t\t\t\tvalue += \"\\n\"\n\t\t\t\t\tbreak\n\t\t\t\tcase \"r\":\n\t\t\t\t\tvalue += \"\\r\"\n\t\t\t\t\tbreak\n\t\t\t\tcase \"t\":\n\t\t\t\t\tvalue += \"\\t\"\n\t\t\t\t\tbreak\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tvalue += \"\\\\\"\n\t\t\t\t\tbreak\n\t\t\t\tcase '\"':\n\t\t\t\t\tvalue += '\"'\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tvalue += char\n\t\t\t}\n\t\t\tescaping = false\n\t\t\tcontinue\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tescaping = true\n\t\t\tcontinue\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn value\n\t\t}\n\n\t\tvalue += char\n\t}\n\n\treturn value || undefined\n}\n\nfunction updateApplyPatchStreamState(\n\tstate: ApplyPatchStreamState,\n\tinputTextDelta: string,\n\tonPart: EmitCodePatchPart | undefined,\n): void {\n\tstate.rawInput += inputTextDelta\n\n\tif (!state.operation) {\n\t\tconst type = parseJsonStringValue(state.rawInput, \"type\")\n\t\tif (type === \"create_file\" || type === \"update_file\" || type === \"delete_file\") {\n\t\t\tstate.operation = type\n\t\t}\n\t}\n\n\tconst fileName = parseJsonStringValue(state.rawInput, \"path\")\n\tif (fileName && !state.fileNameExplicitlySet) {\n\t\tstate.fileName = fileName\n\t}\n\n\tconst streamedDiff = parseJsonStringValue(state.rawInput, \"diff\")\n\tif (streamedDiff !== undefined) {\n\t\tstreamDiffSuffix(state, streamedDiff, onPart)\n\t}\n}\n\nfunction updateApplyPatchStreamStateFromStructuredInput(\n\tstate: ApplyPatchStreamState,\n\tinput: unknown,\n\tonPart: EmitCodePatchPart | undefined,\n): void {\n\tconst codePart = getCodePartFromStructuredInput(input)\n\tif (!codePart) return\n\n\tif (!state.fileNameExplicitlySet) {\n\t\tstate.fileName = codePart.fileName\n\t}\n\tstate.operation = codePart.operation\n\n\t// Delete operations only render after a successful tool-result.\n\tif (codePart.operation === \"delete_file\") return\n\n\tstreamDiffSuffix(state, codePart.content, onPart)\n}\n\nfunction getCodePartFromStructuredInput(input: unknown): CodePatchPart | undefined {\n\tconst parsedInput = parseStructuredApplyPatchInput(input)\n\tif (!parsedInput) return\n\n\tswitch (parsedInput.operation.type) {\n\t\tcase \"create_file\":\n\t\tcase \"update_file\":\n\t\t\treturn {\n\t\t\t\tcontent: parsedInput.operation.diff,\n\t\t\t\tfileName: parsedInput.operation.path,\n\t\t\t\toperation: parsedInput.operation.type,\n\t\t\t}\n\t\tcase \"delete_file\":\n\t\t\treturn {\n\t\t\t\tcontent: \"\",\n\t\t\t\tfileName: parsedInput.operation.path,\n\t\t\t\toperation: \"delete_file\",\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(parsedInput.operation)\n\t}\n}\n\nfunction finalizeApplyPatchStream(\n\tstate: ApplyPatchStreamState | undefined,\n\toutput: unknown,\n\tonPart: EmitCodePatchPart | undefined,\n): void {\n\tif (!state?.fileName) return\n\n\tif (state.operation === \"delete_file\") {\n\t\tif (!isSuccessfulApplyPatchToolResult(output)) return\n\t\temitCodePart(onPart, state, { content: \"\", fileName: state.fileName, operation: state.operation }, true)\n\t\treturn\n\t}\n\n\tif (!state.hasStreamedCode) return\n\tconst failed = !isSuccessfulApplyPatchToolResult(output)\n\temitCodePart(onPart, state, { content: \"\", fileName: state.fileName, operation: state.operation }, true, failed)\n}\n\nfunction parseStructuredApplyPatchInput(input: unknown): OpenAIApplyPatchInput | undefined {\n\tif (!isObject(input) || !(\"operation\" in input) || !isObject(input.operation) || !isString(input.callId)) {\n\t\treturn undefined\n\t}\n\n\tconst operation = input.operation\n\tif (!isString(operation.type) || !isString(operation.path)) return undefined\n\n\tswitch (operation.type) {\n\t\tcase \"create_file\":\n\t\tcase \"update_file\":\n\t\t\tif (!isString(operation.diff)) return undefined\n\t\t\treturn {\n\t\t\t\tcallId: input.callId,\n\t\t\t\toperation: {\n\t\t\t\t\ttype: operation.type,\n\t\t\t\t\tpath: operation.path,\n\t\t\t\t\tdiff: operation.diff,\n\t\t\t\t},\n\t\t\t}\n\t\tcase \"delete_file\":\n\t\t\treturn {\n\t\t\t\tcallId: input.callId,\n\t\t\t\toperation: {\n\t\t\t\t\ttype: operation.type,\n\t\t\t\t\tpath: operation.path,\n\t\t\t\t},\n\t\t\t}\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\nfunction getToolCallId(part: { id?: unknown; toolCallId?: unknown }): string | undefined {\n\tif (isString(part.toolCallId)) return part.toolCallId\n\tif (isString(part.id)) return part.id\n\treturn undefined\n}\n\nfunction isSuccessfulApplyPatchToolResult(\n\toutput: unknown,\n): output is Extract<OpenAIApplyPatchToolResult, { status: \"completed\" }> {\n\treturn isObject(output) && \"status\" in output && output.status === \"completed\"\n}\n\nfunction emitCodePart(\n\tonPart: EmitCodePatchPart | undefined,\n\tstate: ApplyPatchStreamState,\n\tpart: CodePatchPart,\n\tcomplete?: boolean,\n\tfailed?: boolean,\n): void {\n\tif (state.updater) {\n\t\tstate.updater(current => ({\n\t\t\tcontent: part.reset ? part.content : current.content + part.content,\n\t\t\tfileName: part.fileName,\n\t\t\toperation: part.operation ?? current.operation,\n\t\t\tcomplete,\n\t\t\tfailed,\n\t\t}))\n\n\t\t// Clear the updater when the part is complete.\n\t\tif (complete) state.updater = undefined\n\n\t\treturn\n\t}\n\n\tconst updater = onPart?.({\n\t\ttype: \"code-patch\",\n\t\tcontent: part.content,\n\t\tfileName: part.fileName,\n\t\toperation: part.operation,\n\t\tcomplete,\n\t\tfailed,\n\t})\n\n\t// Store the updater for the next part.\n\tif (updater && !complete) state.updater = updater\n}\n", "import type { TypecheckDiagnostic } from \"@framerjs/code-checker-worker\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { typecheck } from \"code-editor/workers/codeCheckerAndAta.ts\"\n\nconst log = getLogger(\"ai:agents:request-code-file-changes:typecheck\")\n\nexport async function typecheckFile(\n\tpath: string,\n\tsource: string,\n\tsessionId?: string,\n): Promise<readonly TypecheckDiagnostic[]> {\n\tconst uniquePath = `__request-code-file-changes-input-file__/${path}`\n\tconst diagnostics = await typecheck(\n\t\tuniquePath,\n\t\tsource,\n\t\t// The config is not strict because\n\t\t// - we want to keep it high signal only\n\t\t// - this is the config that we iteratively arrived at in Workshop: https://github.com/framer/workshop/blob/e4f9372e1a9b1be595854049cb82802d5174e9df/src/lib/validateComponent.ts#L133-L138\n\t\t{\n\t\t\talwaysStrict: false,\n\t\t\tstrict: false,\n\t\t\tnoUnusedLocals: false,\n\t\t\tnoUnusedParameters: false,\n\t\t},\n\t\tsessionId,\n\t)\n\n\tconst applicableDiagnostics = diagnostics\n\t\t.filter(diagnostic => diagnostic.fileName?.endsWith(uniquePath))\n\t\t.map(diagnostic => ({\n\t\t\t...diagnostic,\n\t\t\tfileName: path,\n\t\t}))\n\n\tlog.info(\"Typecheck completed\", {\n\t\tpath,\n\t\tallDiagnostics: diagnostics,\n\t\tapplicableDiagnostics,\n\t\tsessionId,\n\t})\n\n\treturn applicableDiagnostics\n}\n\nexport function formatTypecheckDiagnosticsForAgent(\n\tpath: string,\n\tdiagnostics: readonly TypecheckDiagnostic[],\n\tsource: string,\n): string {\n\tconst errorCount = diagnostics.length\n\n\treturn [\n\t\t`Found ${errorCount} TypeScript error(s) in ${path}:`,\n\t\t...diagnostics.map(diagnostic => {\n\t\t\tconst severity = diagnosticCategoryToSeverity(diagnostic.category)\n\t\t\tconst context = diagnostic.span\n\t\t\t\t? getDiagnosticContext(source, diagnostic.span.start.line, diagnostic.span.end.line)\n\t\t\t\t: undefined\n\n\t\t\treturn [`[${severity}] ${diagnostic.message}`, context ? `Context:\\n${context}` : \"\"].filter(Boolean).join(\"\\n\")\n\t\t}),\n\t\t\"Please fix them according to the system instructions.\",\n\t].join(\"\\n\\n\")\n}\n\n/**\n * Ensures the diagnostic context is unique, so that the model always knows what to edit. Starts\n * from the passed range \u00B1 1 line, repeatedly expands it by \u00B1 1 line until it\u2019s unique, then adds \u00B1\n * 1 more line and completes. The minimum context is, therefore, 5 lines.\n */\nfunction getDiagnosticContext(source: string, startLine: number, endLine: number): string | undefined {\n\tconst allLines = source.split(\"\\n\")\n\tlet contextStart = Math.max(0, startLine - 1)\n\tlet contextEnd = Math.min(allLines.length - 1, endLine + 1)\n\n\twhile (contextStart > 0 || contextEnd < allLines.length - 1) {\n\t\tconst match = allLines\n\t\t\t.slice(contextStart, contextEnd + 1)\n\t\t\t.join(\"\\n\")\n\t\t\t.trim()\n\t\tconst occurrencesInSource = source.split(match).length - 1\n\t\tif (match.length > 0 && occurrencesInSource === 1) break\n\t\tif (contextStart > 0) contextStart--\n\t\tif (contextEnd < allLines.length - 1) contextEnd++\n\t}\n\n\tcontextStart = Math.max(0, contextStart - 1)\n\tcontextEnd = Math.min(allLines.length - 1, contextEnd + 1)\n\n\tconst lines = allLines.slice(contextStart, contextEnd + 1)\n\tif (lines.length === 0) return undefined\n\treturn lines.join(\"\\n\")\n}\n\nfunction diagnosticCategoryToSeverity(category: TypecheckDiagnostic[\"category\"]): string {\n\tswitch (category) {\n\t\tcase 0:\n\t\t\treturn \"WARNING\"\n\t\tcase 1:\n\t\t\treturn \"ERROR\"\n\t\tcase 2:\n\t\t\treturn \"SUGGESTION\"\n\t\tcase 3:\n\t\t\treturn \"MESSAGE\"\n\t\tdefault:\n\t\t\treturn \"ERROR\"\n\t}\n}\n", "import { ModuleType, getLogger, isModuleExportIdentifier, parseModuleIdentifier } from \"@framerjs/shared\"\nimport { stepCountIs, streamText } from \"ai\"\nimport { experiments } from \"app/experiments.ts\"\nimport { prewarmTypechecker } from \"code-editor/workers/codeCheckerAndAta.ts\"\nimport type { LockQueue } from \"document/utils/LockQueue.ts\"\nimport { randomID } from \"library/render/types/randomID.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { isEditableModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { waitForComponentLoaderToCatchUp } from \"modules/waitForComponentLoaderToCatchUp.ts\"\nimport {\n\tcreateResponsesProvider,\n\tResponsesProviderRoute,\n\ttoOpenAIResponsesModelId,\n} from \"../../../config/openRouter.ts\"\nimport { LanguageModel } from \"../../../languageModels.ts\"\nimport { getOpenAIResponsesReasoningEffort, getProviderForModel } from \"../../../models.ts\"\nimport { abortableStream } from \"../../abortableStream.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport type { StreamLifeCycleHooks } from \"../../stream.ts\"\nimport type { EmitChatPart, EmitCodePatchPart } from \"../../types.ts\"\nimport type { RequestCodeFileChangesInput, RequestCodeFileChangesResult } from \"../requestCodeFileChanges.ts\"\nimport { REQUEST_CODE_FILE_CHANGES_SYSTEM_PROMPT } from \"../requestCodeFileChanges/prompt.ts\"\nimport { CodeFilesPatchSession } from \"./CodeFilesPatchSession.ts\"\nimport { createApplyPatchStreamHandler } from \"./applyPatchStream.ts\"\nimport type {\n\tCodeFileComponentReference,\n\tCodeFileRegistryEntry,\n\tOpenAIApplyPatchInput,\n\tOpenAIApplyPatchToolResult,\n} from \"./applyPatchTypes.ts\"\nimport { REVIEWING_CODE_STATUS } from \"./statuses.ts\"\nimport { formatTypecheckDiagnosticsForAgent, typecheckFile } from \"./typecheck.ts\"\n\nconst log = getLogger(\"ai:agents:request-code-file-changes\")\nconst maxSteps = 10\ntype RequestCodeFileChangesTools = NonNullable<Parameters<typeof streamText>[0][\"tools\"]>\ntype RequestCodeFileChangesProviderOptions = NonNullable<Parameters<typeof streamText>[0][\"providerOptions\"]>\nconst requestCodeFileChangesModel = LanguageModel.GPT53Codex\nconst requestCodeFileChangesResponsesRoute = ResponsesProviderRoute.OpenRouter\n\ninterface ExecuteRequestCodeFileChangesOptions {\n\tabortSignal?: AbortSignal\n\tonCodeFileHistoryChanges?: StreamLifeCycleHooks[\"onCodeFileHistoryChanges\"]\n\tparentAgentSessionId: string\n\ttoolCallId?: string\n}\n\nexport async function executeRequestCodeFileChanges(\n\tinput: RequestCodeFileChangesInput,\n\tctx: AgentContext,\n\tcontextLock: LockQueue,\n\tonPart: EmitChatPart | undefined,\n\toptions: ExecuteRequestCodeFileChangesOptions,\n): Promise<RequestCodeFileChangesResult> {\n\tconst engine = ctx.hooks.getEngine()\n\tassert(engine, \"Engine is required for request_code_file_changes\")\n\tconst modulesStore = engine.stores.modulesStore\n\tconst projectId = engine.stores.projectStore?.projectId\n\tconst { abortSignal, onCodeFileHistoryChanges, parentAgentSessionId } = options\n\tconst typecheckSessionId = `request-code-file-changes:${parentAgentSessionId}`\n\tconst responsesProvider = createRequestCodeFileChangesResponsesProvider(projectId, parentAgentSessionId)\n\n\tlog.info(\"Execute request_code_file_changes\", {\n\t\tfilePath: input.filePath,\n\t\tprompt: input.prompt,\n\t\tprojectId,\n\t\tresponsesRoute: responsesProvider.route,\n\t})\n\n\tconst targetFile = resolveTargetCodeFile(input, modulesStore)\n\tconst targetFileContext = targetFile ? formatTargetCodeFilePrompt(targetFile) : \"\"\n\tconst promptParts = [\n\t\t{ type: \"text\" as const, text: input.prompt },\n\t\t...(targetFileContext ? [{ type: \"text\" as const, text: targetFileContext }] : []),\n\t]\n\n\tlog.info(\"Resolved the target code file\", {\n\t\tfilePath: input.filePath,\n\t\ttargetFile,\n\t\ttargetFileContext,\n\t})\n\n\tlet responseText = \"\"\n\tlet finalStepText = \"\"\n\tlet lastApplyPatchFailure: string | undefined\n\n\t// Ensure that all code patches for a given tool call have a stable toolCallId.\n\t// The coding sub-agent makes multiple apply_patch tool calls, each with its own\n\t// SDK-level toolCallId. This outer toolCallId identifies the request_code_file_changes\n\t// invocation itself, so the UI can group all patches from the same sub-agent. The\n\t// fallback covers direct callers (e.g. tests) that bypass the SDK wrapper.\n\tconst toolCallId = options.toolCallId ?? randomID()\n\tconst scopedOnPart: EmitCodePatchPart | undefined = onPart ? part => onPart({ ...part, toolCallId })?.ui : undefined\n\tconst applyPatchStream = createApplyPatchStreamHandler(scopedOnPart)\n\n\tconst patchSession = new CodeFilesPatchSession(\n\t\tengine,\n\t\tlocalId => resolveCodeFileComponents(engine, localId, ctx),\n\t\ttargetFile\n\t\t\t? { path: targetFile.path, components: await resolveCodeFileComponents(engine, targetFile.localId, ctx) }\n\t\t\t: undefined,\n\t)\n\n\t// The first typecheck is usually slow (~1s), whereas subsequent ones are fast (~50-100 ms).\n\t// This prewarms the typechecker in advance so that the actual typecheck (when it happens)\n\t// has minimal latency.\n\tvoid prewarmTypechecker()\n\n\tconst applyPatchTool = responsesProvider.tools.applyPatch({\n\t\texecute: async (args: OpenAIApplyPatchInput): Promise<OpenAIApplyPatchToolResult> => {\n\t\t\t// Reset the stale state\n\t\t\tlastApplyPatchFailure = undefined\n\n\t\t\t// Regardless of whether we run typechecking or not, show \u201CReviewing code...\u201D because it might\n\t\t\t// take the model a few seconds to review the result of the tool call and complete the\n\t\t\t// execution. (Typechecking is generally in the order of 50-100 ms, and the bulk of the cost\n\t\t\t// is in the inference.)\n\t\t\tonPart?.({\n\t\t\t\ttype: \"code-agent-status\",\n\t\t\t\ttext: REVIEWING_CODE_STATUS,\n\t\t\t})\n\n\t\t\tconst result = await patchSession.execute(args)\n\n\t\t\tif (result.status === \"failed\") {\n\t\t\t\tlastApplyPatchFailure = result.output\n\t\t\t\treturn {\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\toutput: result.output,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update the file name in the stream UI in case it got sanitized during saving\n\t\t\t// (e.g. \u201CFile Name.tsx\u201D \u2192 \u201CFile_Name.tsx\u201D)\n\t\t\tapplyPatchStream.updateFileName(args.callId, result.execution.entry.path)\n\n\t\t\tconst shouldTypecheck = [\"create_file\", \"update_file\"].includes(result.execution.operation.type)\n\t\t\tif (!shouldTypecheck) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\toutput: result.output,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst typecheckOutput = await typecheckAndFormatOutput(\n\t\t\t\tresult.execution.entry.path,\n\t\t\t\tresult.execution.entry.source,\n\t\t\t\ttypecheckSessionId,\n\t\t\t)\n\t\t\tif (!typecheckOutput) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\toutput: result.output,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus: result.status,\n\t\t\t\toutput: `${result.output}\\n\\n${typecheckOutput}`,\n\t\t\t}\n\t\t},\n\t})\n\n\t// The provider-specific applyPatch tool does not currently satisfy streamText's public ToolSet typing.\n\tconst tools = { apply_patch: applyPatchTool } as RequestCodeFileChangesTools\n\n\tconst result = streamText({\n\t\tmodel: responsesProvider.model,\n\t\tsystem: REQUEST_CODE_FILE_CHANGES_SYSTEM_PROMPT,\n\t\tmessages: [{ role: \"user\", content: promptParts }],\n\t\ttools,\n\t\tproviderOptions: getRequestCodeFileChangesProviderOptions(),\n\t\tabortSignal,\n\t\tstopWhen: stepCountIs(maxSteps),\n\t\ttoolChoice: \"auto\",\n\t\tonError: error => {\n\t\t\t// Surface sub-agent failures to the main agent instead of returning a partial success result.\n\t\t\tthrow error.error\n\t\t},\n\t\tonStepFinish: async step => {\n\t\t\tif (step.text?.trim()) {\n\t\t\t\tfinalStepText = step.text\n\t\t\t}\n\n\t\t\tlog.info(\"Step finished\", {\n\t\t\t\tfinishReason: step.finishReason,\n\t\t\t\tusage: step.usage,\n\t\t\t\ttoolCalls: step.toolCalls?.length ?? 0,\n\t\t\t\ttoolResults: step.toolResults?.length ?? 0,\n\t\t\t\ttextLength: step.text?.length ?? 0,\n\t\t\t})\n\t\t},\n\t})\n\tlog.info(\"Result created, consuming stream...\")\n\n\t// Consume the stream to track text output while CodeFilesPatchSession records authoritative mutations.\n\ttry {\n\t\tfor await (const part of abortableStream(result.fullStream, abortSignal)) {\n\t\t\tswitch (part.type) {\n\t\t\t\tcase \"text-delta\":\n\t\t\t\t\tresponseText += part.text\n\t\t\t\t\tbreak\n\t\t\t\tcase \"tool-input-start\":\n\t\t\t\tcase \"tool-input-delta\":\n\t\t\t\tcase \"tool-call\":\n\t\t\t\tcase \"tool-result\":\n\t\t\t\t\tapplyPatchStream.handlePart(part)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t} catch (streamError) {\n\t\tif (!isAbortedStreamError(streamError, abortSignal)) {\n\t\t\tlog.error(\"Stream iteration error\", {\n\t\t\t\terror: String(streamError),\n\t\t\t\tstack: streamError instanceof Error ? streamError.stack?.slice(0, 500) : undefined,\n\t\t\t})\n\t\t}\n\n\t\tthrow streamError\n\t}\n\n\tconst applyContextMutations = async () => {\n\t\tawait patchSession.applyPatchesToComponentsContext(ctx)\n\t\t// Store the code file history changes in the main agent's context. Needed for undo\n\t\t// functionality in the main agent chat.\n\t\tonCodeFileHistoryChanges?.(patchSession.getHistoryChanges())\n\t}\n\n\t// Apply context mutations in a synchronized manner.\n\tawait new Promise<void>((resolve, reject) => {\n\t\tvoid contextLock.request(async () => {\n\t\t\ttry {\n\t\t\t\tawait applyContextMutations()\n\t\t\t\tresolve()\n\t\t\t} catch (error) {\n\t\t\t\treject(error)\n\t\t\t}\n\t\t})\n\t})\n\n\tconst appliedChanges = patchSession.getAppliedChanges(ctx)\n\tconst fallbackResponse = finalStepText || responseText || lastApplyPatchFailure || \"\"\n\tconst response = {\n\t\tappliedChanges,\n\t\tresponse: appliedChanges.length === 0 && lastApplyPatchFailure ? lastApplyPatchFailure : fallbackResponse,\n\t}\n\n\tlog.info(\"Tool result\", {\n\t\tappliedChanges: response.appliedChanges.length,\n\t\tresponseLength: response.response.length,\n\t})\n\n\treturn response\n}\n\nfunction createRequestCodeFileChangesResponsesProvider(projectId: string | undefined, parentAgentSessionId: string) {\n\tconst shouldUseOpenRouter = !experiments.isOn(\"agentUseOpenAIResponsesAPI\")\n\tif (!shouldUseOpenRouter) {\n\t\tconst responsesProvider = createResponsesProvider({ route: ResponsesProviderRoute.OpenAI })\n\t\treturn {\n\t\t\troute: ResponsesProviderRoute.OpenAI,\n\t\t\tmodel: responsesProvider.model(toOpenAIResponsesModelId(requestCodeFileChangesModel)),\n\t\t\ttools: responsesProvider.tools,\n\t\t}\n\t}\n\n\tconst responsesProvider = createResponsesProvider({\n\t\troute: requestCodeFileChangesResponsesRoute,\n\t\tprovider: getProviderForModel(requestCodeFileChangesModel),\n\t\tmetadata: {\n\t\t\tprojectId,\n\t\t\tfeatureCategory: \"agents\",\n\t\t\tfeatureName: \"agents\",\n\t\t\tstep: \"request-code-file-changes\",\n\t\t\tsessionId: parentAgentSessionId,\n\t\t},\n\t})\n\treturn {\n\t\troute: requestCodeFileChangesResponsesRoute,\n\t\tmodel: responsesProvider.model(requestCodeFileChangesModel),\n\t\ttools: responsesProvider.tools,\n\t}\n}\n\nfunction getRequestCodeFileChangesProviderOptions(): RequestCodeFileChangesProviderOptions {\n\tconst reasoningEffort = getOpenAIResponsesReasoningEffort(undefined, requestCodeFileChangesModel)\n\n\treturn {\n\t\topenai: {\n\t\t\t...(reasoningEffort ? { reasoningEffort } : {}),\n\t\t\t// OpenRouter does not reliably resolve OpenAI stored response item references across tool-loop requests.\n\t\t\tstore: false,\n\t\t},\n\t}\n}\n\nfunction resolveTargetCodeFile(\n\tinput: RequestCodeFileChangesInput,\n\tmodulesStore: NonNullable<ReturnType<AgentContext[\"hooks\"][\"getEngine\"]>>[\"stores\"][\"modulesStore\"],\n): CodeFileRegistryEntry | undefined {\n\tif (!input.filePath) return undefined\n\n\tconst moduleEntry = modulesStore.getModuleEntryByUniqueName(input.filePath)\n\tif (moduleEntry?.type === ModuleType.Code && isEditableModuleEntry(moduleEntry)) {\n\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(moduleEntry.localId)\n\t\tassert(persistedModule, \"Persisted module entry for code file not found\", moduleEntry.localId)\n\n\t\treturn {\n\t\t\tlocalId: moduleEntry.localId,\n\t\t\tmoduleId: persistedModule.id,\n\t\t\tsaveId: persistedModule.saveId,\n\t\t\tpath: moduleEntry.name,\n\t\t\tsource: moduleEntry.sourceContent,\n\t\t}\n\t}\n\n\tthrow new Error(\n\t\t`Code file not found: ${input.filePath}. Provide filePath only when editing an existing local code file; omit it to create a new one.`,\n\t)\n}\n\nasync function resolveCodeFileComponents(\n\tengine: NonNullable<ReturnType<AgentContext[\"hooks\"][\"getEngine\"]>>,\n\tlocalId: CodeFileRegistryEntry[\"localId\"],\n\tctx: AgentContext,\n): Promise<readonly CodeFileComponentReference[]> {\n\tconst moduleEntry = engine.stores.modulesStore.getModuleEntryByLocalId(localId)\n\tassert(moduleEntry, \"Module entry for file not found\", localId)\n\tawait waitForComponentLoaderToCatchUp(engine.componentLoader, engine.stores.modulesStore)\n\n\tconst components: CodeFileComponentReference[] = []\n\tfor (const definition of engine.componentLoader.getAllLocalModules()) {\n\t\tif (definition.type !== \"component\") continue\n\t\tif (!isModuleExportIdentifier(definition.identifier)) continue\n\t\tconst id = ctx.components.getIdForModuleIdentifier(definition.identifier)\n\t\tif (!id) continue\n\n\t\tconst identifier = parseModuleIdentifier(definition.identifier)\n\t\tif (identifier?.kind !== \"localModuleExport\") continue\n\t\tif (identifier.type !== ModuleType.Code || identifier.localId !== localId) continue\n\n\t\tcomponents.push({\n\t\t\tid,\n\t\t\tidentifier: identifier.value,\n\t\t})\n\t}\n\n\treturn components\n}\n\nfunction formatTargetCodeFilePrompt(entry: CodeFileRegistryEntry): string {\n\treturn `\\n\\n\nCurrent file (${entry.path}):\n<file path=${JSON.stringify(entry.path)}>\n${entry.source}\n</file>`\n}\n\nfunction isAbortedStreamError(error: unknown, abortSignal?: AbortSignal): boolean {\n\treturn abortSignal?.aborted === true || (error instanceof Error && error.name === \"AbortError\")\n}\n\nasync function typecheckAndFormatOutput(path: string, source: string, sessionId?: string): Promise<string> {\n\tconst diagnostics = await typecheckFile(path, source, sessionId)\n\tif (diagnostics.length === 0) return \"\"\n\treturn formatTypecheckDiagnosticsForAgent(path, diagnostics, source)\n}\n", "import type { GlobalModuleId, LocalModuleId } from \"@framerjs/shared\"\nimport { tool, type ToolResultPart } from \"ai\"\nimport { LockQueue } from \"document/utils/LockQueue.ts\"\nimport { z } from \"zod\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport type { StreamLifeCycleHooks } from \"../stream.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { executeRequestCodeFileChanges } from \"./requestCodeFileChanges/execute.ts\"\nimport { DRAFTING_CODE_STATUS } from \"./requestCodeFileChanges/statuses.ts\"\nimport { REQUEST_CODE_FILE_CHANGES_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\n\ninterface RequestCodeFileHistoryChangeBase {\n\tlocalId: LocalModuleId\n\tmoduleId: GlobalModuleId\n\toperation: \"create_file\" | \"update_file\" | \"delete_file\"\n}\n\ninterface RequestCodeFileHistoryChangeCreate extends RequestCodeFileHistoryChangeBase {\n\toperation: \"create_file\"\n\tsaveId: string\n}\n\ninterface RequestCodeFileHistoryChangeUpdate extends RequestCodeFileHistoryChangeBase {\n\toperation: \"update_file\"\n\tsaveId: string\n\tsaveIdBeforeChange: string\n\tsaveIdAfterRevert?: string\n}\n\ninterface RequestCodeFileHistoryChangeDelete extends RequestCodeFileHistoryChangeBase {\n\toperation: \"delete_file\"\n\tsaveIdBeforeChange: string\n\tsaveIdAfterRevert?: string\n}\n\nexport type RequestCodeFileHistoryChange =\n\t| RequestCodeFileHistoryChangeCreate\n\t| RequestCodeFileHistoryChangeUpdate\n\t| RequestCodeFileHistoryChangeDelete\n\ninterface RequestCodeFileAppliedChangeBase {\n\tpath: string\n}\n\ninterface RequestCodeFileChangeWithSource extends RequestCodeFileAppliedChangeBase {\n\tcomponents: readonly { id: string; displayName: string }[]\n\t/**\n\t * The code file source code. It is useful to provide to the main agent so that the main agent\n\t * is able to reason about the code does and specifically about what control props are exposed\n\t * and what they do.\n\t *\n\t * Maybe in future we can solve this differently though, needs some thinking.\n\t */\n\tsource: string\n}\n\nexport interface RequestCodeFileChangeCreate extends RequestCodeFileChangeWithSource {\n\toperation: \"create_file\"\n}\n\nexport interface RequestCodeFileChangeUpdate extends RequestCodeFileChangeWithSource {\n\toperation: \"update_file\"\n}\n\nexport interface RequestCodeFileChangeDelete extends RequestCodeFileAppliedChangeBase {\n\toperation: \"delete_file\"\n}\n\nexport type RequestCodeFileAppliedChange =\n\t| RequestCodeFileChangeCreate\n\t| RequestCodeFileChangeUpdate\n\t| RequestCodeFileChangeDelete\n\nexport interface RequestCodeFileChangesResult {\n\tappliedChanges: readonly RequestCodeFileAppliedChange[]\n\t/**\n\t * The response from the sub-agent, to be consumed by the main agent.\n\t * Should not be used by the UI, only for internal agent communication.\n\t */\n\tresponse: string\n}\n\nexport const RequestCodeFileChangesInputSchema = z.object({\n\tprompt: z\n\t\t.string()\n\t\t.min(1)\n\t\t.describe(\n\t\t\t\"Write a self-contained handoff for the coding sub-agent. Include the component/file name, requested behavior or changes, relevant project/style context the sub-agent cannot see, what should stay editable via controls, and any hard Framer/runtime constraints. Prefer requirements over implementation details, and call out styling details that should stay adjustable as controls instead of being baked into the file.\",\n\t\t),\n\tfilePath: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The path of an existing code file to update or delete. Omit it when creating a new one.\"),\n})\n\nexport type RequestCodeFileChangesInput = z.infer<typeof RequestCodeFileChangesInputSchema>\nexport type RequestCodeFileChangesExecutor = typeof executeRequestCodeFileChanges\n\n/**\n * Exposes code-file source directly in tool output so the main model can reason about\n * generated controls and implementation details without making a follow-up read.\n */\nexport function getRequestCodeFileChangesToolResultOutput(\n\tresponse: RequestCodeFileChangesResult,\n): ToolResultPart[\"output\"] {\n\tconst files = response.appliedChanges\n\t\t.map(change => {\n\t\t\tswitch (change.operation) {\n\t\t\t\tcase \"create_file\": {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t`Created file:\\n\\n` +\n\t\t\t\t\t\t`<code-file path=${JSON.stringify(change.path)} components=${JSON.stringify(change.components)}>\\n` +\n\t\t\t\t\t\tchange.source.trim() +\n\t\t\t\t\t\t`\\n</code-file>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcase \"update_file\": {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t`Updated file:\\n\\n` +\n\t\t\t\t\t\t`<code-file path=${JSON.stringify(change.path)} components=${JSON.stringify(change.components)}>\\n` +\n\t\t\t\t\t\tchange.source.trim() +\n\t\t\t\t\t\t`\\n</code-file>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcase \"delete_file\":\n\t\t\t\t\treturn `Deleted file:\\n\\n<code-file path=${JSON.stringify(change.path)}></code-file>`\n\t\t\t}\n\t\t})\n\t\t.join(\"\\n\\n\")\n\n\tconst text = [response.response.trim(), files.trim()].filter(Boolean).join(\"\\n\\n---\\n\\n\")\n\n\treturn {\n\t\ttype: \"content\",\n\t\tvalue: [{ type: \"text\", text: text }],\n\t}\n}\n\nconst description =\n\t\"Request code file changes from a coding sub-agent. Returns the sub-agent\u2019s response, plus the code files the sub-agent created, updated, or deleted, if any.\" as const\n\nexport function createRequestCodeFileChangesTool(\n\tctx: AgentContext,\n\tsynchronize: () => Promise<void>,\n\tparentAgentSessionId: string,\n\tonCodeFileHistoryChanges?: StreamLifeCycleHooks[\"onCodeFileHistoryChanges\"],\n\t{\n\t\ttraceContextProvider,\n\t\texecute = executeRequestCodeFileChanges,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\texecute?: RequestCodeFileChangesExecutor\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\t// Parallel tool executions share the same AgentContext. Serialize post-completion\n\t// mutations (applyPatchesToComponentsContext, history changes) so concurrent\n\t// sub-agents don't race on ctx.components definition refreshes.\n\tconst contextLock = new LockQueue()\n\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: RequestCodeFileChangesInputSchema,\n\t\t\texecute: (input, options) =>\n\t\t\t\texecute(input, ctx, contextLock, onPart, {\n\t\t\t\t\tabortSignal: options.abortSignal,\n\t\t\t\t\tparentAgentSessionId,\n\t\t\t\t\tonCodeFileHistoryChanges,\n\t\t\t\t\ttoolCallId: options.toolCallId,\n\t\t\t\t}),\n\t\t\ttoModelOutput: ({ output }) => getRequestCodeFileChangesToolResultOutput(output),\n\t\t},\n\t\t{\n\t\t\ttoolName: REQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tsynchronize,\n\t\t\tonPart,\n\t\t\tonFirstInputDelta: () => ({\n\t\t\t\ttype: \"code-agent-status\",\n\t\t\t\ttext: DRAFTING_CODE_STATUS,\n\t\t\t}),\n\t\t},\n\t)\n}\n\n/** Used by the Agent evals. */\nexport function createRequestCodeFileChangesToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: RequestCodeFileChangesInputSchema,\n\t})\n}\n", "import { localModuleIdentifierForStableName, ModuleType } from \"@framerjs/shared\"\nimport { prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { metadataTags } from \"../../context/metadataTags.ts\"\nimport { isShaderName } from \"../../context/shaders.ts\"\nimport type { VectorControl } from \"../../context/vectors.ts\"\nimport type { ControlsByIdentifier, ControlsResult, ScriptControl } from \"./types.ts\"\n\ntype ControlIdentifierKind = \"component\" | \"vectorSet\" | \"layoutTemplate\" | \"shader\"\ntype ResolveControls = (ctx: AgentContext, identifier: string) => Promise<ControlsResult>\n\nexport function getComponentControls(ctx: AgentContext, componentIds: string[]): Promise<ControlsByIdentifier> {\n\treturn getControlsByIdentifier(ctx, componentIds, \"component\", getControlsForComponentId)\n}\n\nexport function getIconSetControls(ctx: AgentContext, iconSetNames: string[]): Promise<ControlsByIdentifier> {\n\treturn getControlsByIdentifier(ctx, iconSetNames, \"vectorSet\", getControlsForIconSet)\n}\n\nexport function getLayoutTemplateControls(\n\tctx: AgentContext,\n\tlayoutTemplateIds: string[],\n): Promise<ControlsByIdentifier> {\n\treturn getControlsByIdentifier(ctx, layoutTemplateIds, \"layoutTemplate\", getControlsForLayoutTemplateId)\n}\n\nexport function getShaderControls(ctx: AgentContext, shaderNames: string[]): Promise<ControlsByIdentifier> {\n\treturn getControlsByIdentifier(ctx, shaderNames, \"shader\", getControlsForShader)\n}\n\nasync function getControlsByIdentifier(\n\tctx: AgentContext,\n\tidentifiers: string[],\n\tkind: ControlIdentifierKind,\n\tresolveControls: ResolveControls,\n): Promise<ControlsByIdentifier> {\n\tconst results: ControlsByIdentifier = {}\n\tconst entries = await Promise.all(\n\t\tidentifiers.map(async identifier => {\n\t\t\treturn [identifier, await getControls(ctx, identifier, kind, resolveControls)] as const\n\t\t}),\n\t)\n\n\tfor (const [identifier, result] of entries) {\n\t\tresults[identifier] = result\n\t}\n\treturn results\n}\n\nasync function getControls(\n\tctx: AgentContext,\n\tidentifier: string,\n\tkind: ControlIdentifierKind,\n\tresolveControls: ResolveControls,\n): Promise<ControlsResult> {\n\ttry {\n\t\treturn await resolveControls(ctx, identifier)\n\t} catch (error) {\n\t\treturn {\n\t\t\terror: `Failed to load controls for ${kind} ${JSON.stringify(identifier)}: ${getErrorMessage(error)}`,\n\t\t}\n\t}\n}\n\nasync function getControlsForComponentId(ctx: AgentContext, id: string): Promise<ControlsResult> {\n\tconst identifier = ctx.components.getModuleIdentifierForId(id)\n\tif (!identifier) {\n\t\treturn {\n\t\t\terror: `Unknown component id ${JSON.stringify(id)}. Use a component id from <${metadataTags.availableComponents}>.`,\n\t\t}\n\t}\n\n\tconst definition = await ctx.components.async.ensureDefinition(identifier)\n\treturn controlsResult(\n\t\tdefinition?.controls,\n\t\t`Could not load controls for component ${JSON.stringify(id)}. The component module may be unavailable or may have failed to evaluate.`,\n\t)\n}\n\nasync function getControlsForIconSet(ctx: AgentContext, setName: string): Promise<ControlsResult> {\n\tconst controls = sanitizeVectorControlsForScript(await ctx.vectorSets.ensureSetDefinition(setName))\n\treturn controlsResult(\n\t\tcontrols,\n\t\t`Could not load controls for icon set ${JSON.stringify(setName)}. Use an icon set name from <${metadataTags.availableIconSets}>; if the name is valid, the icon set module may be unavailable or may have failed to evaluate.`,\n\t)\n}\n\nasync function getControlsForLayoutTemplateId(ctx: AgentContext, id: string): Promise<ControlsResult> {\n\tconst identifier = localModuleIdentifierForStableName(ModuleType.LayoutTemplate, id, \"default\").value\n\tconst definition = await ctx.layoutTemplates.async.forIdentifier(identifier, { waitUntilLoaded: true })\n\tif (!definition) {\n\t\treturn {\n\t\t\terror: `Could not load controls for layout template ${JSON.stringify(id)}. The layout template id may be unknown or its module may have failed to evaluate.`,\n\t\t}\n\t}\n\n\tconst properties = definition?.controls.properties()\n\tif (!properties) {\n\t\treturn {\n\t\t\terror: `Layout template ${JSON.stringify(id)} loaded without control properties.`,\n\t\t}\n\t}\n\n\tconst controls: Record<string, ScriptControl | undefined> = {}\n\tfor (const controlKey in properties) {\n\t\tconst controlName = definition.controls.getControlTitle(controlKey)\n\t\tif (!controlName) continue\n\t\tcontrols[prefixControlPropKey(controlName)] = properties[controlKey]\n\t}\n\n\treturn { controls }\n}\n\nasync function getControlsForShader(ctx: AgentContext, name: string): Promise<ControlsResult> {\n\tif (!isShaderName(name)) {\n\t\treturn {\n\t\t\terror: `Unknown shader name ${JSON.stringify(name)}. Use a shader name from <${metadataTags.availableShaders}>.`,\n\t\t}\n\t}\n\n\tconst identifier = await ctx.shaders.fetchShaderModuleIdentifier(name)\n\tconst shader = await ctx.shaders.async.forIdentifier(identifier)\n\treturn controlsResult(\n\t\tshader?.controls.properties(),\n\t\t`Could not load controls for shader ${JSON.stringify(name)}. The shader module may be unavailable or may have failed to evaluate.`,\n\t)\n}\n\nfunction sanitizeVectorControlsForScript(\n\tcontrols: Record<string, VectorControl | undefined> | undefined,\n): Record<string, VectorControl | undefined> | undefined {\n\tif (!controls) return\n\n\tconst sanitizedControls = { ...controls }\n\tconst iconControlKey = prefixControlPropKey(\"icon\")\n\tconst iconControl = sanitizedControls[iconControlKey]\n\tif (iconControl?.type === \"icon\") sanitizedControls[iconControlKey] = { type: \"icon\" }\n\n\treturn sanitizedControls\n}\n\nfunction controlsResult(\n\tcontrols: Record<string, ScriptControl | undefined> | undefined,\n\terror: string,\n): ControlsResult {\n\tif (!controls) return { error }\n\treturn { controls }\n}\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error)\n}\n", "import { prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { metadataTags } from \"../../context/metadataTags.ts\"\nimport type { VectorControl } from \"../../context/vectors.ts\"\n\nexport async function getIconListItems(ctx: AgentContext, iconSetName: string): Promise<string[]> {\n\tconst controls = await ctx.vectorSets.ensureSetDefinition(iconSetName)\n\tif (!controls) {\n\t\tthrow new Error(\n\t\t\t`api.icons.list could not load icon set ${iconSetName}. Use an icon set name from <${metadataTags.availableIconSets}>.`,\n\t\t)\n\t}\n\n\tconst iconControl = getIconControl(controls)\n\tif (!iconControl?.options?.length) {\n\t\tthrow new Error(`api.icons.list could not find any searchable icons in icon set ${iconSetName}.`)\n\t}\n\n\tconst names: string[] = []\n\tfor (const name of iconControl.options) {\n\t\tif (name === undefined) continue\n\t\tnames.push(name)\n\t}\n\treturn names\n}\n\nfunction getIconControl(controls: Record<string, VectorControl | undefined>): VectorControl | undefined {\n\treturn controls[prefixControlPropKey(\"icon\")] ?? controls.icon\n}\n", "import type { ProviderMetadata } from \"ai\"\nimport { isObject } from \"utils/typeChecks.ts\"\n\ninterface OpenRouterProviderMetadata extends ProviderMetadata {\n\topenrouter: {\n\t\tusage?: {\n\t\t\tcost?: number\n\t\t}\n\t}\n}\n\nfunction isOpenRouterMetadata(meta: ProviderMetadata | undefined): meta is OpenRouterProviderMetadata {\n\tconst openrouterMetadata = meta?.openrouter\n\treturn isObject(openrouterMetadata)\n}\n\nexport function getOpenRouterCostFromMetadata(providerMetadata: ProviderMetadata | undefined): number {\n\tif (!isOpenRouterMetadata(providerMetadata)) return 0\n\treturn providerMetadata.openrouter.usage?.cost ?? 0\n}\n", "import type { Source } from \"../source.ts\"\nimport {\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n} from \"../tools/toolNames.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nconst LOCAL_AGENT_TOOL_NAMES = [\n\tREAD_PROJECT_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n] as const\n\ntype LocalAgentToolName = (typeof LOCAL_AGENT_TOOL_NAMES)[number]\n\nexport const TOOL_TO_API_METHOD: Record<LocalAgentToolName, string> = {\n\t[READ_PROJECT_TOOL_NAME]: \"readProjectForAgent\",\n\t[REVIEW_CHANGES_TOOL_NAME]: \"reviewChangesForAgent\",\n\t[PUBLISH_TOOL_NAME]: \"publishForAgent\",\n\t[QUERY_IMAGES_TOOL_NAME]: \"queryImagesForAgent\",\n\t[FLATTEN_COMPONENT_INSTANCE_TOOL_NAME]: \"flattenComponentInstanceForAgent\",\n\t[MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME]: \"makeExternalComponentLocalForAgent\",\n}\n\nexport const APPLY_AGENT_CHANGES_API_METHOD = \"applyAgentChanges\"\nexport const GET_AGENT_CONTEXT_API_METHOD = \"getAgentContext\"\n\nexport function toolReference(source: Source, toolName: string): string {\n\tif (source.prompt === \"local\" && toolName in TOOL_TO_API_METHOD) {\n\t\treturn escapeValue(TOOL_TO_API_METHOD[toolName as LocalAgentToolName])\n\t}\n\treturn escapeValue(toolName)\n}\n\n/**\n * Local agent does not have a script tool, but instead has access to methods referred to as \"plugin-api\" methods.\n * @param pluginApiMethod - Optional plugin-api method name to reference, to guide the agent directly.\n * @returns A source specific reference\n * @example\n * // `script` or `getNodeForAgent({ id: '<node-id>' }, { pagePath })`\n * scriptReference(source, \"getNodeForAgent({ id: '<node-id>' }, { pagePath })\")\n * // `script` or `plugin-api`\n * scriptReference(source)\n */\nexport function scriptReference(source: Source, pluginApiMethod?: string): string {\n\tif (source.prompt === \"local\") return escapeValue(pluginApiMethod ?? \"plugin-api\")\n\treturn toolReference(source, SCRIPT_TOOL_NAME)\n}\n\nexport function forSource<T>(source: Source, choices: Record<Source[\"prompt\"], T>): T {\n\treturn choices[source.prompt]\n}\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { createVirtualNodeId } from \"../context/richtext/document.ts\"\nimport {\n\tCollectionReferenceVariableAliasNodeClass,\n\tCOMMAND_SEPARATOR,\n\tCommandType,\n\tDateVariableAliasNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tIconVariableAliasNodeClass,\n\tLinkVariableAliasNodeClass,\n\tOptionVariableAliasNodeClass,\n\tstandardVariableTypes,\n\tVariableNodeClass,\n} from \"../dsl.ts\"\nimport { commandToDSL } from \"../nodeToDSLCommands.ts\"\nimport type { Source } from \"../source.ts\"\nimport { ASK_CLARIFICATION_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { collectionListPrefix, filtersOperatorAnd, filtersOperatorOr } from \"../traits/repeater.ts\"\nimport { filterTransformDocumentation } from \"../traits/transforms.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { scriptReference } from \"./promptEnv.ts\"\nimport { commandReference, escapeValue, keyValueReference, traitReference } from \"./utils.ts\"\n\nexport const cms = (source: Source) =>\n\tMarkdown.section(\n\t\tDictionary.Cms,\n\t\tMarkdown.section(\n\t\t\tDictionary.Collections,\n\t\t\t`- ${escapeValue(ClassDiscriminator.CollectionNode)} is like a database table. Posts, articles, products, and similar content live in CMS collections.`,\n\t\t\t`- Variables on a ${escapeValue(ClassDiscriminator.CollectionNode)} are the table columns.`,\n\t\t\t`- ${escapeValue(ClassDiscriminator.CollectionItemNode)} is like a table row.`,\n\t\t\t`- ${escapeValue(\"$control__<variable-id>\")} values on a ${escapeValue(ClassDiscriminator.CollectionItemNode)} are the cell values for that row.`,\n\t\t\t`When the user asks about or wants to create content (posts, products, blog, articles, etc.), use ${scriptReference(source)} to inspect CMS collections if the schema is not already present in ${escapeValue(`<${metadataTags.collections}>`)}.`,\n\t\t\t`Collections should always be used as the data source for any list-like data unless explicitly stated otherwise.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"CMS variable bindings\",\n\t\t\t`When a node property contains ${escapeValue(\"var(--variable-<id>)\")}, it may be bound to a CMS collection variable. If the variable id matches one in ${escapeValue(`<${metadataTags.collections}>`)}, update the **collection item**, not the node.`,\n\t\t\t`Use the item from ${escapeValue(`<${metadataTags.collectionItem}>`)} when present. Otherwise (e.g. CMS Collection Lists), use ${scriptReference(source)} to fetch the collection items, then update them.`,\n\t\t\t`Example: node has ${escapeValue('text=\"var(--variable-T1)\"')}, item is ${escapeValue('{\"id\":\"item1\"}')}:`,\n\t\t\t`- **Usually**: ${commandToDSL({ type: CommandType.Update, attributes: { id: \"item1\", $control__T1: \"New\" } }, \"\")}`,\n\t\t\t`- **Rarely**: ${commandToDSL({ type: CommandType.Update, attributes: { id: \"nodeId\", text: \"New\" } }, \"\")}`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Creating collections and items\",\n\t\t\t`1. Create a collection: ${commandReference(CommandType.Add, ClassDiscriminator.CollectionNode)} <collection-id> ${keyValueReference(\"name\", \"<collection name>\")}.`,\n\t\t\t`2. Add variables for each column using ${commandReference(CommandType.Add, VariableNodeClass)} for standard fields, or ${commandReference(CommandType.Add, IconVariableAliasNodeClass)} / ${commandReference(CommandType.Add, CollectionReferenceVariableAliasNodeClass)} for specialized fields, with ${escapeValue(\"scope\")} set to the collection id.`,\n\t\t\t`3. Add items with ${commandReference(CommandType.Add, ClassDiscriminator.CollectionItemNode)} and ${escapeValue(\"parent\")} set to the collection id.`,\n\t\t\t`4. Set item cell values using ${commandReference(CommandType.Update)} on the item id and ${escapeValue(\"$control__<variable-id>\")}`,\n\t\t\t`When creating collection items from attached files, perform the file reading, parsing, and item updates from a ${scriptReference(source)} so the import precisely matches the source. Reference the ${escapeValue(\"createCmsItemsFromImportFile\")} example for the recommended pattern.`,\n\t\t\t`**Never create a Slug variable.** A Slug variable is automatically created when the first ${escapeValue(ControlType.String)} variable is added to a collection. Its values are auto-generated from the first ${escapeValue(ControlType.String)} variable.`,\n\t\t\t`**Never change a collection variable's type without explicit user approval.** Do not remove a variable and re-add it as a different type to work around a limitation. If the user requests a feature that the current field type does not support, inform the user about the limitation and use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} to confirm before making any type change.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Porting CMS items\",\n\t\t\t`Before porting CMS items between collections, compare the source and destination schemas.`,\n\t\t\t`When porting CMS items, you **MUST** port the source Slug value to the destination Slug field.`,\n\t\t\t`Before writing any migration command, for every mapped field, explicitly resolve each item's value as: item value if set, otherwise the source variable's initialValue if one exists, otherwise empty. Never treat an absent item attribute as absent data without first checking the source variable's initialValue.`,\n\t\t\t`If any source field has no clear destination match, the mapping is not clear: before editing, use the ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} tool to ask whether to create a field, map it to an existing field, or skip it.`,\n\t\t\t`Never decide to skip, merge, or drop unmatched source fields yourself.`,\n\t\t\t`Use ${scriptReference(source)} for both bulk porting and verification so you do not load every item into context.`,\n\t\t\t`For ${escapeValue(ControlType.RichText)} fields, Always ${commandReference(CommandType.Move)} or ${commandReference(CommandType.Duplicate)} on virtual nodes between the source and destination item instead of rewriting the full block content.`,\n\t\t\t`Before deleting source items or claiming completion, verify every mapped field for every destination item matches the source, including source field defaults. If any value is missing, truncated, rejected, or different without being agreed with the user before porting, stop and fix it or report the failure; do not delete source items.`,\n\t\t\t`Only after that verification succeeds, remove the original item from the source collection.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Bulk CMS operations\",\n\t\t\t`Use ${scriptReference(source)}for bulk changes or bulk transformations on CMS items.`,\n\t\t\t`When a CMS operation needs to preserve, derive, or transform item values, use ${scriptReference(source)} even if the collection is small; do not manually enumerate per-item ${commandReference(CommandType.Update)} commands.`,\n\t\t\t`Mind the order of variables: when replacing a variable, preserve its ${escapeValue(\"position\")} if possible.`,\n\t\t\t`For bulk cms operations perform the ${escapeValue(PROJECT_UPDATE_LABEL)} programmatically in your script with  ${escapeValue(\"await api.updateProject(`...`)\")}`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t`Working with ${escapeValue(ControlType.RichText)} content in Collection Items`,\n\t\t\t`To add new content to Collection Items with a ${escapeValue(ControlType.RichText)} field use ${escapeValue(\n\t\t\t\tcommandToDSL({\n\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tnode: \"TextBlock\",\n\t\t\t\t\t\tid: `textBlock`,\n\t\t\t\t\t\tparent: \"<CollectionItemNodeId>/<RichTextVariableId>\",\n\t\t\t\t\t\ttag: \"p\",\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)}`,\n\t\t\t`To update a specific paragraph in ${escapeValue(ControlType.RichText)} content use ${escapeValue(\n\t\t\t\tcommandToDSL({\n\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: createVirtualNodeId(\"<CollectionItemNodeId>/<RichTextVariableId>\", 0, 1),\n\t\t\t\t\t\ttext: \"Updated text\",\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)}`,\n\t\t\t`**Reminder:** You cannot change the initialValue of a ${escapeValue(ControlType.RichText)} variable. **Always** target a Collection Item ID instead of the Collection ID.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"CMS Collection Lists\",\n\t\t\t`A **CMS Collection List** is a ${escapeValue(ClassDiscriminator.FrameNode)} with ${traitReference(`${collectionListPrefix}.collection`)} set to a collection name and ${traitReference(`${collectionListPrefix}.repeatedDescendantId`)} set to the id of the descendant used as the repeated template. That descendant is repeated once per collection item, with collection variables in scope.`,\n\t\t\t`To create a CMS Collection List:`,\n\t\t\t`1. Add a ${escapeValue(ClassDiscriminator.FrameNode)} as the CMS Collection List.`,\n\t\t\t`2. Add a descendant ${escapeValue(ClassDiscriminator.FrameNode)} inside it (the repeated template).`,\n\t\t\t`3. Set ${keyValueReference(`${collectionListPrefix}.collection`, \"<collection name>\")} and ${keyValueReference(`${collectionListPrefix}.repeatedDescendantId`, \"<descendant id>\")} on the CMS Collection List.`,\n\t\t\t`For layout patterns and examples, query the ${escapeValue(`\"CMS Collection Lists\"`)} implementation guide.`,\n\t\t\tMarkdown.section(\n\t\t\t\t\"Pagination\",\n\t\t\t\t`Add ${traitReference(`${collectionListPrefix}.pagination`)} when the user asks for infinite scroll / load more, or when a collection has more than 20 items. Prefer ${escapeValue(`\"infinite-scroll\"`)} by default.`,\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Filtering collection lists\",\n\t\t\t\t`Use ${escapeValue(\"filters\")} to show only items matching conditions. Each filter targets a variable by ${escapeValue(\"variableId\")} and applies one or more ${escapeValue(\"transforms\")}.`,\n\t\t\t\t`Combine multiple filters with ${escapeValue(`${collectionListPrefix}.filtersOperator=\"${filtersOperatorOr}\"`)} or ${escapeValue(`\"${filtersOperatorAnd}\"`)} (default).`,\n\t\t\t\t`Available transforms:`,\n\t\t\t\t...Object.values(filterTransformDocumentation).map(entry => `- ${escapeValue(entry)}`),\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"Variables in filters\",\n\t\t\t\t\t`Transform properties can reference variables with ${escapeValue(\"var(--variable-<id>)\")} instead of a literal value.`,\n\t\t\t\t\t`Example: ${escapeValue('collectionList.filters.<i>.transforms.<i>.name=\"equals\" collectionList.filters.<i>.transforms.<i>.value=\"var(--variable-selectedCategory)\"')}`,\n\t\t\t\t),\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"Dynamic Filters\",\n\t\t\t\t\t`To let site visitors filter a CMS Collection List at runtime, query the ${escapeValue(`\"CMS Collection Lists\"`)} implementation guide.`,\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"CMS detail pages\",\n\t\t\t`A **CMS detail page** displays a single collection item. Create one by adding a ${escapeValue(ClassDiscriminator.WebPageNode)} with ${escapeValue(\":CollectionName\")} as the slug segment in the path.`,\n\t\t\t`Example \u2014 detail page for an \"Articles\" collection:`,\n\t\t\tcommandToDSL(\n\t\t\t\t{\n\t\t\t\t\ttype: CommandType.Add,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tnode: ClassDiscriminator.WebPageNode,\n\t\t\t\t\t\tid: \"article-detail\",\n\t\t\t\t\t\tname: \"Article Detail\",\n\t\t\t\t\t\tpath: \"/articles/:Articles\",\n\t\t\t\t\t\tposition: undefined,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"\",\n\t\t\t),\n\t\t\t`Then add child nodes that use ${escapeValue(\"var(--variable-<id>)\")} bindings to display collection fields (title, date, etc).`,\n\t\t\t`When a collection has a ${escapeValue(ControlType.CollectionReference)} variable pointing to another collection, use **nested notation** to bind to variables of the referenced collection: ${escapeValue(\"var(--variable-<reference-var-id>.<variable-var-id>)\")}. Chain multiple dots for deeper references (e.g. ${escapeValue(\"var(--variable-<refA>.<refB>.<variable>)\")}).`,\n\t\t\t`**Critical:** When a ${escapeValue(ClassDiscriminator.RichTextNode)} is bound to a ${escapeValue(ControlType.RichText)} variable, do **not** use ${escapeValue(\"textStylePreset\")} or inline text style attributes \u2014 use per-tag presets only:`,\n\t\t\tescapeValue(\n\t\t\t\tcommandToDSL(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tid: \"<rich-text-node-id>\",\n\t\t\t\t\t\t\ttext: \"var(--variable-<rich-text-variable-id>)\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"Heading 1\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"Heading 2\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"Body\",\n\t\t\t\t\t\t\timageStylePreset: \"Editorial Image\",\n\t\t\t\t\t\t\ttableStylePreset: \"Table\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tCOMMAND_SEPARATOR,\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Supported collection variable types\",\n\t\t\t`Only use supported ${escapeValue(VariableNodeClass)} types: ${standardVariableTypes\n\t\t\t\t.map(type => `\"${type}\"`)\n\t\t\t\t.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}, use ${escapeValue(DateVariableAliasNodeClass)} for date variables, ${escapeValue(OptionVariableAliasNodeClass)} for option variables, ${escapeValue(IconVariableAliasNodeClass)} for icon variables, ${escapeValue(GalleryVariableAliasNodeClass)} for gallery variables, ${escapeValue(LinkVariableAliasNodeClass)} for link variables, and ${escapeValue(CollectionReferenceVariableAliasNodeClass)} types: ${[\"single\", \"multi\"].map(type => `\"${type}\"`).join(\", \")}.`,\n\t\t\t`Collection reference variables can also be added with ${escapeValue(\"+CollectionReferenceVariable\")} using ${escapeValue('type=\"single\" | \"multi\"')} and required ${escapeValue(\"collection\")}. When reading referenced data, use ${scriptReference(source)} to resolve the referenced collection item ids into item nodes instead of relying on opaque ids alone.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"CMS table selection reference\",\n\t\t\t`When the user's message contains a ${escapeValue('@{\"reference\":\"cms-selection\",...}')} JSON block, it describes cells the user selected in the CMS table UI.`,\n\t\t\t`**If a matching ${escapeValue(`<${metadataTags.collectionItem}>`)} tag is present for a selected id:** read the values directly from it; do **not** use ${scriptReference(source)} for data you already have.`,\n\t\t\t`**If a selected id has no matching ${escapeValue(`<${metadataTags.collectionItem}>`)} tag:** fetch it with ${scriptReference(source)} using ${escapeValue(\"collectionId\")} + ${escapeValue(\"collectionItemIds\")} + ${escapeValue(\"variableColumnIds\")}.`,\n\t\t\t`The JSON fields are:`,\n\t\t\t`- ${escapeValue(\"collectionId\")}: the selected collection id. Use ${escapeValue(`<${metadataTags.collections}>`)} when you need the collection name or schema.`,\n\t\t\t`- ${escapeValue(\"collectionItemIds\")}: ${escapeValue(ClassDiscriminator.CollectionItemNode)} IDs of the selected rows \u2014 use directly in ${escapeValue(\"SET\")} commands or ${scriptReference(source)} lookups.`,\n\t\t\t`- ${escapeValue(\"variableColumnIds\")}: variable columns the user specifically selected. These are variable IDs on the collection and correspond to ${escapeValue(\"$control__<variable-id>\")} values on collection items.`,\n\t\t\t`- ${escapeValue(\"metadataColumnIds\")}: built-in read-only columns (${escapeValue('\"__cmsStatus__\"')}, ${escapeValue('\"__created_at__\"')}, ${escapeValue('\"__updated_at__\"')}). Not agent-editable.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"When to Use Collections\",\n\t\t\t`Collections should **always** be used as the data source for any list-like data unless explicitly stated otherwise.`,\n\t\t\t\"**Example requests that should use collections:**\",\n\t\t\t`- \"Create a blog\"`,\n\t\t\t`- \"Create ... <number> articles\"`,\n\t\t\t`- \"Create ... a grid of ... products\"`,\n\t\t\t`- \"Create ... a list of ... authors\"`,\n\t\t\t`- \"Create ... a list of ... my favorite musicians: ... <x>, <y>, <z>\"`,\n\t\t\t`- \"Make a homepage with articles\"`,\n\t\t\t`**Reminder:** Any request **like these** or **semantically similar** should use collections and CMS Collection Lists to display the data.`,\n\t\t\t`**Reminder:** Use collections even if the content is specified.`,\n\t\t\t`**Reminder:** Always request the ${escapeValue(`\"CMS Collection Lists\"`)} implementation guide before creating a list-like data source.`,\n\t\t),\n\t)\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport type { ShaderKey } from \"document/components/chrome/insertSidebar/dataSources/items/shaderItems.ts\"\nimport { isOptionalVariableTypeForScopeType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { variableTypesMatching } from \"document/models/CanvasTree/traits/utils/isVariableType.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { Components, CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME } from \"../context/components.ts\"\nimport { Shaders, type ShadersJsonDefinition } from \"../context/shaders.ts\"\nimport { VectorSets } from \"../context/vectors.ts\"\nimport {\n\tCollectionReferenceVariableAliasNodeClass,\n\tCommandType,\n\tComponentNodeClass,\n\tDateVariableAliasNodeClass,\n\tEventHandlerControlName,\n\tEventHandlerVariableAliasNodeClass,\n\tFileVariableAliasNodeClass,\n\tFixedOverlayNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tIconVariableAliasNodeClass,\n\tLinkVariableAliasNodeClass,\n\tOptionVariableAliasNodeClass,\n\tSetVariantActionName,\n\tTriggerEventActionName,\n\ttype AddCommandAttributes,\n\ttype standardVariableTypes,\n} from \"../dsl.ts\"\nimport { commandToDSL } from \"../nodeToDSLCommands.ts\"\nimport type { Source } from \"../source.ts\"\nimport { createQuery } from \"../tools/readProject.ts\"\nimport {\n\tCOMPONENT_DEFINITION_QUERY,\n\tICON_SET_DEFINITION_QUERY,\n\tSHADER_DEFINITION_QUERY,\n} from \"../tools/readProjectQueryTypes.ts\"\nimport {\n\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n} from \"../tools/toolNames.ts\"\nimport { colorDescription } from \"../traits/traitDescriptions.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { forSource, scriptReference, toolReference } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { commandReference, escapeValue, keyValueReference } from \"./utils.ts\"\n\nconst delShaderExample = commandToDSL({\n\ttype: CommandType.Remove,\n\tattributes: { id: \"<id>\" },\n})\n\nconst createOpenFromClosedVariant = commandToDSL({\n\ttype: CommandType.CreateVariant,\n\tattributes: { id: \"<open-variant-id>\", from: \"<closed-variant-id>\" },\n})\n\nexport function buildComponentRules(source: Source) {\n\treturn Markdown.section(\n\t\tDictionary.Components,\n\t\tMarkdown.section(\n\t\t\t\"Creating vs. Instantiating Components\",\n\t\t\t`- ${escapeValue(\"+ComponentNode\")} and ${toolReference(source, CREATE_COMPONENT_FROM_FRAME_TOOL_NAME)} create a **new reusable component definition** (like a template). It has no parent/position since it's a top-level definition.`,\n\t\t\t`- ${escapeValue(\"+ComponentInstanceNode\")} creates an **instance of a component** . It requires a ${escapeValue(\"component\")} attribute with the component's id, and can have parent/position.`,\n\t\t\t`- Before creating a ${escapeValue(\"ComponentInstanceNode\")} with any ${escapeValue(\"$control__*\")} attributes, ensure the component's full definition is in context via ${escapeValue(`<${Components.definitionTag}>`)} or request ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} first.`,\n\t\t\t`- When you add a ${escapeValue(\"ComponentInstanceNode\")} that has icon controls (${escapeValue('type: \"icon\"')} in ${escapeValue(`<${Components.definitionTag}>`)} or the ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} response), set contextually appropriate icons:`,\n\t\t\t`\\t- Look up the component's controls in ${escapeValue(`<${Components.definitionTag}>`)} or the ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} response to find any icon-type controls and their ${escapeValue(\"set\")} reference.`,\n\t\t\t`\\t- If the icon set definition (${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)}) is not yet in context, request it via ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `native tool/function ${escapeValue(READ_PROJECT_TOOL_NAME)} with arguments ${escapeValue(JSON.stringify({ queries: [createQuery({ type: ICON_SET_DEFINITION_QUERY, name: \"<set-name>\" })] }))}`,\n\t\t\t\t\tlocal: escapeValue(\n\t\t\t\t\t\t`readProjectForAgent(${JSON.stringify([createQuery({ type: ICON_SET_DEFINITION_QUERY, name: \"<set-name>\" })])}, { pagePath })`,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t)} before setting icon values.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"When to Use Each Command\",\n\t\t\t`- When the user says \"make a component for this\", \"turn this into a component\", references an existing layer/node like \"this\", \"this layer\", \"this element\", or \"my navigation\" or any request that requires converting an existing layer into a component, use ${toolReference(source, CREATE_COMPONENT_FROM_FRAME_TOOL_NAME)} first.`,\n\t\t\t`- Otherwise when the user says \"create a component called X\", \"make a component named X\", or \"define a component X\" and they are not implicitly referencing existing layers, use ${escapeValue(\"+ComponentNode\")} to create a **new component definition**, regardless of the name (Button, Card, Header, etc.).`,\n\t\t\t// Opus 4.7 was very focused on avoiding large refactors.\n\t\t\t`- If it's the right solution, never avoid creating a new ${escapeValue(ComponentNodeClass)} because it seems like a lot of work.`,\n\t\t\tforSource(source, {\n\t\t\t\t\"in-app\": `- ${escapeValue(\"+ComponentInstanceNode\")} is for inserting an existing component. Use the component's id from ${escapeValue(`<${Components.metadataTag}>`)}, or the id of a ${escapeValue(\"+ComponentNode\")} you just created.`,\n\t\t\t\tlocal: `- ${escapeValue(\"+ComponentInstanceNode\")} is for inserting an existing component. Use the component's id from ${escapeValue(`<${Components.metadataTag}>`)}, the id of a ${escapeValue(\"+ComponentNode\")} you just created, or the ${escapeValue(\"componentId\")} from a component export returned by ${escapeValue(\"framer.createCodeFile\")}.`,\n\t\t\t}),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Creating a New Component Node\",\n\t\t\t`- A ${escapeValue(\"ComponentNode\")} must end up with at least one ${escapeValue(\"FrameNode\")} child as its **primary variant**.`,\n\t\t\t`- After ${commandReference(CommandType.Add, \"ComponentNode\")}, you MUST immediately insert a ${commandReference(CommandType.Add, ClassDiscriminator.FrameNode)} with ${escapeValue(\"parent\")} set to the ComponentNode's ID.`,\n\t\t\t`- Example: ${commandReference(CommandType.Add, \"ComponentNode\")} <component-id> ${keyValueReference(\"name\", \"Card\")} followed by ${commandReference(CommandType.Add, ClassDiscriminator.FrameNode)} <primary-variant-id> ${keyValueReference(\"parent\", \"<component-id>\")} then ${commandReference(CommandType.Update)} <primary-variant-id> ${keyValueReference(\"width\", \"auto\")}.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Working with Existing Components\",\n\t\t\t`- All available components are provided in the ${escapeValue(`<${Components.metadataTag}>`)} metadata tag, split into \"Current Project Components\", \"${CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME}\", \"Current Project External Components\", and \"Additionally Available Components\" from the insert panel.`,\n\t\t\t`- Each component entry has a stable ${escapeValue(\"id\")} used in ${escapeValue('component=\"<id>\"')} and ${escapeValue(\"componentPreset.<id>\")}. The ${escapeValue(\"displayName\")} attribute shows the human-readable name of the underlying component.`,\n\t\t\t`- The ${CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME}, additionally, is structured like ${escapeValue('{\"filePath\": [/* components declared in the file */]}')}. ${escapeValue(\"filePath\")} is used ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `in ${toolReference(source, REQUEST_CODE_FILE_CHANGES_TOOL_NAME)}`,\n\t\t\t\t\tlocal: \"with code-file plugin APIs\",\n\t\t\t\t},\n\t\t\t)}, but is also a human-readable name for the file.`,\n\t\t\t`- Full definitions for relevant selected components may already be provided in ${escapeValue(`<${Components.definitionTag}>`)} metadata tags.`,\n\t\t\t`- Use ${scriptReference(source)} when you need to inspect the internal structure of non-code local project components.`,\n\t\t\t...forSource(source, {\n\t\t\t\t\"in-app\": [\n\t\t\t\t\t`- ${escapeValue(\"+ComponentNode\")} is the default when creating a reusable component \u2014 it keeps the component editable on the canvas and supports variants, property controls, and event handlers. Only reach for ${toolReference(source, REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} when the request requires runtime logic the canvas cannot express; see the ${escapeValue(REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} tool section for the decision rubric.`,\n\t\t\t\t\t`- If the target is already a code component (listed in the ${escapeValue(CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME)} section of ${escapeValue(`<${Components.metadataTag}>`)}), it can only be modified through ${toolReference(source, REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} using its file path. ${escapeValue(\"project-update\")} component commands do not apply to those files.`,\n\t\t\t\t],\n\t\t\t\tlocal: [\n\t\t\t\t\t`- ${escapeValue(\"+ComponentNode\")} is the default when creating a reusable component \u2014 it keeps the component editable on the canvas and supports variants, property controls, and event handlers. Only reach for the code-file plugin APIs (${escapeValue(\"createCodeFile\")}, ${escapeValue(\"setFileContent\")}) when the request requires runtime logic the canvas cannot express.`,\n\t\t\t\t\t`- If the target is already a code component (listed in the ${escapeValue(CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME)} section of ${escapeValue(`<${Components.metadataTag}>`)}), it can only be modified by editing its source file via the code-file plugin APIs \u2014 the DSL does not apply to those files.`,\n\t\t\t\t],\n\t\t\t}),\n\t\t\t`- Use ${forSource(source, {\n\t\t\t\t\"in-app\": `${escapeValue(READ_PROJECT_TOOL_NAME)} with ${escapeValue(JSON.stringify({ queries: [createQuery({ type: COMPONENT_DEFINITION_QUERY, id: \"<component-id>\" })] }))}`,\n\t\t\t\tlocal: escapeValue(\n\t\t\t\t\t`readProjectForAgent(${JSON.stringify([createQuery({ type: COMPONENT_DEFINITION_QUERY, id: \"<component-id>\" })])}, { pagePath })`,\n\t\t\t\t),\n\t\t\t})} when you need to fetch a component's ${escapeValue(\"controls\")} on demand; those controls list the available ${escapeValue(\"$control__*\")} props. This works for both project components and additionally available components.`,\n\t\t\t`- When using an \"Additionally Available\" component, **always** request its ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} first to learn its controls before setting ${escapeValue(\"$control__*\")} values.`,\n\t\t\t`- When inserting a ${escapeValue(\"ComponentInstanceNode\")}, **always** match ${escapeValue(\"$control__variant\")} option values on ${escapeValue(\"ComponentInstanceNode\")} with current Breakpoint names (e.g. \"Desktop\", \"Phone\", \"Tablet\", \"Mobile\"), consult ${AgentSystemPromptDictionary.EfficientReplicaUse}.`,\n\t\t\t`- **Never** create a ${escapeValue(\"ComponentInstanceNode\")} for each Breakpoint Variant, instead **always** create a single ${escapeValue(\"ComponentInstanceNode\")} in the Primary Variant/Breakpoint and match the ${escapeValue(\"$control__variant\")} option values with the current Breakpoint/Variant names.`,\n\t\t\t`To determine the component:`,\n\t\t\t`- ${escapeValue(\"ComponentInstanceNode\")} nodes report their ${escapeValue(\"component\")} id.`,\n\t\t\t`- Use the id to inspect any matching ${escapeValue(`<${Components.definitionTag}>`)} metadata tag or request ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} and inspect its ${escapeValue(\"controls\")}.`,\n\t\t\t`- Slot properties are an array of node ids referencing direct children of the scope node. DO NOT use ${commandReference(CommandType.Move)} to set slot items, update the control value instead.`,\n\t\t\t`- When creating nodes for use in slots create them as direct children of the scope node, not as children of a variant node.`,\n\t\t\t`- When referencing existing nodes in slots first ${commandReference(CommandType.Move)} or ${commandReference(CommandType.Duplicate)} them as direct children of the scope node, arranging them to not overlap any other nodes.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\tDictionary.Shaders,\n\t\t\t`- ${escapeValue(\"+\" + ClassDiscriminator.ShaderNode)} adds a shader to the canvas with the given ${escapeValue<ShadersJsonDefinition>(\"name\")} as the ${escapeValue(\"shader\")} attribute.`,\n\t\t\t`- Do not create a ${escapeValue(ClassDiscriminator.ShaderNode)} without a ${escapeValue(\"shader\")} attribute. It cannot be set with a ${commandReference(CommandType.Update)} command. It must be included in the ${escapeValue(\"+\" + ClassDiscriminator.ShaderNode)} command.`,\n\t\t\t`- Shaders are pre-defined WebGL instances that can be added to a site to achieve graphical effects not typically achievable or high performance with html/css`,\n\t\t\t`- All available shader names are provided in the ${escapeValue(`<${Shaders.availableShadersTag}>`)} metadata tag.`,\n\t\t\t`- Full definitions for project shaders may already be provided in ${escapeValue(`<${Shaders.shaderDefinitionsTag}>`)} metadata tags.`,\n\t\t\t`- Before using a shader with ${escapeValue(\"$control__*\")} values, ensure its full definition is in context via ${escapeValue(`<${Shaders.shaderDefinitionsTag}>`)} or request it with ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": escapeValue(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tqueries: [createQuery({ type: SHADER_DEFINITION_QUERY, name: \"<shader-name>\" as ShaderKey })],\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tlocal: escapeValue(\n\t\t\t\t\t\t`readProjectForAgent(${JSON.stringify([createQuery({ type: SHADER_DEFINITION_QUERY, name: \"<shader-name>\" as ShaderKey })])}, { pagePath })`,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t)}.`,\n\t\t\t`- Use ${toolReference(source, READ_PROJECT_TOOL_NAME)} only when the matching ${escapeValue(`<${Shaders.shaderDefinitionsTag}>`)} is not already in context. ${escapeValue(`\"${SHADER_DEFINITION_QUERY}\"`)} returns the shader's full controls.`,\n\t\t\t`- To change a ${escapeValue<AddCommandAttributes>(\"shader\")} attribute or replace a ${escapeValue(ClassDiscriminator.ShaderNode)}, you must ${escapeValue(delShaderExample)} and then add a new one. ${escapeValue<AddCommandAttributes>(\"shader\")} can not be changed on an existing ${escapeValue(ClassDiscriminator.ShaderNode)} instance.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Component Patterns\",\n\t\t\tMarkdown.section(\n\t\t\t\t\"Navigation with Drawer\",\n\t\t\t\t`- Aim to precisely reference the example-json in the \"Navigations\" Guide for the Drawer.`,\n\t\t\t\t`- **Always** create a ${escapeValue(ComponentNodeClass)} for a Navigation to implement a Drawer - it is the only way to satisfy the user's request - never try to avoid adding complexity by some other pragmatic shortcut - use ${toolReference(source, CREATE_COMPONENT_FROM_FRAME_TOOL_NAME)} or ${commandReference(CommandType.Add, ComponentNodeClass)}.`,\n\t\t\t\t`- When simple Navigations are already be setup with a simple Logo and Hamburger - resolve by wrapping the Logo and Hamburger in a new ${escapeValue(ClassDiscriminator.FrameNode)} in the Primary Variant so that you can add the links below on the Closed Variant.`,\n\t\t\t\t\"- Create or designate an existing Variant, as the 'Closed' Variant, ensure that it has a fixed pixel height, and clips its content (usually, the fixed height should precisely match the existing pixel height of the Desktop Variant).\",\n\t\t\t\t`- Ensure that the contents of the drawer are ${escapeValue(\"visible: true\")} in the Closed Variant and visually hidden only as a result of clipping.`,\n\t\t\t\t`- Create an Open Variant **from the Closed Variant** (${escapeValue(createOpenFromClosedVariant)}) so that you **create an exact copy**. Set the Open Variant's height to ${escapeValue(\"auto\")} to perfectly reveal the drawer contents.`,\n\t\t\t\t\"- **CRITICAL:** The contents of the drawer should be visible and have identical width and height in **both** Closed and Open Variants.\",\n\t\t\t\t`- Navigate back and forth between these two Variants using ${escapeValue(SetVariantActionName)} and use exact ids (never cycling) on a Hamburger or \"X\" icon.`,\n\t\t\t\t`- Unless the user request's specifically, never create a mobile drawer with a ${escapeValue(FixedOverlayNodeClass)} - always use an \"Open\" Variant.`,\n\t\t\t\t`- Always verify your work by taking a screenshot of both the 'Closed' and 'Open' Variants and ensure the following:`,\n\t\t\t\t`1. The left aligned Logo and right aligned Hamburger are in the same position in both Variants.`,\n\t\t\t\t`2. The drawer content is nicely left-aligned to the Logo.`,\n\t\t\t\t`3. No content from the drawer is visible in the 'Closed' Variant.`,\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Navigation with Relative Overlays\",\n\t\t\t\t`- If the navigation uses Relative Overlays, you must convert it to a ${escapeValue(ComponentNodeClass)} when making it responsive so that you can make a Drawer for smaller Breakpoints.`,\n\t\t\t),\n\t\t),\n\t)\n}\n\nconst variableTypeDescriptions: Record<(typeof standardVariableTypes)[number], string> = {\n\t[ControlType.Number]: \"<number>\",\n\t[ControlType.String]: \"<string>\",\n\t[ControlType.RichText]: \"<plain text>\",\n\t[ControlType.Boolean]: \"<boolean>\",\n\t[ControlType.Color]: `<${colorDescription}>`,\n\t[ControlType.Image]: \"<image URL>\",\n}\n\nexport function buildVariables(source: Source) {\n\treturn Markdown.section(\n\t\tDictionary.Variables,\n\t\t`Use ${commandReference(CommandType.Add, \"Variable\")} to create standard variables. Use ${commandReference(\n\t\t\tCommandType.Add,\n\t\t\tDateVariableAliasNodeClass,\n\t\t)}, ${commandReference(CommandType.Add, OptionVariableAliasNodeClass)}, ${commandReference(CommandType.Add, EventHandlerVariableAliasNodeClass)}, ${commandReference(CommandType.Add, FileVariableAliasNodeClass)}, ${commandReference(CommandType.Add, GalleryVariableAliasNodeClass)}, ${commandReference(CommandType.Add, CollectionReferenceVariableAliasNodeClass)}, ${commandReference(CommandType.Add, LinkVariableAliasNodeClass)}, and ${commandReference(CommandType.Add, IconVariableAliasNodeClass)} for their specialized syntaxes.`,\n\t\t`**Link variables:** Use ${commandReference(CommandType.Add, LinkVariableAliasNodeClass)} for a valid URL (for example ${escapeValue(\"https:\")}, ${escapeValue(\"mailto:\")}, ${escapeValue(\"tel:\")}) or relative page path. Do not set ${escapeValue(\"initialValue\")} on link variables.`,\n\t\t`**Scope is required:** When adding a variable, you must specify the ${escapeValue(\"scope\")} attribute.`,\n\t\t`The scope must be the ${escapeValue(\"ComponentNode\")} id, ${escapeValue(`<${ClassDiscriminator.WebPageNode}>`)} id, or ${escapeValue(`<${ClassDiscriminator.CollectionNode}>`)} id \u2014 NOT the root ${escapeValue(ClassDiscriminator.FrameNode)} inside the component.`,\n\t\t`For example, if you created ${escapeValue(\"+ComponentNode component-button\")} and ${escapeValue('+FrameNode frame-button parent=\"component-button\"')}, the scope is ${escapeValue(\"component-button\")}, not ${escapeValue(\"frame-button\")}.`,\n\t\t`If the scope is not available in the current context (e.g., you only have a selection inside a component but not the component ID itself), you MUST first query with ${scriptReference(source)} to obtain the scope before adding the variable. When serializing scope variables, always use ${escapeValue('\"depth\": 0')} to avoid loading unnecessary descendants.`,\n\t\t`After you add a variable, reuse the id from that Add command in any ${commandReference(CommandType.Update)} (or other commands) in the **same assistant response** that need that variable. You already know that id, so do not call ${toolReference(source, READ_PROJECT_TOOL_NAME)} only to look it up again.`,\n\t\t`A property can be set to a variable by using the variable reference syntax e.g. ${commandReference(CommandType.Update)} ${keyValueReference(\"text\", \"var(--variable-<variable-id>)\")}.`,\n\t\t`**EventHandler variables:** Use ${commandReference(CommandType.Add, EventHandlerVariableAliasNodeClass)} on ${escapeValue(ComponentNodeClass)}. Bind ${escapeValue(EventHandlerControlName)} controls with a variable reference like ${commandReference(CommandType.Update)} ${keyValueReference(\"$control__on_click\", \"var(--variable-<variable-id>)\")}. Inside a ${escapeValue(ComponentNodeClass)}, trigger them from node event handlers with ${escapeValue(TriggerEventActionName)} actions such as ${escapeValue(`onClick.0.action=\"${TriggerEventActionName}\"`)} and ${escapeValue('onClick.0.controls.id=\"var(--variable-<variable-id>)\"')}. Reuse the id from the Add command in those updates in the same response; do not query the component again only to re-fetch that id.`,\n\t\t`Use ${commandReference(CommandType.Update)} to update an existing variable's ${escapeValue(\"name\")}, ${escapeValue(\"description\")}, ${escapeValue(\"initialValue\")}, or any type-specific option that this prompt lists as updatable (for example ${escapeValue(\"displayTextArea\")} on string variables).`,\n\t\t`**Never change a variable's ${escapeValue(\"type\")} without explicit user approval.** ${commandReference(CommandType.Update)} cannot change a variable's ${escapeValue(\"type\")}, and you must not work around this by removing the variable and re-adding it as a different type. If the user requests a feature that the current type does not support, inform the user about the limitation and confirm before making any type change.`,\n\t\t`**Collection reference variables:** Use ${escapeValue(\"+CollectionReferenceVariable\")} with ${escapeValue(\n\t\t\t'type=\"single\" | \"multi\"',\n\t\t)} and required ${escapeValue(\"collection\")}.`,\n\t\t`- ${escapeValue('type=\"single\"')} optionally uses a single referenced collection item id as ${escapeValue(\"initialValue\")}.`,\n\t\t`- ${escapeValue('type=\"multi\"')} optionally uses a JSON string array of referenced collection item ids as ${escapeValue(\"initialValue\")}.`,\n\t\t`**Icon variables:** Use ${commandReference(CommandType.Add, IconVariableAliasNodeClass)} with required ${escapeValue(\"set\")} from ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)}. If ${escapeValue(\"initialValue\")} is omitted, the first icon from the set is used. You cannot change an icon variable's ${escapeValue(\"set\")} with ${commandReference(CommandType.Update)}; create a new variable instead.`,\n\t\t`**Option variables:** Use ${commandReference(CommandType.Add, OptionVariableAliasNodeClass)} with string ${escapeValue(\"cases.<i>\")} entries and an ${escapeValue(\"initialValue\")} equal to one of those cases.`,\n\t\t`**String variables (multi-line):** Set ${keyValueReference(\"displayTextArea\", \"true\")} on ${commandReference(CommandType.Add, \"Variable\")} ${keyValueReference(\"type\", \"string\")} when the field should accept multiple lines (paragraphs, descriptions, long-form copy) and not include formatted text (bold, italic, etc.). Omit it for single-line text inputs. To toggle Text Area on an existing string variable, emit ${commandReference(CommandType.Update)} ${escapeValue(\"<variable-id>\")} ${keyValueReference(\"displayTextArea\", \"true\")} \u2014 do not remove and re-add the variable.`,\n\t\t`**File variables:** Use ${commandReference(CommandType.Add, FileVariableAliasNodeClass)} with string ${escapeValue(\"allowedFileTypes.<i>\")} entries like ${escapeValue('\".mp3\"')} or ${escapeValue('\".mp4\"')}.`,\n\t\t`**RichText variables:** When a variable has ${escapeValue('type=\"richtext\"')}, its content is displayed as editable rich text children (for example ${escapeValue(\"TextBlock\")}, ${escapeValue(\"TextBulletList\")}, ${escapeValue(\"TextNumberedList\")}, ${escapeValue(\"TextListItem\")}, ${escapeValue(\"TextRun\")}). For targeted edits, operate on those existing virtual nodes. To replace all content at once, set ${escapeValue(\"initialValue\")} directly via ${commandReference(CommandType.Update)}.`,\n\t\t`**Rich text and variables:** ${escapeValue(\"TextRun\")} and ${escapeValue(\"TextBlock\")} ${escapeValue(\"text\")} is literal text only. Bind a variable on the owning ${escapeValue(\"RichTextNode\")} with ${keyValueReference(\"text\", \"var(--variable-<variable-id>)\")}, not on virtual ${escapeValue(\"v:\")} nodes. To clear text, use ${escapeValue('text=\"\"')}. ${escapeValue('text=\"null\"')} applies the literal word ${escapeValue(\"null\")}.`,\n\t\t`When adding root rich text blocks to a richtext variable, the ${escapeValue(\"parent\")} attribute must use the format ${escapeValue(\"<scope-id>/<variable-id>\")} (e.g. ${escapeValue('parent=\"component1/myVar\"')}). The scope ID is the ${escapeValue(\"ComponentNode\")} or ${escapeValue(\"CollectionNode\")} that owns the variable. Use virtual parent ids for nested edits inside list items. When using ${commandReference(CommandType.Update)} to update a variable's ${escapeValue(\"name\")} or ${escapeValue(\"initialValue\")}, use the variable ID directly.`,\n\t\t`**Do not generate ${escapeValue(\"description\")} for variables unless the user explicitly asks for it.**`,\n\t\t`Variables created on a component are also available as controls. You can reference them using either:`,\n\t\t`- ${escapeValue(\"$control__<snake_case_variable_name>\")} - by the variable's normalized name (snake_case)`,\n\t\t`- ${escapeValue(\"$control__<variable.id>\")} - directly by the variable's ID`,\n\t\tMarkdown.section(\n\t\t\t\"Variable Types\",\n\t\t\t...Object.entries(variableTypeDescriptions).map(\n\t\t\t\t([type, description]) =>\n\t\t\t\t\t`- ${commandReference(CommandType.Add, \"Variable\")} ${keyValueReference(\"type\", type)}: ${description}`,\n\t\t\t),\n\t\t\t`- ${commandReference(CommandType.Add, DateVariableAliasNodeClass)}: <ISO 8601 date string> with optional ${escapeValue('displayTime=\"true\"')} to show time picker`,\n\t\t\t`- ${commandReference(CommandType.Add, OptionVariableAliasNodeClass)}: <array of ${escapeValue(\"cases\")}> with required ${escapeValue(\"initialValue\")}`,\n\t\t\t`- ${commandReference(CommandType.Add, EventHandlerVariableAliasNodeClass)}: ${escapeValue(EventHandlerControlName)} variable on ${escapeValue(ComponentNodeClass)} with no ${escapeValue(\"initialValue\")}`,\n\t\t\t`- ${commandReference(CommandType.Add, LinkVariableAliasNodeClass)}: link variable for a valid URL (for example ${escapeValue(\"https:\")}, ${escapeValue(\"mailto:\")}, ${escapeValue(\"tel:\")}) or relative page path with no ${escapeValue(\"initialValue\")}`,\n\t\t\t`- ${commandReference(CommandType.Add, FileVariableAliasNodeClass)}: <array of ${escapeValue(\"allowedFileTypes\")}> with no ${escapeValue(\"initialValue\")}`,\n\t\t\t`- ${commandReference(CommandType.Add, IconVariableAliasNodeClass)}: <icon name from the set's ${escapeValue(\"options\")} array> with required ${escapeValue('set=\"<Icon Set Name>\"')}`,\n\t\t\t`- ${commandReference(CommandType.Add, GalleryVariableAliasNodeClass)}: <array of image URLs> with optional ${escapeValue('minCount=\"<Minimum Number of Images>\"')} and ${escapeValue('maxCount=\"<Maximum Number of Images>\"')}`,\n\t\t\t`- ${commandReference(CommandType.Add, CollectionReferenceVariableAliasNodeClass)} ${keyValueReference(\"type\", \"single\")}: <collection item id> with required ${escapeValue('collection=\"<Collection Name>\"')}`,\n\t\t\t`- ${commandReference(CommandType.Add, CollectionReferenceVariableAliasNodeClass)} ${keyValueReference(\"type\", \"multi\")}: <JSON array of collection item ids> with required ${escapeValue('collection=\"<Collection Name>\"')}`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"WebPage Variables\",\n\t\t\t`${escapeValue(ClassDiscriminator.WebPageNode)} variables hold **user-controlled state** for the page \u2014 e.g. a search query, a selected filter, or a UI mode. They are populated at runtime from URL query parameters; in the editor, the ${escapeValue(\"initialValue\")} is used.`,\n\t\t\t`Use the optional ${escapeValue(\"queryParam\")} attribute to customize the URL query parameter name. If omitted, the parameter name defaults to a slugified version of the variable name. Example: ${commandReference(CommandType.Add, \"Variable\")} ${keyValueReference(\"type\", \"string\")} ${keyValueReference(\"scope\", \"<web-page-id>\")} ${keyValueReference(\"name\", \"Search Query\")} ${keyValueReference(\"queryParam\", \"q\")}.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Optional Variables\",\n\t\t\t`On ${escapeValue(ClassDiscriminator.WebPageNode)} and ${escapeValue(\"ComponentNode\")} scopes, omitting ${escapeValue(\"initialValue\")} when adding a variable automatically marks it as optional.`,\n\t\t\t`An optional variable's value is unset until explicitly provided at runtime.`,\n\t\t\t`Providing an ${escapeValue(\"initialValue\")} keeps the variable non-optional.`,\n\t\t\t`Supported on types: ${variableTypesMatching(type =>\n\t\t\t\tisOptionalVariableTypeForScopeType(\n\t\t\t\t\ttype,\n\t\t\t\t\t// In practice, if it can be optional on Web Pages it can be optional on Smart Components\n\t\t\t\t\t// If this assumption ever changes we should break this down\n\t\t\t\t\tScopeType.WebPage,\n\t\t\t\t),\n\t\t\t)\n\t\t\t\t.map(escapeValue)\n\t\t\t\t.join(\", \")}. For other types, or other scope types, an initial value is required.`,\n\t\t),\n\t)\n}\n", "import { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport {\n\tCommandType,\n\tTextBlockClass,\n\tTextBlockquoteClass,\n\tTextBulletListClass,\n\tTextComponentInstanceClass,\n\tTextLineBreakClass,\n\tTextListItemClass,\n\tTextMediaBlockClass,\n\tTextNumberedListClass,\n\tTextRunClass,\n\tTextTableCellClass,\n\tTextTableClass,\n\tTextTableRowClass,\n\tTextUnsupportedBlockClass,\n} from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { FONT_SEARCH_QUERY } from \"../tools/readProjectQueryTypes.ts\"\nimport { READ_PROJECT_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { nullString } from \"../traits/helpers.ts\"\nimport {\n\tbreakpointLabels,\n\tbreakpointSlotProperties,\n\tdefaultBreakpointLabel,\n\treplicaLabelsForCount,\n} from \"../traits/textStylePresetBreakpointSlots.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { forSource } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport type { NestedStringArray } from \"./utils.ts\"\nimport {\n\tcommandReference,\n\tescapeValue,\n\tformatNestedArray,\n\tkeyValueReference,\n\ttraitReference,\n\ttraitValueReference,\n} from \"./utils.ts\"\n\n// ---------------------------------------------------------------------------\n// Design Rules \u2014 high-level aesthetic guidance\n// ---------------------------------------------------------------------------\n\nconst general = [\n\t\"Every design should feel detailed and intentionally crafted for its context, not templated or overly simplistic\",\n\t\"Create clear hierarchy through placement, spacing, contrast, scale, or weight, also for minimal designs\",\n\t\"Pick a distinct creative direction and stick to it across multiple sections and layouts\",\n\t\"Reuse consistent section widths or max-widths across the page. Do not pick arbitrary widths per section\",\n\t\"When recreating or matching a reference image, maximum visual and layout fidelity to that reference takes precedence over generic design heuristics\",\n\t\"When recreating a layout from a reference image, match its style, spacing, and proportions precisely \u2014 do not loosely interpret\",\n\t\"When recreating from a reference image, recreate every visible line, border, stroke, outline, divider, separator, or edge from the reference\",\n]\n\nconst typography = [\n\t'Use smart apostrophe (\\u2019) and smart quotes (\\u201c \\u201d) in canvas text, not straight \\' or \" \"',\n\t\"Choose fonts that fit the design's personality. Do not default to generic choices when a stronger fit is needed\",\n\t\"When recreating from a reference image, infer each text block's anchor from its parent bounds and preserve it (e.g. hero title on the section centerline stays centered even if secondary controls are pinned to the bottom)\",\n\t`When heroes or footers have edge-to-edge typography, use ${traitValueReference(\"fontSize\", \"auto-fit(100%)\")} \u2014 do not set ${traitValueReference(\"width\", \"auto\")}, set ${traitValueReference(\"width\", \"100%\")} and let ${traitReference(\"fontSize\")} auto-fit scale the text`,\n\t`When using ${traitValueReference(\"fontSize\", \"auto-fit(100%)\")}, use ${traitValueReference(\"lineHeight\", \"1\")}`,\n\t`For paragraphs and taglines, use ${traitReference(\"textWrapBalance\")}`,\n\t\"Avoid too many unique font sizes for a design, less is more\",\n\t\"Use consistent font weights for similarly sized text\",\n\t`Use tabular numbers (${escapeValue(`openTypeFontFeatures.tnum=\"on\"`)}) for data, stats, and pricing`,\n\t\"Avoid widows and orphans \u2014 tidy up line breaks and rag\",\n\t`${traitReference(\"rootFontSize\")} on breakpoints controls the base size for ${traitReference(\"fontSize\")} rem units (default: 16px). Adjust per breakpoint for responsive type scaling.`,\n]\n\nconst logos = [\"For logo strings and logo clouds, always use the Logos Vector Set\"]\n\nconst layout = [\n\t`Use a Stack ${traitValueReference(\"layout\", \"stack\")} on the page breakpoints`,\n\t`Set ${traitValueReference(\"height\", \"auto\")} on the page breakpoints`,\n\t\"Before changing an existing layout, preserve what's already working: only restructure when the current container cannot meet the requested visual behavior\",\n\t\"Don't apply structural changes just to match a preferred pattern; if the current layout already solves the request, keep it as-is\",\n\t\"When switching any element to fixed positioning, keep its visible placement and size stable\",\n]\n\nconst spacing = [\n\t\"Reuse spacing values for gap and padding. Do not invent new values without a clear reason\",\n\t\"When recreating from an image, preserve spacing proportions (outer margins : section padding : internal gaps) instead of equalizing everything to default spacing\",\n\t\"Match the reference spacing rhythm across sections \u2014 keep large/medium/small spacing contrasts in the same relative order and magnitude\",\n\t`Sections should have consistent vertical ${traitReference(\"padding\")} throughout the page`,\n]\n\nconst colors = [\n\t\"Commit to a dominant color with sharp accents \u2014 don't spread colors evenly across the palette\",\n\t\"Designs can either:\",\n\t\"1. Keep most elements restrained and use accent color only on key elements like buttons, highlights, or calls to action\",\n\t\"2. Use a dominant color base, with monochromatic layering on top to keep the design consistent and cohesive\",\n\t`Avoid \"color slop\": Don't invent unpleasant colors like \"gold/warm amber\" or \"purple\", unless asked.`,\n]\n\nconst surfaces = [\n\t\"Differentiate layered surfaces with clear changes in background, border, or elevation so depth feels intentional\",\n]\n\nconst components = [\n\t`Keep ${traitReference(\"radius\")} consistent \u2014 cards, buttons, and inputs share the same scale, and nested elements use a smaller ${traitReference(\"radius\")} so radii are concentric`,\n\t\"Navigation should be simple and immediately recognizable as navigation\",\n\t`Interactive elements (buttons, links, inputs, clickable cards) need appropriate internal ${traitReference(\"padding\")} \u2014 never leave content flush to edges`,\n]\n\nexport const designRules = [\n\tgeneral,\n\tMarkdown.section(\"Typography\", typography),\n\tMarkdown.section(\"Logos\", logos),\n\tMarkdown.section(\"Layout\", layout),\n\tMarkdown.section(\"Spacing\", spacing),\n\tMarkdown.section(\"Colors\", colors),\n\tMarkdown.section(\"Surfaces\", surfaces),\n\tMarkdown.section(\"Components\", components),\n]\n\n// ---------------------------------------------------------------------------\n// Rich Text Rules \u2014 TextBlock/TextRun usage guidance\n// ---------------------------------------------------------------------------\n\nconst richTextNode = escapeValue(ClassDiscriminator.RichTextNode)\nconst textBlock = escapeValue(TextBlockClass)\nconst textBlockquote = escapeValue(TextBlockquoteClass)\nconst textTable = escapeValue(TextTableClass)\nconst textTableRow = escapeValue(TextTableRowClass)\nconst textTableCell = escapeValue(TextTableCellClass)\nconst textBulletList = escapeValue(TextBulletListClass)\nconst textNumberedList = escapeValue(TextNumberedListClass)\nconst textListItem = escapeValue(TextListItemClass)\nconst textRun = escapeValue(TextRunClass)\nconst textLineBreak = escapeValue(TextLineBreakClass)\nconst textComponentInstance = escapeValue(TextComponentInstanceClass)\n\nexport const richTextRules: NestedStringArray = [\n\t[\n\t\t`Hierarchy:`,\n\t\t[\n\t\t\t`A ${textBlock} is a paragraph-level block (p, h1\u2013h6) inside a RichTextNode or ${textListItem}.`,\n\t\t\t`A ${textBlockquote} is a quote block in rich text. It can contain ${textBlock}s and other rich text blocks, including nested lists. It is supported in the CMS.`,\n\t\t\t`A ${textTable} is a table in rich text. It contains ${textTableRow}s; each ${textTableRow} contains ${textTableCell}s; each ${textTableCell} contains block children. It is supported in the CMS.`,\n\t\t\t`A ${textBulletList} or ${textNumberedList} is a recursive rich text list container. Use them instead of paragraph workarounds when the content is actually a list.`,\n\t\t\t`A ${textListItem} is a structural list child. It can contain ${textBlock}s and other rich text blocks, including nested lists.`,\n\t\t\t`A ${textRun} is an inline span inside a ${textBlock} that carries its own styling (color, weight, size, etc.) and semantic marks (${traitReference(\"bold\")}, ${traitReference(\"italic\")}, ${traitReference(\"inlineCode\")}).`,\n\t\t\t`A ${textLineBreak} is a dedicated line-break node inside a ${textBlock}. It has no attributes, just add it between runs.`,\n\t\t\t`A ${textComponentInstance} is a leaf block that embeds an existing component from ${escapeValue(`<${metadataTags.availableComponents}>`)} inside rich text. It is supported in the CMS.`,\n\t\t\t`If a ${textComponentInstance} exposes a RichText control, target it as ${escapeValue('parent=\"embed1/$control__body\"')} and edit its ${textBlock}/${textRun} children like any other rich text target.`,\n\t\t],\n\t],\n\t[\n\t\t\"When to use:\",\n\t\t[\n\t\t\t`Use ${textBlock}/${textRun} when you need per-block tags (h1, h2, p), per-run inline styling (different colors, weights), or per-run semantic marks (${traitReference(\"bold\")}, ${traitReference(\"italic\")}).`,\n\t\t\t`Use ${textBlockquote} for quoted passages in rich text. Do not fake blockquotes with ${escapeValue(\">\")} prefixes in a normal ${textBlock}.`,\n\t\t\t`Use ${textTable}/${textTableRow}/${textTableCell} for tabular data. Do not fake tables with pipe characters, tabs, aligned paragraphs, or repeated ${textBlock}s.`,\n\t\t\t`Use ${textBulletList}/${textNumberedList}/${textListItem} for actual lists. Do not fake list structure with paragraph prefixes unless the user specifically wants plain text bullets.`,\n\t\t\t`CMS rich text can include code blocks by embedding the \"Code Block\" component with ${textComponentInstance}.`,\n\t\t\t`For simple single-style text, just use ${commandReference(CommandType.Update)} with ${traitReference(\"text\")} on the ${richTextNode} directly.`,\n\t\t\t`Setting ${traitReference(\"text\")} on the root ${richTextNode} overwrites **all** existing rich text blocks and inline children.`,\n\t\t],\n\t],\n\t[\n\t\t\"Text and variable bindings:\",\n\t\t[\n\t\t\t`On ${textRun} and ${textBlock}, ${traitReference(\"text\")} is literal text only. Do not use ${escapeValue(\"var(--variable-<id>)\")} on virtual nodes \u2014 set ${traitReference(\"text\")} on the owning ${richTextNode} to bind a variable.`,\n\t\t\t`When a ${richTextNode} is bound to a ${escapeValue(\"ControlType.RichText\")} variable, it will not expose editable ${textBlock}/${textRun} children. Do not create, update, or style individual blocks/runs on the bound node.`,\n\t\t\t`If you need to change the actual content of bound rich text, update the source instead: edit the bound variable's rich text content/${escapeValue(\"initialValue\")} or the caller-owned ${escapeValue(\"$control__*\")} RichText value, rather than editing blocks/runs on the bound node.`,\n\t\t\t`To clear text, use ${escapeValue('text=\"\"')}. ${escapeValue('text=\"null\"')} applies the literal word \"null\" (not empty).`,\n\t\t\t`After replacing all text on the root ${richTextNode} via ${traitReference(\"text\")}, do not continue editing old ${escapeValue(\"v:\")} ids from prior context in the same command sequence without re-reading the node.`,\n\t\t],\n\t],\n\t[\n\t\t\"Multi-paragraph text:\",\n\t\t[\n\t\t\t`For structured multi-line content, use separate ${textBlock} elements for each line.`,\n\t\t\t`Keep continuous copy in a single ${richTextNode}; don't split content into multiple text nodes just to force wrapping.`,\n\t\t\t`Use separate ${textBlock}s when you need distinct semantic blocks (e.g. heading + paragraph). Use ${textBulletList}/${textNumberedList} for lists instead of one ${textBlock} per item.`,\n\t\t],\n\t],\n\t[\n\t\t`${textLineBreak} usage, hard break vs. empty paragraph:`,\n\t\t[\n\t\t\t`Never emit literal ${escapeValue(\"\\\\n\")} on the canvas; use ${textRun} + ${textLineBreak} nodes instead.`,\n\t\t\t`**Hard break:** Adding a ${textLineBreak} between ${textRun}s in the same ${textBlock} inserts an inline line break within that paragraph. Use for line breaks inside a single paragraph of prose.`,\n\t\t\t`**Empty paragraph:** A ${textBlock} whose only child is a ${textLineBreak} (no ${textRun}s) produces an empty paragraph. Insert one between content ${textBlock}s to add visible vertical whitespace between paragraphs. When writing multiple paragraphs, always add an empty ${textBlock} with a ${textLineBreak} between them so they don't appear visually merged.`,\n\t\t],\n\t],\n\t[\n\t\t\"Editing RichText control props:\",\n\t\t[\n\t\t\t`When a ${escapeValue(\"$control__*\")} prop contains hydrated rich text children (virtual nodes with ${escapeValue(\"v:\")} prefixed IDs), prefer updating those virtual nodes directly rather than setting the ${escapeValue(\"$control__*\")} attribute.`,\n\t\t\t`Example: if context shows ${escapeValue(\"$control__content\")} with a ${textRun} ${escapeValue(\"v:nodeId/controlKey:0:0\")} containing ${escapeValue('text=\"hello\"')}, change it with ${escapeValue('SET v:nodeId/controlKey:0:0 text=\"bye\"')}.`,\n\t\t\t`To add new root rich text blocks to a RichText control prop, use ${escapeValue(\"parent\")} with the target format ${escapeValue(\"<nodeId>/<controlKey>\")} (e.g. ${escapeValue('+TextBlock tb1 parent=\"nodeId/controlKey\"')}). Use a parent ${textListItem}, ${textBlockquote}, or ${textTableCell} id when inserting blocks inside them.`,\n\t\t\t`To replace the full text content of a RichText control prop, you can set ${escapeValue('$control__*=\"Hello\"')} with plain text directly. Only use this when replacing all text content \u2014 otherwise prefer targeting individual virtual rich text nodes.`,\n\t\t],\n\t],\n\t[\n\t\t\"Component presets for rich text embeds:\",\n\t\t[\n\t\t\t`Always put ${keyValueReference(\"component\", \"<component name>\")} directly on the ${escapeValue(CommandType.Add)} ${textComponentInstance} command; ${keyValueReference(\"component\", \"<component name>\")} is an add-only attribute and cannot be fixed later with ${commandReference(CommandType.Update)}.`,\n\t\t\t`Do not set ${traitReference(\"componentPreset.<name>\")} on a ${textComponentInstance}. It supports direct ${escapeValue(\"$control__*\")} values only.`,\n\t\t\t`For ${textComponentInstance} controls marked ${escapeValue(\"onlyPresets\")} in ${escapeValue(metadataTags.componentDefinition)}, create or update a ${escapeValue(ClassDiscriminator.ComponentPresetNode)}, then assign it with ${traitReference(\"componentPreset.<name>\")} on the owning ${richTextNode} whose content is bound to the CMS rich text field.`,\n\t\t\t`For ${textComponentInstance} controls that are not marked ${escapeValue(\"onlyPresets\")}, set them directly on the embed with ${escapeValue(\"$control__*\")}.`,\n\t\t],\n\t],\n\t[\n\t\t\"Inline edits to existing text:\",\n\t\t[\n\t\t\t`When changing style for only part of a sentence (for example one word), do it in one pass: update the existing ${textRun} text to the prefix, insert a dedicated target ${textRun} for the styled fragment, then add a trailing ${textRun} for the suffix.`,\n\t\t\t`Preserve run order and surrounding content exactly. Do not reorder text runs or repeatedly patch the same sentence in loops.`,\n\t\t\t`For inline color emphasis, set ${traitReference(\"textColor\")} only on the target ${textRun} unless the user asks for broader changes.`,\n\t\t\t`For semantic bold or italic emphasis, set ${traitReference(\"bold\")} or ${traitReference(\"italic\")} on the target ${textRun}. Use ${traitReference(\"fontWeight\")} or ${traitReference(\"fontStyle\")} only when the user needs exact typography on style-capable canvas text.`,\n\t\t],\n\t],\n\t[\n\t\t\"Style inheritance:\",\n\t\t[\n\t\t\t`The default text color is black.`,\n\t\t\t`Rich text styles cascade from the closest ancestor: ${textBlock}s, ${textBulletList}s, ${textNumberedList}s, ${textListItem}s, and ${textRun}s inherit font, color, size, and other text style attributes from their parent unless the child explicitly sets that attribute.`,\n\t\t\t`When you ${commandReference(CommandType.Update)} a style attribute on a parent rich text node, the same attribute is cleared from all descendants so they inherit the new parent value. If only part of the content should change, split the relevant ${textBlock}/${textRun} first and set the style on that child instead.`,\n\t\t\t`When you ${commandReference(CommandType.Update)} a style attribute on the root ${richTextNode}, the value applies to the entire document and that attribute is cleared from every child. Use root styling only for whole-document changes.`,\n\t\t\t`Block-level styles (${traitReference(\"textAlignment\")}, ${traitReference(\"lineHeight\")}) are automatically inherited from the parent ${richTextNode}. Override on individual blocks or list containers only when they need different values.`,\n\t\t],\n\t],\n\t[\n\t\t\"Text style presets:\",\n\t\t[\n\t\t\t`Use ${traitReference(\"textStylePreset\")} with the preset name to apply a text style preset to static text and text bound to a ${escapeValue(\"ControlType.String\")} variable. Preset ids are also accepted.`,\n\t\t\t`On a ${richTextNode} with a rich text variable binding, do not use ${traitReference(\"textStylePreset\")} or root inline text style attributes. Use per-tag presets (${traitReference(\"stylePresetHeading1\")}, ${traitReference(\"stylePresetParagraph\")}, etc.) instead. Per-tag presets accept a preset name or id and assign different presets to different block tags (h1, p, etc.) within the same ${richTextNode}.`,\n\t\t\t`When detaching/removing a ${traitReference(\"textStylePreset\")} from a ${richTextNode} with ${traitValueReference(\"textStylePreset\", nullString)}, the ${traitReference(\"textStylePreset\")} style attributes are automatically inlined into the ${richTextNode}, preserving its visual appearance (pre-existing inline style attributes win).`,\n\t\t],\n\t],\n\t[\n\t\t\"Text style preset breakpoints:\",\n\t\t[\n\t\t\t`Text style presets support responsive breakpoints via ${keyValueReference(\"breakpoint.<label>.<property>\", \"value\")}. ${escapeValue(defaultBreakpointLabel)} is always the base/desktop style.`,\n\t\t\t`Replica labels depend on count: ${[1, 2, 3, 4].map(n => `${n} \u2192 ${replicaLabelsForCount(n).map(escapeValue).join(\", \")}`).join(\"; \")}. Create slots in this order.`,\n\t\t\t`Properties available per breakpoint slot: ${breakpointSlotProperties.map(escapeValue).join(\", \")}.`,\n\t\t\t`The narrowest slot's ${traitReference(\"minWidth\")} is always ${escapeValue(\"0px\")}; do not set ${traitReference(\"minWidth\")} on the narrowest slot.`,\n\t\t\t`Narrower slots inherit values from ${escapeValue(defaultBreakpointLabel)} unless explicitly overridden. Only set properties that should differ from the base style.`,\n\t\t\t`Setting style attributes in a non-existent breakpoint label creates one new breakpoint slot. The ${escapeValue(defaultBreakpointLabel)} slot always exists and cannot be deleted.`,\n\t\t\t`To remove a breakpoint: ${keyValueReference(\"breakpoint.<label>\", '\"null\"')}. The ${escapeValue(defaultBreakpointLabel)} slot cannot be removed.`,\n\t\t\t`Maximum ${breakpointLabels.length} breakpoints total (${escapeValue(defaultBreakpointLabel)} + ${breakpointLabels.length - 1} breakpoint replicas).`,\n\t\t\t`Multiple breakpoint style updates and additions can be combined in one ${commandReference(CommandType.Update)}. Exceptions: the ${escapeValue(\"large\")} slot must be added in its own ${commandReference(CommandType.Update)} (triggers label relabeling), and each removal must be its own ${commandReference(CommandType.Update)} (because it shifts labels). When mixing operation types, apply updates first, then removals, then additions.`,\n\t\t],\n\t],\n\t[\n\t\t`${escapeValue(TextMediaBlockClass)} nodes:`,\n\t\t[\n\t\t\t`A ${escapeValue(TextMediaBlockClass)} represents an image block inside rich text.`,\n\t\t\t`Use ${escapeValue(TextMediaBlockClass)} only on CMS-backed collection item rich text fields. Do not use it on plain canvas ${richTextNode}s, or Component Rich Text controls.`,\n\t\t\t`${escapeValue(TextMediaBlockClass)} is a block node like ${textBlock}. Do not add ${textRun} or ${textLineBreak} children under it. It can appear at the root or inside ${textListItem}, ${textBlockquote}, or ${textTableCell}.`,\n\t\t],\n\t],\n\t[\n\t\t`${escapeValue(TextUnsupportedBlockClass)} nodes:`,\n\t\t[\n\t\t\t`An ${escapeValue(TextUnsupportedBlockClass)} represents rich text content that cannot be edited yet (for example unsupported nested content).`,\n\t\t\t`You can only ${commandReference(CommandType.Remove)} or ${commandReference(CommandType.Move)} an ${escapeValue(TextUnsupportedBlockClass)}. Do not attempt to ${commandReference(CommandType.Update)} its attributes or rewrite its content.`,\n\t\t],\n\t],\n]\n\n// ---------------------------------------------------------------------------\n// Width Rules \u2014 role-based width assignment patterns\n// ---------------------------------------------------------------------------\n\nexport const widthRules: NestedStringArray = [\n\t[\n\t\t\"**Centered content wrapper inside a section**\",\n\t\t[\n\t\t\t\"Use **either**:\",\n\t\t\t[\n\t\t\t\t`${traitValueReference(\"width\", \"100%\")} (most common)`,\n\t\t\t\t`measured width like ${traitValueReference(\"width\", \"1080px\")} **only when the reference clearly shows a narrower column**.`,\n\t\t\t],\n\t\t],\n\t\t`Center via parent: ${traitValueReference(\"stackAlignment\", \"center\")}.`,\n\t],\n\t// [\n\t//     `**Icon + text feature rows** (icon left, text right filling remaining space)`,\n\t//     [\n\t//         `Parent: ${traitValueReference(\"width\", \"100%\")}`,\n\t//         `Icon: ${traitValueReference(\"width\", \"auto\")}`,\n\t//         `Text: ${traitValueReference(\"width\", \"1fr\")}`,\n\t//         `This is the **only** pattern where a child uses ${traitValueReference(\"width\", \"1fr\")} inside a stack.`,\n\t//     ],\n\t// ],\n\t[\n\t\t\"**Text blocks (headings, paragraphs, descriptions)**\",\n\t\t[\n\t\t\t`Multi-line headings, body copy, and descriptions that should align/wrap to a known column container (cards/sections/wrappers with padding/border/fill) \u2192 ${traitValueReference(\"width\", \"100%\")} or ${traitValueReference(\"width\", \"1fr\")} (inside grids)`,\n\t\t\t`If you're just inserting new text nodes without clear layout context \u2192 omit ${traitReference(\"width\")} (let it auto-size), then set ${traitValueReference(\"width\", \"100%\")} once the container structure is established`,\n\t\t\t`Short, single-line UI labels (nav links, tags, button labels, pills) \u2192 ${traitValueReference(\"width\", \"auto\")}`,\n\t\t\t`**Never give multi-word text a narrow fixed width** that would cause one-character-per-line wrapping.`,\n\t\t\t`**Do not use ${traitValueReference(\"width\", \"auto\")} on multi-line text blocks.**`,\n\t\t],\n\t],\n\t// [\n\t//     \"**Images in cards**\",\n\t//     [\n\t//         `Frame: ${traitValueReference(\"width\", \"100%\")} and ${traitValueReference(\"aspectRatio\", \"1.77\")} **or** a measured ${traitReference(\"height\")} (e.g. ${traitValueReference(\"height\", \"200px\")}).`,\n\t//         `**Never use ${traitValueReference(\"width\", \"auto\")} or ${traitValueReference(\"height\", \"0px\")} for card images.**`,\n\t//     ],\n\t// ],\n]\n\n// ---------------------------------------------------------------------------\n// Recipe \u2014 DSL layout implementation patterns\n// ---------------------------------------------------------------------------\n\nexport const buildRecipe = (source: Source): NestedStringArray => [\n\t// `1. **Define all reusable styles first:** Scan the reference for repeating patterns (cards, buttons, typography, icon chips) that appear 3+ times, and emit the necessary \\`=style\\` entries before any nodes. For variant overrides, prefer direct inline attributes for one-off or two-off changes (e.g., \\`~liked[icon] ctrl[P_DcoRcrY] #FF0000\\`), but create styles if the same override pattern repeats across many nodes or variants. When updating component instance controls (not overrides), always use the attribute syntax: \\`~instanceId ctrl[<variable-id>] value\\`.`,\n\t`Stacks and grids defaults to no ${traitReference(\"gap\")}, explicitly set ${traitReference(\"gap\")} when spacing is visible.`,\n\t`${traitReference(\"top\")}, ${traitReference(\"bottom\")}, ${traitReference(\"left\")}, ${traitReference(\"right\")} can be set to ${escapeValue(nullString)} to \"unset\" the pin. It is critical to unset pins as per examples.`,\n\t`When increasing or decreasing padding on layout children, always switch to ${traitValueReference(\"height\", \"auto\")} unless the element must maintain a specific fixed height. This allows content + padding to determine the natural size.`,\n\t`When using ${traitReference(\"gridColumnCount\")}, children (cards/items) must use ${traitValueReference(\"width\", \"100%\")} (not ${traitValueReference(\"width\", \"1fr\")}).`,\n\t[\n\t\t`${traitValueReference(\"layout\", \"grid\")}`,\n\t\t[\n\t\t\t`${traitValueReference(\"gridColumnWidth\", \"200px\")} creates equal-width columns in a rigid grid that will not shrink below the specified width. Use for uniform card grids where all items must be exactly the same width and the column count is intentionally fixed.`,\n\t\t\t`${traitValueReference(\"gridColumnMinWidth\", \"50px\")} creates flexible columns with a minimum width (e.g., ${traitValueReference(\"gridColumnMinWidth\", \"250px\")}). Use for responsive content grids where items should adapt to viewport width\u2014like plugin lists, feature grids, product catalogs, or any grid that should naturally wrap from 4 columns \u2192 3 \u2192 2 \u2192 1 based on available space. Also use for organic, asymmetric layouts like template galleries or Pinterest-style grids where visual variety is desired.`,\n\t\t\t`Prefer ${traitReference(\"gridColumnMinWidth\")} over ${traitReference(\"gridColumnWidth\")} for most content grids to enable natural responsiveness.`,\n\t\t],\n\t],\n\t[\n\t\t`${traitReference(\"gridRowHeightType\")}`,\n\t\t[\n\t\t\t`${traitValueReference(\"gridRowHeightType\", \"fit\")} (default) \u2014 rows size to their content. Use this for most grids.`,\n\t\t\t`${traitValueReference(\"gridRowHeightType\", \"fixed\")} \u2014 rows use explicit pixel height from ${traitReference(\"gridRowHeight\")}. Use when all rows must be exactly the same height.`,\n\t\t\t`${traitValueReference(\"gridRowHeightType\", \"auto\")} \u2014 rows expand to fill available vertical space when the grid is resized. **Only valid when the grid has an explicit height (e.g., ${traitValueReference(\"height\", \"400px\")} or ${traitValueReference(\"height\", \"1fr\")}).** Never use ${traitValueReference(\"gridRowHeightType\", \"auto\")} when the grid has ${traitValueReference(\"height\", \"auto\")} \u2014 the grid needs a fixed height constraint for rows to expand into.`,\n\t\t],\n\t],\n\t`Grid decision rule: use ${traitValueReference(\"layout\", \"stack\")} with ${traitValueReference(\"stackDirection\", \"horizontal\")} for one-row card groups that do not need wrapping; use ${traitValueReference(\"layout\", \"grid\")} when items should wrap, span multiple rows, or reflow responsively.`,\n\t`For most content grids, keep ${traitValueReference(\"gridRowHeightType\", \"fit\")}, keep ${traitReference(\"gridColumnMinWidth\")} modest (around ${traitValueReference(\"gridColumnMinWidth\", \"50px\")}), and avoid grid-item height fill unless the grid has a clear height or row constraint.`,\n\t`Use nested grids only for genuinely asymmetric multi-row layouts that a single grid or stack cannot express cleanly.`,\n\t`Control compact elements with ${traitValueReference(\"width\", \"fit-content\")} to avoid unintended stretching.`,\n\t`Minimum button padding: horizontal ${escapeValue(\"16px\u201324px\")}, vertical ${escapeValue(\"4px\u201312px\")}. Card padding: ${escapeValue(\"8px\u201316px\")} all around.`,\n\t`Any wrapper that combines multiple dynamic text fragments (price + cadence, amount + currency, stat + unit) must immediately assert ${traitValueReference(\"layout\", \"stack\")} with the correct ${traitReference(\"stackDirection\")} so the tokens stay aligned; never leave these frames in implicit layout.`,\n\t`When a horizontal stack uses ${traitValueReference(\"stackDistribution\", \"space-between\")} to separate elements (e.g., title on left, badge on right), both children must use ${traitValueReference(\"width\", \"fit-content\")}. Never set ${traitValueReference(\"width\", \"100%\")} on a child in a ${traitReference(\"stackDistribution\")} layout because it will consume all available space and push siblings out of view. Example: title + badge rows should have both elements at ${traitValueReference(\"width\", \"fit-content\")}.`,\n\t`When building horizontal stacks with an icon + text (like feature lists, settings rows, menu items), the wrapper frame needs ${traitValueReference(\"width\", \"100%\")} to fill its parent, and the text needs ${traitValueReference(\"width\", \"1fr\")} to fill remaining space after the fixed-width icon. This differs from buttons where both wrapper and text use ${traitValueReference(\"width\", \"fit-content\")} for compact sizing. Rule: if the text should stretch to fill available space, the wrapper needs ${traitValueReference(\"width\", \"100%\")} (or ${traitValueReference(\"width\", \"1fr\")} in grids) and text uses ${traitValueReference(\"width\", \"1fr\")}; if everything should stay compact (buttons, badges), both wrapper and text use ${traitValueReference(\"width\", \"fit-content\")}.`,\n\t`For single-row card groups, use an explicit ${traitReference(\"gap\")}, consistent widths, and consistent ${traitReference(\"height\")} values or ${traitReference(\"aspectRatio\")} values so cards align in height. If the reference shows horizontal margins around the group, add ${traitValueReference(\"paddingLeft\", \"number\")} and ${traitValueReference(\"paddingRight\", \"number\")} to the container.`,\n\t`Build toggles, segmented controls, and pill switches as real UI: create a rounded track frame plus a separate thumb frame, then use ${traitReference(\"stackDistribution\")} and padding adjustments instead of text-only placeholders so the thumb lands exactly where the design shows it.`,\n\t`For card titles or list items that should truncate with ellipsis, use ${traitReference(\"textTruncation\")} on the text node. This will automatically apply ${traitValueReference(\"overflow\", \"clip\")}.`,\n\t`When creating a ${commandReference(CommandType.Add, ClassDiscriminator.ColorStyleTokenNode)}, ${commandReference(CommandType.Add, ClassDiscriminator.TextStylePresetNode)}, ${commandReference(CommandType.Add, ClassDiscriminator.LinkStylePresetNode)}, ${commandReference(CommandType.Add, ClassDiscriminator.InlineCodeStylePresetNode)}, or ${commandReference(CommandType.Add, ClassDiscriminator.ImageStylePresetNode)}, do **not** place it in top-level \"Typography\" or \"Colors\" folders, as these nodes will already be inserted in the appropriate root folders.`,\n\t`You may organize them further by placing them in subfolders under \"Accent\" or \"Colors\".`,\n\t[\n\t\t`**Color decision rule:**`,\n\t\t[\n\t\t\t`Color style tokens are theme-aware: ${escapeValue(\"ColorStyleTokenNode\")} automatically uses ${traitReference(\"light\")} in light mode and ${traitReference(\"dark\")} in dark mode. If ${traitReference(\"dark\")} is omitted, dark mode falls back to ${traitReference(\"light\")}.`,\n\t\t\t`When the user asks to support dark theme, dark mode, or both light and dark appearances, prefer updating or creating shared ${escapeValue(\"ColorStyleTokenNode\")} values and referencing those tokens via traits instead of hardcoding many separate per-node colors.`,\n\t\t\t`Preserve existing fill values from context: if a node has ${traitValueReference(\"fill\", \"null\")}, it is intentionally transparent and inherits visual appearance from its parent\u2014do NOT change it to white or any other color unless explicitly requested.`,\n\t\t\t`Only set ${traitReference(\"fill\")} on nodes that need their own distinct background (thematic containers like headers, heroes, cards with visible backgrounds). Transparent containers (layout wrappers, structural frames) should keep ${traitValueReference(\"fill\", \"null\")}.`,\n\t\t\t`When creating new nodes, check the parent's fill first\u2014if the parent already provides the appropriate background.`,\n\t\t\t`For text and icon colors, determine contrast against the **effective background**\u2014trace up the ancestor chain to find the nearest node with an actual fill color. If a parent has a dark fill, use light text/icon colors; if a parent has a light fill, use dark text/icon colors.`,\n\t\t],\n\t],\n\t[\n\t\t\"**Typography calibration:**\",\n\t\t[\n\t\t\t`**Additional fonts:** ${forSource(source, {\n\t\t\t\t\"in-app\": `If a ${escapeValue(\"tool\")} message is present that contains a ${escapeValue(FONT_SEARCH_QUERY)} result`,\n\t\t\t\tlocal: `If a prior ${escapeValue(\"readProjectForAgent\")} call has returned a ${escapeValue(FONT_SEARCH_QUERY)} result in this session`,\n\t\t\t})}, treat the result font families as allowed (same as ${escapeValue(`<${metadataTags.availableFonts}>`)}).`,\n\t\t\t`**Font selection:** Use fonts from ${escapeValue(`<${metadataTags.availableFonts}>`)}. If the user requests a specific font by name (e.g., \"use Roboto\", \"with Montserrat\") that is NOT in ${escapeValue(`<${metadataTags.availableFonts}>`)}, you MUST call ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `${escapeValue(READ_PROJECT_TOOL_NAME)} with arguments ${escapeValue(JSON.stringify({ queries: [{ type: FONT_SEARCH_QUERY, name: \"<font-name>\" }] }))}`,\n\t\t\t\t\tlocal: escapeValue(\n\t\t\t\t\t\t`readProjectForAgent(${JSON.stringify([{ type: FONT_SEARCH_QUERY, name: \"<font-name>\" }])}, { pagePath })`,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t)} to request it BEFORE creating text nodes.`,\n\t\t\t`**Style-driven font search (takes priority):** When the design has a theme, aesthetic, or the user describes any typography style, ALWAYS call ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `${escapeValue(READ_PROJECT_TOOL_NAME)} with arguments ${escapeValue(JSON.stringify({ queries: [{ type: FONT_SEARCH_QUERY, query: \"<query>\", limit: \"<number>\" }] }))}`,\n\t\t\t\t\tlocal: escapeValue(\n\t\t\t\t\t\t`readProjectForAgent(${JSON.stringify([{ type: FONT_SEARCH_QUERY, query: \"<query>\", limit: \"<number>\" }])}, { pagePath })`,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t)} BEFORE creating text nodes.`,\n\t\t\t`**Reuse existing fonts:** Skip font search only when there is no typography intent, or you already searched earlier in the conversation and the style still fits.`,\n\t\t\t`Match italic usage to families that support it. The ${escapeValue(`<${metadataTags.availableFonts}>`)} metadata tag specifies which families support italic styles or ${escapeValue(\"slnt\")} variation axis and which don't. If the reference shows italics and the current family lacks that style, switch to a permitted italic family instead of fabricating the style.`,\n\t\t\t`Set ${traitReference(\"fontName\")} whenever the reference uses a family other than the default body choice. Pair ${traitReference(\"fontName\")} with valid ${traitReference(\"fontWeight\")}/${traitReference(\"fontStyle\")} values so the combination respects the allowed weights and styles for that family.`,\n\t\t\t`Always include ${traitReference(\"fontWeight\")} whenever you declare a style or override typography.`,\n\t\t\t`Split styles when the same text treatment appears with different weights.`,\n\t\t\t`Promote hero headlines, CTA labels, and emphasis text to heavier values (usually ${traitValueReference(\"fontWeight\", \"600-800\")}).`,\n\t\t\t`Keep supporting copy around ${traitValueReference(\"fontWeight\", \"400\")}, only dipping lower when the reference clearly shows a lighter weight.`,\n\t\t\t`If ${traitReference(\"fontVariationAxes\")} is enabled, use ${escapeValue(\"wght\")} to set the weight if available.`,\n\t\t\t`If ${traitReference(\"fontVariationAxes\")} is not enabled and the requested weight is not in the list of supported ${escapeValue(\"weights\")}, then use ${escapeValue(\"wght\")}.`,\n\t\t\t`If the font does not support the requested weight (either in ${traitReference(\"fontWeight\")} or ${traitReference(\"fontVariationAxes\")}), then do nothing.`,\n\t\t\t`Only use ${traitReference(\"openTypeFontFeatures\")} when the font lists ${escapeValue(\"openTypeFeatures\")} in ${escapeValue(`<${metadataTags.availableFonts}>`)}. Use only tags from the listed features.`,\n\t\t\t`${keyValueReference(\"openTypeFontFeatures.<tag>\", \"on\")} enables a feature, ${keyValueReference(\"openTypeFontFeatures.<tag>\", \"off\")} disables it. Some features (${escapeValue(\"liga\")}, ${escapeValue(\"calt\")}, ${escapeValue(\"kern\")}) are on by default in all fonts, use ${escapeValue(\"off\")} only to explicitly disable them.`,\n\t\t\t`Only set ${traitReference(\"openTypeFontFeatures\")} when the user explicitly requests typographic effects (e.g. ligatures, small caps, stylistic sets).`,\n\t\t],\n\t],\n]\n\nexport function buildLayoutRules(source: Source) {\n\treturn Markdown.section(\n\t\t\"Layout Recipe\",\n\t\tformatNestedArray(buildRecipe(source)),\n\t\tMarkdown.section(\n\t\t\tAgentSystemPromptDictionary.WidthRules,\n\t\t\t\"**Treat every node as ONE of these roles, and apply width exactly as specified:**\",\n\t\t\tformatNestedArray(widthRules),\n\t\t\tMarkdown.section(\n\t\t\t\t`Semantic rule for ${traitValueReference(\"width\", \"auto\")}`,\n\t\t\t\t`Treat ${traitValueReference(\"width\", \"auto\")} as \"**shrink to just wrap the children**\".`,\n\t\t\t\t`- Use it only for **compact, inline-feeling UI** (buttons, badges, labels, icon chips, nav links, tags).`,\n\t\t\t\t`- **If in doubt between ${traitValueReference(\"width\", \"auto\")} and ${traitValueReference(\"width\", \"100%\")}: use ${traitValueReference(\"width\", \"100%\")}.**`,\n\t\t\t),\n\t\t),\n\t)\n}\n", "import { frameEventKeys, isLegacyFrameEventKey } from \"document/models/CanvasTree/traits/WithFrameEvents.ts\"\nimport { HardCodedCodeIdentifier } from \"document/models/CanvasTree/traits/utils/hardCodedCodeComponentIdentifiers.ts\"\nimport { join } from \"utils/join.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { ComponentInstanceNodeClass, ComponentNodeClass, EventHandlerControlName } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { formatActionDefinitions } from \"../traits/frameEvents.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { scriptReference } from \"./promptEnv.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\n/** Event menu labels and the frame handler keys they refer to (keep pairs in sync). */\nconst eventMenuLabelByFrameKey = [\n\t{ frameKey: \"onTap\", menuLabel: \"Click\" },\n\t{ frameKey: \"onTapStart\", menuLabel: \"Click Start\" },\n\t{ frameKey: \"onAppear\", menuLabel: \"Appear\" },\n\t{ frameKey: \"onMouseEnter\", menuLabel: \"Mouse Enter\" },\n\t{ frameKey: \"onMouseLeave\", menuLabel: \"Mouse Leave\" },\n] as const\n\nconst eventMenuMappingPhrase = eventMenuLabelByFrameKey\n\t.map(({ menuLabel, frameKey }) => `${escapeValue(menuLabel)} \u2192 ${escapeValue(frameKey)}`)\n\t.join(\", \")\n\nexport const eventHandlers = (source: Source) =>\n\tMarkdown.section(\n\t\t\"Event Handlers and Actions\",\n\t\t`- When creating/modifying an event handler (${escapeValue(\"<event-handler>\")}), use one of the following options: ${frameEventKeys\n\t\t\t.filter(key => !isLegacyFrameEventKey(key))\n\t\t\t.map(key => `\"${key}\"`)\n\t\t\t.join(\", \")}.`,\n\t\t`- Remove an action by setting to \"null\": ${escapeValue(`<event-handler>.<i>=\"null\"`)}.`,\n\t\t`- When switching a trigger from one event handler to another, remove only the specific action slots you are replacing (for example ${escapeValue('onTap.0=\"null\"')}) before writing the new handler. Use ${escapeValue('onTap=\"null\"')} only for clearing the entire handler object.`,\n\t\t`- Attach frame event handlers only to supported nodes such as ${escapeValue(ClassDiscriminator.FrameNode)} and ${escapeValue(ClassDiscriminator.RichTextNode)}. If a node does not support frame event handlers, wrap it in a ${escapeValue(ClassDiscriminator.FrameNode)} and attach handlers on the wrapped frame instead.`,\n\t\tMarkdown.section(\n\t\t\t\"Component Event Handlers\",\n\t\t\t`- ${escapeValue(ComponentInstanceNodeClass)} also supports event-handler actions for exposed ${escapeValue(EventHandlerControlName)} controls. Read the ${escapeValue(`\"component-definition\"`)} first to see whether the component already exposes one and what its ${escapeValue(\"eventKey\")} is. If it does, use that exposed handler name directly on the instance, for example ${escapeValue('onClick.0.action=\"SHOW_OVERLAY\" onClick.0.controls.overlay=\"menu\"')}.`,\n\t\t\t`- If a user asks to add a new interaction to a local project ${escapeValue(ComponentInstanceNodeClass)} and ${escapeValue(`\"component-definition\"`)} does not already expose a suitable ${escapeValue(EventHandlerControlName)} control, retrieve the node with ${scriptReference(source)} so the local ${escapeValue(ComponentNodeClass)} is in context, add ${escapeValue(\"+EventHandlerVariable\")} on the component scope, wire an internal source node to ${escapeValue(\"TRIGGER_EVENT\")}, and then bind the instance action to the newly exposed ${escapeValue(\"eventKey\")}.`,\n\t\t\t`- On a ${escapeValue(ComponentInstanceNodeClass)}, the exposed ${escapeValue(\"eventKey\")} is the component's public API and does not change when the component's internal trigger changes.`,\n\t\t\t`- When the selected node is a ${escapeValue(ComponentInstanceNodeClass)} and the user asks to switch the trigger event, read ${escapeValue(`\"component-definition\"`)} and compare the requested internal frame handler (e.g. ${escapeValue(\"onMouseEnter\")}) to the exposed ${escapeValue(\"eventKey\")} values. If that internal handler is not listed as an exposed key, leave the instance handler name unchanged, retrieve the node with ${scriptReference(source)} for that component, and edit the internal source node that fires ${escapeValue(\"TRIGGER_EVENT\")} instead.`,\n\t\t\t`- If a ${escapeValue(ComponentInstanceNodeClass)} update is rejected because the requested handler is not valid there, do not retry by writing the same frame event to the instance again. Treat that rejection as a cue to update the internal source component trigger and keep or restore the instance action on its existing exposed ${escapeValue(\"eventKey\")}.`,\n\t\t\t`- Event-menu labels map to internal frame handlers as follows: ${eventMenuMappingPhrase}. Do not use an internal frame handler name as the instance ${escapeValue(\"eventKey\")} unless ${escapeValue(`\"component-definition\"`)} exposes that exact key.`,\n\t\t\tMarkdown.section(\n\t\t\t\t\"Overlays on component instances\",\n\t\t\t\t`- If a user says \"show the overlay on hover\", \"trigger on appear\", or similar for a component instance, keep the instance ${escapeValue(\"SHOW_OVERLAY\")} action on the existing exposed ${escapeValue(\"eventKey\")} and move the interaction by editing the internal trigger in the source ${escapeValue(ComponentNodeClass)}.`,\n\t\t\t\t`- When switching how an overlay opens from a component instance: if the overlay currently opens because the source fires ${escapeValue(\"TRIGGER_EVENT\")} from ${escapeValue(\"onTap\")} and the user asks for hover, update the source so the same event still fires but from ${escapeValue(\"onMouseEnter\")} instead. Leave the instance overlay action on the existing exposed ${escapeValue(\"eventKey\")}.`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Overlay Actions\",\n\t\t\tjoin.lines(\n\t\t\t\t`These actions are available on supported nodes and do not require a ${escapeValue(ComponentNodeClass)}.`,\n\t\t\t\t`Use these actions for page-level overlays.`,\n\t\t\t\tformatActionDefinitions([\n\t\t\t\t\tHardCodedCodeIdentifier.showOverlayAction,\n\t\t\t\t\tHardCodedCodeIdentifier.dismissOverlayAction,\n\t\t\t\t]),\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Component Actions\",\n\t\t\tjoin.lines(\n\t\t\t\t`These actions are available only to event handlers on nodes that are descendants of a ${escapeValue(ComponentNodeClass)}.`,\n\t\t\t\t`If a user requests an interaction that changes state, you MUST create a ${escapeValue(ComponentNodeClass)} and a ${escapeValue(ComponentInstanceNodeClass)} and implement the action inside the ${escapeValue(ComponentNodeClass)}.`,\n\t\t\t\t`If an example uses one of these actions, implementations of that example require the creation of a ${escapeValue(ComponentNodeClass)} and a ${escapeValue(ComponentInstanceNodeClass)}.`,\n\t\t\t\tformatActionDefinitions([HardCodedCodeIdentifier.setVariantAction, HardCodedCodeIdentifier.triggerEventAction]),\n\t\t\t),\n\t\t),\n\t)\n", "import { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { ComponentNodeClass, FixedOverlayNodeClass, RelativeOverlayNodeClass, ShowOverlayActionName } from \"../dsl.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { escapeValue, traitReference, traitValueReference } from \"./utils.ts\"\n\nexport const overlayRules = Markdown.section(\n\t\"Overlays\",\n\t`- For page-level modal or overlay layers, create a ${escapeValue(FixedOverlayNodeClass)} instead of a ${traitValueReference(\"position\", \"fixed\")} ${escapeValue(ClassDiscriminator.FrameNode)}.`,\n\t`- For dropdowns, popovers, menus, and tooltips, create a ${escapeValue(RelativeOverlayNodeClass)} and configure ${traitReference(\"floatingPlacement\")} and ${traitReference(\"floatingAlignment\")} as needed.`,\n\t`- ${escapeValue(FixedOverlayNodeClass)} nodes are only inserted when a ${escapeValue(ShowOverlayActionName)} action references them.`,\n\t`- When you add a fixed overlay for a trigger, parent the overlay to that trigger and wire a ${escapeValue(ShowOverlayActionName)} action in the same response.`,\n\t`- Parent ${escapeValue(RelativeOverlayNodeClass)} to the trigger node that opens it.`,\n\t`- All direct children of a ${escapeValue(FixedOverlayNodeClass)} will be absolutely positioned.`,\n\t`- Configure dimming and dismissal with ${traitReference(\"backdrop\")} attributes.`,\n\t`- ${escapeValue(FixedOverlayNodeClass)} is not supported inside ${escapeValue(ComponentNodeClass)}.`,\n)\n", "import { breakpointVariantDefaults } from \"document/components/utils/breakpointVariantDefaults.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { serializeVirtualMetadata } from \"../context/nodes.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { READ_PROJECT_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { forSource, scriptReference, toolReference } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { attributeReference, escapeValue, keyValueReference } from \"./utils.ts\"\n\nconst primaryReplicaRules = (source: Source) => [\n\t`- Nodes with ${serializeVirtualMetadata(\"$isPrimary\", true)} are \"Primary Variants\", all descendants of Primary Variants are \"Primary Variant Descendants\".`,\n\t`- Nodes with ${serializeVirtualMetadata(\"$isReplica\", true)} are \"Replica Variants\", all descendants of Replica Variants are \"Replica Variant Descendants\".`,\n\t`- A Replica Variant replicates the entire Primary Variant.`,\n\t\"- Changes made to the Primary Variant will automatically be inherited by the Replica Variant, including all descendants.\",\n\t`- The Primary Variant that a specific Replica Variant is based on is pointed to by the ${escapeValue(\"$originalId\")} attribute.`,\n\t`- If a Replica Variant has ${serializeVirtualMetadata(\"$gesture\")} set, ${escapeValue(\"$inheritsFrom\")} points to the variant it inherits overrides from, and those inheritance links can chain across 1 more level, working just like normal inheritance.`,\n\t`- Replica Variant attributes can be overridden from their value in the Primary Variant by setting the attribute on the Replica Variant or Replica Variant Descendant.`,\n\t`- ${escapeValue(ClassDiscriminator.WebPageNode)}, ${escapeValue(ClassDiscriminator.LayoutTemplateNode)}, and ${escapeValue(\"ComponentNode\")} can contain both Primary and Replica Variants.`,\n\t`- In a ${escapeValue(ClassDiscriminator.WebPageNode)} Primary and Replica Variants determine the \"Breakpoints\" of the page.`,\n\t`- In a ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} Primary and Replica Variants determine the \"Breakpoints\" of the layout template.`,\n\t`- In a ${escapeValue(\"ComponentNode\")} Primary and Replica Variants determine the visual \"Variants\" of the component.`,\n\t`- When asked to modify an element in a different Breakpoint/Visual Variant (e.g. \"tablet\", \"mobile\", \"desktop\", etc.), analyze the selection:`,\n\tforSource(source, {\n\t\t\"in-app\": `If the needed variant isn't present in the ${escapeValue(metadataTags.selectedNodes)}, lookup the precise Breakpoint/Variant (use ${scriptReference(source)}).`,\n\t\tlocal: `Look up the precise Breakpoint/Variant via ${scriptReference(source, `getNodeForAgent({ id: \"<replica-node-id>\" }, { pagePath })`)} when needed.`,\n\t}),\n\t`Use the ${escapeValue(\"$variants\")} or ${escapeValue(\"$breakpoints\")} property on any ${escapeValue(ClassDiscriminator.WebPageNode)}, ${escapeValue(ClassDiscriminator.LayoutTemplateNode)}, or ${escapeValue(\"ComponentNode\")} to determine which Breakpoints/Visual Variants are present.`,\n\t`- Use ${toolReference(source, READ_PROJECT_TOOL_NAME)} to query the scope node of the selection you need to read Breakpoints/Variants of.`,\n\t`- Since you don't need the descendants, always use ${escapeValue('\"descendants\": false')} when querying the scope node to determine the variants.`,\n\t`Then determine which node in the required Breakpoint/Visual Variant to modify.`,\n\t`- Nodes deleted from the Primary Variant are deleted from all Replica Variants.`,\n\t`- Nodes added to a Primary Variant automatically become visible in all Replica Variants.`,\n\t`- Replica Variant Descendants ${escapeValue(\"id\")} is a \"compound id\", a compound id is formed by combining 2 other ids: ${escapeValue(\"<replica-variant-id><node-in-primary-variant-id>\")}. A node in Replica Variant with id \"abcdef\", that replicates a node in the Primary Variant with id \"vwxyz\", would have a compound id of: \"abcdefvwxyz\"`,\n]\n\nconst illegalReplicaInteractions = [\n\t`- Never ${escapeValue(CommandType.Add)} into a Replica Variant (${serializeVirtualMetadata(\"$isReplica\", true)}), or Replica Variant Descendant. See ${AgentSystemPromptDictionary.EfficientReplicaUse} for more information.`,\n\t`- Never ${escapeValue(CommandType.Remove)}, ${escapeValue(CommandType.Duplicate)}, or ${escapeValue(CommandType.CreateVariant)} a Replica Variant **Descendant** (any node with a \"compound id\").`,\n\t`- Never ${escapeValue(CommandType.Move)} a Replica Variant **Descendant** to a new parent - only reorder it within its current parent.`,\n\t`- Never refer to nodes in a Primary Variant with a \"compound id\".`,\n]\n\nconst creatingReplicaExample = (source: Source) => [\n\t`- When you are creating a ${escapeValue(ClassDiscriminator.WebPageNode)} or ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} with Breakpoints, or a ${escapeValue(\"ComponentNode\")} with Visual Variants, you should always create the Primary Variant first, then create the Replica Variants.`,\n\t`- **Always confirm if Variants/Breakpoints are present before creating them:** use ${scriptReference(source, `getNodeForAgent({ id: \"<scope-node-id>\" }, { pagePath })`)} to query the scope node and check ${escapeValue(\"$variants\")} or ${escapeValue(\"$breakpoints\")}.`,\n\t`- When creating ${escapeValue(ClassDiscriminator.WebPageNode)} or ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} Breakpoints (Variants) from scratch the defaults should be: ${breakpointVariantDefaults.map(bp => `${bp.name} - width: ${bp.width}px`).join(\", \")}.`,\n\t\"\",\n\t`**Steps to create a Replica Variant:**`,\n\t`1. Use ${escapeValue(CommandType.CreateVariant)} to create a new Replica Variant with a new id from an existing variant: ${escapeValue(`${CommandType.CreateVariant} <new-replica-variant-node-id> from=\"<primary-variant-node-id>\";`)}`,\n\t`- To create a gesture variant, set ${escapeValue(\"gesture\")} to ${escapeValue('\"hover\"')} or ${escapeValue('\"pressed\"')}: ${escapeValue(`${CommandType.CreateVariant} <new-gesture-variant-node-id> from=\"<top-level-variant-node-id>\" gesture=\"hover\";`)}`,\n\t`2. Position the new Variant relative to the source Variant, ensuring it doesn't overlap any other nodes:`,\n\t`- For non-gesture variants, position the new Variant to the right of the source Variant in a row: ${escapeValue(`${CommandType.Update} <new-replica-variant-id> left=\"<\\${safe-offset-from-primary-variant-and-other-variants}px>\";`)}`,\n\t`- For gesture variants (${keyValueReference(\"gesture\", \"hover\")} or ${keyValueReference(\"gesture\", \"pressed\")}), position the new Variant below the source Variant and keep it in the same source column (no rightward chaining): ${escapeValue(`${CommandType.Update} <new-replica-variant-id> top=\"<\\${safe-offset-from-primary-variant-and-other-variants}px>\";`)}`,\n\t`- If multiple gesture variants exist for the same source, stack them downward in that same column so each new gesture variant is below the lowest existing gesture variant tied to that source.`,\n\t`- The \"safe-offset\" formula is axis-specific: (source axis offset) + (source axis size) + (gap). For gesture variants use the vertical axis (${escapeValue(\"top + height + gap\")}).`,\n\t`- You may need to reposition other variants to make space for the new Variant. Ensure no overlaps are present by inspecting the ${serializeVirtualMetadata(\"$rect\")} of the Variants.`,\n\t`3. Override the subset of attributes that need to be different in the Replica Variant: ${escapeValue(`${CommandType.Update} <new-replica-variant-id> <attribute-name>=\"<value>\";`)}`,\n\t`4. Then override the subset of attributes that need to be different in Replica Variant Descendants using a \"compound id\": ${escapeValue(`${CommandType.Update} <new-replica-variant-id><original-id> <attribute-name>=\"<value>\";`)}`,\n\t`5. Finally, if requested to add an element, add it exclusively in the Primary Variant: ${escapeValue(`${CommandType.Add}<node> <new-original-id> parent=\"<parent-id-in-primary-node>\";`)} and then override the subset of attributes that need to be different in Replica Variants using a \"compound id\": ${escapeValue(`${CommandType.Update} <new-replica-id><new-original-id> <attribute-name>=\"<value>\";`)}.`,\n]\n\nconst efficientReplicaUse = [\n\t`- Always try to modify nodes that already exist in the Primary Variant in the Replica Variant to suit the Replica Variant needs.`,\n\t`- Never create a new node for **each** Primary/Replica Variant, instead create a single node in the Primary Variant, and modify specific attributes (with ${escapeValue(CommandType.Update)}) to suit the Replica Variant needs.`,\n\t`- When a node should not appear in a Primary Variant, but only in a Replica Variant, hide it using ${attributeReference<CommandType.Update>(\"visible\")} only in the necessary Variants.`,\n\t`- When a node should not appear in a Replica Variant, but only in a Primary Variant, hide it using ${attributeReference<CommandType.Update>(\"visible\")} only in the necessary Variants.`,\n\t`- When adapting a layout for a Replica Variant or Breakpoint, consider how changes to direction, wrapping, sizing, or other layout properties affect visual order and reading flow; use ${escapeValue(CommandType.Move)} to reorder Replica Variant Descendants within their current parent when needed.`,\n]\n\nexport function buildReplicas(source: Source) {\n\treturn Markdown.section(\n\t\t\"Replicas\",\n\t\tMarkdown.section(\"Primary and Replica Variants\", ...primaryReplicaRules(source)),\n\t\tMarkdown.section(\"Illegal Replica Interactions\", ...illegalReplicaInteractions),\n\t\tMarkdown.section(\"Efficient Replica Use\", ...efficientReplicaUse),\n\t\tMarkdown.section(\"Creating Replica Variants\", ...creatingReplicaExample(source)),\n\t)\n}\n", "import { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { ComponentNodeClass, rootNodeId, supportedScopeNodeClasses, type SupportedScopeNodeClass } from \"../dsl.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nconst scopeDescriptions: Record<SupportedScopeNodeClass, string> = {\n\t[ComponentNodeClass]:\n\t\t\"A reusable component definition. Contains Primary and Replica Variants that define the visual states of the component.\",\n\t[ClassDiscriminator.DesignPageNode]:\n\t\t\"A freeform design canvas for exploration, iteration, wireframing, and side-by-side layout experiments. It is **not** a routed website page and does not have a URL path. Use it when the goal is designing without publishing concerns.\",\n\t[ClassDiscriminator.WebPageNode]:\n\t\t\"A real website page with a URL path and breakpoint variants. Use it for published site pages, routes, and navigation destinations.\",\n\t[ClassDiscriminator.LayoutTemplateNode]:\n\t\t\"A reusable page template that defines shared structure and content for website pages. Use it when setting up or editing common layouts that multiple pages can inherit.\",\n\t[ClassDiscriminator.CollectionNode]:\n\t\t\"A CMS collection that acts like a database table. Variables on it define the columns, and its children are the rows. It can provide variables to the agent.\",\n}\n\nexport const scopeTypes = Markdown.section(\n\t\"Scope Types\",\n\t`Projects are organized into top-level scopes. The supported scope types are: ${supportedScopeNodeClasses.map(c => escapeValue(c)).join(\", \")}.`,\n\t...supportedScopeNodeClasses.map(c => `- ${escapeValue(c)}: ${scopeDescriptions[c]}`),\n\t`A site has a ${escapeValue(ClassDiscriminator.RootNode)} with id ${escapeValue(rootNodeId)} that can be modified to update the default site metadata that all pages inherit. It cannot be added, moved, duplicated, or removed.`,\n)\n", "import {\n\ttransitionBounceKey,\n\ttransitionDelayKey,\n\ttransitionDampingKey,\n\ttransitionDurationKey,\n\ttransitionEaseKey,\n\ttransitionMassKey,\n\ttransitionStiffnessKey,\n} from \"document/models/Transition.ts\"\nimport { nullString } from \"../traits/helpers.ts\"\nimport { DSLTransitionType } from \"../traits/transition.ts\"\nimport { escapeValue, traitReference } from \"./utils.ts\"\n\nexport const transitions = [\n\t`Transitions control how effects and variant changes animate. They are represented as a single string with format:`,\n\t`- ${escapeValue(`${DSLTransitionType.springPhysics} <${transitionStiffnessKey}> <${transitionDampingKey}> <${transitionMassKey}> <${transitionDelayKey}>`)}`,\n\t`- ${escapeValue(`${DSLTransitionType.springDuration} <${transitionDurationKey}> <${transitionBounceKey}> <${transitionDelayKey}>`)}`,\n\t`- ${escapeValue(`${DSLTransitionType.tween} <${transitionEaseKey}> <${transitionDurationKey}> <${transitionDelayKey}>`)}`,\n\t`- ${escapeValue(`${DSLTransitionType.inertia} <${transitionStiffnessKey}> <${transitionDampingKey}>`)}`,\n\t`- ${escapeValue(DSLTransitionType.instant)}`,\n\t\"\",\n\t`Parameters: ${escapeValue(`<${transitionDurationKey}>`)} time 0s-10s, ${escapeValue(`<${transitionEaseKey}>`)} css cubic-bezier e.g. 0.42,0,0.58,1, ${escapeValue(`<${transitionDelayKey}>`)} time 0s-10s, ${escapeValue(`<${transitionBounceKey}>`)} float 0-1, ${escapeValue(`<${transitionStiffnessKey}>`)} integer 1-1000, ${escapeValue(`<${transitionDampingKey}>`)} integer 0-100, ${escapeValue(`<${transitionMassKey}>`)} float 0-10.`,\n\t`Default transition: ${escapeValue(`${DSLTransitionType.springDuration} 0.4s 0.2 0s`)}.`,\n\t\"\",\n\t`Variant ${traitReference(\"transition\")} controls how a node animates between component variants. Only set on descendants of a ${escapeValue(\"ComponentNode\")}. Nodes inherit the closest ancestor's transition. Can be removed with ${escapeValue(`transition=\"${nullString}\"`)}.`,\n\t`${escapeValue(\"stagger\")} is a separate attribute only on ${escapeValue(\"appearEffect.enter\")} (${escapeValue(\"appearEffect.enter.stagger\")}). It is not part of the transition string.`,\n\t\"\",\n\t`${escapeValue(\"link.transition\")} controls how link style properties animate on hover for a ${escapeValue(\"LinkStylePresetNode\")}. Only supports the ${escapeValue(DSLTransitionType.tween)} transition type.`,\n\t`Do not add a transition to a ${traitReference(\"customCursor\")} unless the user explicitly asks for it, as custom cursor transitions lead to poor UX.`,\n]\n", "import { assertNever, emptyArray, isModuleExportIdentifier } from \"@framerjs/shared\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { isCodeComponentNode, isFrameNode, isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { supportsBoxShadow, type WithBoxShadow } from \"document/models/CanvasTree/traits/WithBoxShadow.ts\"\nimport { withControlProps } from \"document/models/CanvasTree/traits/WithControlProps.ts\"\nimport { hasFillEnabled, type WithFill, type WithOptionalFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { type WithLayout, withLayout } from \"document/models/CanvasTree/traits/WithLayout.ts\"\nimport { type WithPadding, withPadding } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport {\n\ttype WithRadius,\n\ttype WithRelativeRadius,\n\twithRadius,\n\twithRelativeRadius,\n} from \"document/models/CanvasTree/traits/WithRadius.ts\"\nimport { type WithRadiusPerCorner, withRadiusPerCorner } from \"document/models/CanvasTree/traits/WithRadiusPerCorner.ts\"\nimport { type WithShadow, withShadow } from \"document/models/CanvasTree/traits/WithShadow.ts\"\nimport { type WithSize, withSize } from \"document/models/CanvasTree/traits/WithSize.ts\"\nimport {\n\ttype WithSizeConstraints,\n\tsupportsSizeConstraints,\n} from \"document/models/CanvasTree/traits/WithSizeConstraints.ts\"\nimport {\n\tviewportUnitForDimension,\n\ttype WithSizeDimensionType,\n\twithSizeDimensionType,\n} from \"document/models/CanvasTree/traits/WithSizeDimensionType.ts\"\nimport { type WithStylePresets, withStylePresets } from \"document/models/CanvasTree/traits/WithStylePresets.ts\"\nimport { isFontSize } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { createCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport { getFilterBlurForBoxBlur } from \"document/models/CanvasTree/traits/utils/getFilterBlurForBoxBlur.ts\"\nimport { shouldRenderShadowUsingFilter } from \"document/models/CanvasTree/traits/utils/wantsFilterShadow.ts\"\nimport {\n\tisTokenCSSVariable,\n\tstripMetadataFromCSSVariable,\n\ttokenIdFromCSSVariable,\n\ttokenToCSSCustomProperty,\n} from \"document/models/CanvasTree/utils/tokens.ts\"\nimport { isBoxShadowList } from \"document/models/Shadow.ts\"\nimport { isPrefixedControlPropKey, removeControlPropKeyPrefix } from \"document/models/controlProps/controlPropKey.ts\"\nimport { Color, P3Color } from \"library/render/types/Color/Color.ts\"\nimport { DimensionType } from \"library/render/types/Constraints.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { singleBoxShadowToCSS } from \"utils/boxShadowToCSS.ts\"\nimport { isArray, isBoolean, isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport {\n\ttype RichTextDocument,\n\ttype VirtualRichTextNode,\n\twithVirtualTextBlockStyles,\n\twithVirtualTextStyles,\n} from \"../../context/richtext/document.ts\"\nimport { walkVirtualRichText } from \"../../context/richtext/traversal.ts\"\nimport { StylePresetType } from \"../../context/stylePresetType.ts\"\nimport type { StylePresetDefinition } from \"../../context/stylePresets.ts\"\nimport type { TokenDefinition } from \"../../context/tokens.ts\"\nimport { assetReferenceToURL } from \"../../traits/helpers.ts\"\nimport type { DesignColorValueToAvoid, DesignPatternRow, DesignPatterns, DesignPatternRows } from \"./types.ts\"\n\n/**\n * The schema the model uses to categorize design patterns.\n */\nconst patternRowSchema = z.object({\n\tvalue: z.string().describe(\"The concrete token, component, style preset, spacing, radius, or layout value.\"),\n\trole: z.string().describe(\"The semantic design role of this value.\"),\n\treferenceKeys: z\n\t\t.array(z.string())\n\t\t.optional()\n\t\t.describe(\"Reference keys from the observed design reference data that this row directly explains.\"),\n\twhenToUse: z.string().min(1).describe(\"When to use this value in future implementation.\"),\n\tbreakpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"Breakpoint or media-query context when this pattern is breakpoint-specific.\"),\n\texamples: z.array(z.string()).describe(\"Concrete node ids that demonstrate this pattern.\"),\n})\n\nexport const designPatternsSchema = z.object({\n\tspacing: z.array(patternRowSchema),\n\tcolors: z.array(patternRowSchema),\n\tcomponents: z.array(patternRowSchema),\n\tradii: z.array(patternRowSchema),\n\ttypography: z.array(patternRowSchema),\n\tsurfaces: z.array(patternRowSchema),\n\tlayout: z.array(patternRowSchema),\n\tshadows: z.array(patternRowSchema),\n})\n\ninterface DesignPatternsProjectReferences {\n\treadonly tokens: readonly TokenDefinition[]\n\treadonly stylePresets: readonly StylePresetDefinition[]\n}\n\nexport interface ExtractDesignPatternsOptions {\n\treadonly projectReferences?: DesignPatternsProjectReferences\n\treadonly signal?: AbortSignal\n}\n\ntype DesignReferenceCategory = Exclude<keyof DesignPatterns, \"colorsToAvoid\" | \"textStylesToAvoid\" | \"unclassified\">\ntype RichTextStyleReferenceSource = RichTextDocument | VirtualRichTextNode\n\ninterface DesignReferenceEntry {\n\treadonly referenceKey: string\n\treadonly category: DesignReferenceCategory\n\treadonly value: string\n\treadonly property: string\n\treadonly exampleIds: string[]\n\tcount: number\n}\n\ninterface InternalDesignPatternRow extends DesignPatternRow {\n\treadonly referenceKeys?: readonly string[]\n}\n\ninterface ModelDesignPatternRow extends Omit<DesignPatternRow, \"count\"> {\n\treadonly referenceKeys?: readonly string[]\n}\n\ninterface DesignReferencePromptEntry {\n\treadonly referenceKey: string\n\treadonly category: DesignReferenceCategory\n\treadonly value: string\n\treadonly property: string\n\treadonly count: number\n}\n\ntype DesignReferenceMatrix = {\n\t[Category in DesignReferenceCategory]: DesignReferenceEntry[]\n}\n\ntype MutableDesignReferenceMatrix = {\n\t[Category in DesignReferenceCategory]: Map<string, DesignReferenceEntry>\n}\n\nconst designReferenceCategories = [\n\t\"spacing\",\n\t\"colors\",\n\t\"components\",\n\t\"radii\",\n\t\"typography\",\n\t\"surfaces\",\n\t\"layout\",\n\t\"shadows\",\n] satisfies readonly DesignReferenceCategory[]\n\n// Keep examples small enough for returned data while preserving useful evidence.\nconst maxReferenceExamples = 8\n\n/**\n * Create the subset of color tokens that are *not* used in the analyzed reference nodes.\n */\nexport function createColorsToAvoid(\n\tprojectReferences: DesignPatternsProjectReferences | undefined,\n\tdesignReferences: DesignReferenceMatrix,\n): readonly DesignColorValueToAvoid[] {\n\tif (!projectReferences) return emptyArray()\n\n\tconst observedTokenIds = getObservedColorTokenIds(designReferences.colors)\n\tconst values: DesignColorValueToAvoid[] = []\n\tfor (const token of projectReferences.tokens) {\n\t\tif (observedTokenIds.has(token.id)) continue\n\t\tvalues.push(formatColorTokenToAvoid(token))\n\t}\n\n\treturn values\n}\n\nfunction formatColorTokenToAvoid(token: TokenDefinition): DesignColorValueToAvoid {\n\treturn {\n\t\ttoken: `var(${tokenToCSSCustomProperty(token)})`,\n\t\tlight: token.light,\n\t\tdark: token.dark,\n\t}\n}\n\n/**\n * Create the subset of presets that are *not* used in the analyzed reference nodes.\n */\nexport function createTextStylesToAvoid(\n\tprojectReferences: DesignPatternsProjectReferences | undefined,\n\tdesignReferences: DesignReferenceMatrix,\n): readonly string[] {\n\tif (!projectReferences) return emptyArray()\n\n\tconst observedTextStyles = getObservedTextStyleNamesOrIds(designReferences.typography)\n\tconst values: string[] = []\n\tfor (const preset of projectReferences.stylePresets) {\n\t\tif (preset.type !== StylePresetType.Text) continue\n\t\tif (observedTextStyles.has(preset.id) || observedTextStyles.has(preset.name)) continue\n\t\tvalues.push(preset.name)\n\t}\n\n\treturn values\n}\n\nexport function createObservedProjectReferences(\n\tprojectReferences: DesignPatternsProjectReferences | undefined,\n\tdesignReferences: DesignReferenceMatrix,\n): DesignPatternsProjectReferences | undefined {\n\tif (!projectReferences) return\n\n\tconst observedTokenIds = getObservedColorTokenIds(designReferences.colors)\n\tconst observedTextStyles = getObservedTextStyleNamesOrIds(designReferences.typography)\n\n\tconst tokens: TokenDefinition[] = []\n\tfor (const token of projectReferences.tokens) {\n\t\tif (!observedTokenIds.has(token.id)) continue\n\t\ttokens.push(token)\n\t}\n\n\tconst stylePresets: StylePresetDefinition[] = []\n\tfor (const preset of projectReferences.stylePresets) {\n\t\tif (preset.type !== StylePresetType.Text) {\n\t\t\tstylePresets.push(preset)\n\t\t\tcontinue\n\t\t}\n\t\tif (!observedTextStyles.has(preset.id) && !observedTextStyles.has(preset.name)) continue\n\t\tstylePresets.push(preset)\n\t}\n\n\tif (tokens.length === 0 && stylePresets.length === 0) return\n\treturn { tokens, stylePresets }\n}\n\nfunction getObservedColorTokenIds(colorReferences: readonly DesignReferenceEntry[]): Set<string> {\n\tconst observed = new Set<string>()\n\tfor (const reference of colorReferences) {\n\t\tconst tokenId = tokenIdFromCSSVariable(reference.value)\n\t\tif (tokenId) observed.add(tokenId)\n\t}\n\treturn observed\n}\n\nfunction getObservedTextStyleNamesOrIds(typographyReferences: readonly DesignReferenceEntry[]): Set<string> {\n\tconst observed = new Set<string>()\n\tfor (const reference of typographyReferences) observed.add(reference.value)\n\treturn observed\n}\n\n/**\n * Walks the provided node tree and creates a deterministic reference matrix.\n *\n * The matrix is the important non-LLM input to design-pattern extraction: it records\n * every reusable value we observed, where it appeared, and how often it appeared.\n */\nexport async function extractDesignReferences(\n\tctx: AgentContext,\n\tnodes: readonly CanvasNode[],\n): Promise<DesignReferenceMatrix> {\n\tconst matrix = {\n\t\tspacing: new Map<string, DesignReferenceEntry>(),\n\t\tcolors: new Map<string, DesignReferenceEntry>(),\n\t\tcomponents: new Map<string, DesignReferenceEntry>(),\n\t\tradii: new Map<string, DesignReferenceEntry>(),\n\t\ttypography: new Map<string, DesignReferenceEntry>(),\n\t\tsurfaces: new Map<string, DesignReferenceEntry>(),\n\t\tlayout: new Map<string, DesignReferenceEntry>(),\n\t\tshadows: new Map<string, DesignReferenceEntry>(),\n\t}\n\n\tfor (const rootNode of nodes) {\n\t\tfor (const node of rootNode.walk()) collectNodeReferences(ctx, matrix, node)\n\t}\n\n\treturn designReferenceCategories.reduce<DesignReferenceMatrix>(\n\t\t(acc, category) => {\n\t\t\tacc[category] = Array.from(matrix[category].values()).sort(\n\t\t\t\t(a, b) => b.count - a.count || a.value.localeCompare(b.value),\n\t\t\t)\n\t\t\treturn acc\n\t\t},\n\t\t{\n\t\t\tspacing: [],\n\t\t\tcolors: [],\n\t\t\tcomponents: [],\n\t\t\tradii: [],\n\t\t\ttypography: [],\n\t\t\tsurfaces: [],\n\t\t\tlayout: [],\n\t\t\tshadows: [],\n\t\t},\n\t)\n}\n\nexport function serializeDesignReferences(\n\treferences: readonly DesignReferenceEntry[],\n): readonly DesignReferencePromptEntry[] {\n\treturn references.map(reference => ({\n\t\treferenceKey: reference.referenceKey,\n\t\tcategory: reference.category,\n\t\tvalue: reference.value,\n\t\tproperty: reference.property,\n\t\tcount: reference.count,\n\t}))\n}\n\n/**\n * Ensures the final output remains grounded in observed values.\n *\n * Model rows are only accepted when their `referenceKeys` entries point at real\n * observed references. Rows without references are discarded when observed references exist.\n */\nfunction ensureObservedRows(\n\tcategory: DesignReferenceCategory,\n\trows: readonly ModelDesignPatternRow[],\n\treferences: readonly DesignReferenceEntry[],\n): readonly InternalDesignPatternRow[] {\n\tif (references.length === 0) return emptyArray()\n\n\tconst rowIndexByReferenceKey = new Map<string, number>()\n\tconst enrichedRows: InternalDesignPatternRow[] = []\n\tfor (const row of rows) {\n\t\tif (!row.referenceKeys || row.referenceKeys.length === 0) continue\n\n\t\tconst rowIndex = enrichedRows.length\n\t\tenrichedRows.push(createUncountedInternalPatternRow(row))\n\n\t\tfor (const key of row.referenceKeys) {\n\t\t\tif (rowIndexByReferenceKey.has(key)) continue\n\t\t\trowIndexByReferenceKey.set(key, rowIndex)\n\t\t}\n\t}\n\n\tfor (const reference of references) {\n\t\tif (shouldIgnoreReference(category, reference)) continue\n\n\t\tconst rowIndex = rowIndexByReferenceKey.get(reference.referenceKey)\n\t\tif (rowIndex === undefined) continue\n\n\t\tconst row = enrichedRows[rowIndex]\n\t\tif (!row) continue\n\n\t\tenrichedRows[rowIndex] = enrichObservedRow(row, reference)\n\t}\n\treturn enrichedRows\n}\n\nfunction createUncountedInternalPatternRow(row: ModelDesignPatternRow): InternalDesignPatternRow {\n\treturn {\n\t\tvalue: row.value,\n\t\trole: row.role,\n\t\tcount: 0,\n\t\twhenToUse: row.whenToUse,\n\t\texamples: row.examples,\n\t\treferenceKeys: row.referenceKeys,\n\t\tbreakpoint: row.breakpoint,\n\t}\n}\n\n/**\n * Adds deterministic observation details to a model-authored row.\n *\n * The model supplies the semantic wording, while this function appends the exact\n * reference key and example ids from the source nodes.\n */\nfunction enrichObservedRow(row: InternalDesignPatternRow, reference: DesignReferenceEntry): InternalDesignPatternRow {\n\treturn {\n\t\tvalue: row.value,\n\t\trole: row.role,\n\t\tcount: (row.count ?? 0) + reference.count,\n\t\treferenceKeys: mergeReferenceKeys(row.referenceKeys, reference.referenceKey),\n\t\twhenToUse: row.whenToUse,\n\t\tbreakpoint: row.breakpoint,\n\t\texamples: Array.from(new Set([...row.examples, ...reference.exampleIds])),\n\t}\n}\n\nfunction mergeReferenceKeys(existing: readonly string[] | undefined, referenceKey: string): readonly string[] {\n\tif (!existing) return [referenceKey]\n\tif (existing.includes(referenceKey)) return existing\n\treturn [...existing, referenceKey]\n}\n\nfunction shouldIgnoreReference(category: DesignReferenceCategory, reference: DesignReferenceEntry): boolean {\n\treturn category === \"layout\" && (reference.property === \"width\" || reference.property === \"height\")\n}\n\nfunction collectNodeReferences(ctx: AgentContext, matrix: MutableDesignReferenceMatrix, node: CanvasNode): void {\n\tif (isCodeComponentNode(node) && isModuleExportIdentifier(node.codeComponentIdentifier)) {\n\t\tconst component = ctx.components.getIdForModuleIdentifier(node.codeComponentIdentifier)\n\t\taddReference(matrix, \"components\", component, \"component\", node.id)\n\t}\n\n\tcollectSupportedNodeReferences(matrix, node)\n\tcollectControlPropReferences(matrix, node)\n\tcollectRichTextReferences(ctx, matrix, node)\n}\n\nfunction collectRichTextReferences(ctx: AgentContext, matrix: MutableDesignReferenceMatrix, node: CanvasNode): void {\n\tif (!isRichTextNode(node)) return\n\n\t// While the rest of this file tries to operate on CanvasNode, RichText presents a problem where\n\t// the keys require extraction. Using the Virtual document allows us to align to the identical\n\t// virtual ids in the context document.\n\tconst document = ctx.virtualText.maybeHydrateDocument(node)\n\tif (!document) return\n\n\tcollectRichTextStyleReferences(matrix, document, node.id)\n\n\tfor (const virtualNode of walkVirtualRichText(document)) {\n\t\tcollectRichTextStyleReferences(matrix, virtualNode, virtualNode.id)\n\t}\n}\n\nfunction collectRichTextStyleReferences(\n\tmatrix: MutableDesignReferenceMatrix,\n\tsource: RichTextStyleReferenceSource,\n\texampleId: string,\n): void {\n\tif (withVirtualTextStyles(source)) {\n\t\taddReference(matrix, \"colors\", source.inlineStyles.textColor, \"textColor\", exampleId)\n\t\taddReference(matrix, \"colors\", source.inlineStyles.textDecorationColor, \"textDecorationColor\", exampleId)\n\t\taddReference(matrix, \"colors\", source.inlineStyles.textStrokeColor, \"textStrokeColor\", exampleId)\n\t\taddReference(matrix, \"typography\", source.inlineStyles.fontSize, \"fontSize\", exampleId)\n\t\taddReference(matrix, \"typography\", source.inlineStyles.textTransform, \"textTransform\", exampleId)\n\t\taddReference(matrix, \"typography\", source.inlineStyles.textDecoration, \"textDecoration\", exampleId)\n\t\taddReference(matrix, \"typography\", source.fontName, \"fontName\", exampleId)\n\t\taddReference(matrix, \"typography\", source.fontWeight, \"fontWeight\", exampleId)\n\t\taddReference(matrix, \"typography\", source.fontStyle, \"fontStyle\", exampleId)\n\t\taddReference(matrix, \"colors\", source.backgroundStyles.textBackgroundColor, \"textBackgroundColor\", exampleId)\n\t}\n\n\tif (withVirtualTextBlockStyles(source)) {\n\t\taddReference(matrix, \"typography\", source.textStylePreset, \"textStylePreset\", exampleId)\n\t}\n}\n\nfunction collectControlPropReferences(matrix: MutableDesignReferenceMatrix, node: CanvasNode): void {\n\tif (!withControlProps(node)) return\n\n\tconst controlProps = node.getRawControlProps()\n\tfor (const rawKey in controlProps) {\n\t\tconst controlProp = controlProps[rawKey]\n\t\tif (!controlProp) continue\n\n\t\tconst property = isPrefixedControlPropKey(rawKey) ? removeControlPropKeyPrefix(rawKey) : rawKey\n\t\tconst categories = getReferenceCategoriesForControlProp(controlProp.type)\n\t\tif (!categories) continue\n\n\t\tconst value = getControlPropReferenceValue(controlProp.type, controlProp.value)\n\t\tfor (const category of categories) addReference(matrix, category, value, property, node.id)\n\t}\n}\n\nfunction getReferenceCategoriesForControlProp(\n\tcontrolType: ControlType | null,\n): readonly DesignReferenceCategory[] | undefined {\n\tswitch (controlType) {\n\t\tcase ControlType.Color:\n\t\t\treturn [\"colors\"]\n\t\tcase ControlType.Image:\n\t\tcase ControlType.ResponsiveImage:\n\t\t\treturn [\"surfaces\"]\n\t\tcase ControlType.Padding:\n\t\tcase ControlType.Gap:\n\t\t\treturn [\"spacing\"]\n\t\tcase ControlType.BorderRadius:\n\t\t\treturn [\"radii\"]\n\t\tcase ControlType.BoxShadow:\n\t\t\treturn [\"shadows\"]\n\t\tcase null:\n\t\tcase ControlType.Array:\n\t\tcase ControlType.Boolean:\n\t\tcase ControlType.Border:\n\t\tcase ControlType.ChangeHandler:\n\t\tcase ControlType.CollectionReference:\n\t\tcase ControlType.ComponentInstance:\n\t\tcase ControlType.Cursor:\n\t\tcase ControlType.CustomCursor:\n\t\tcase ControlType.Date:\n\t\tcase ControlType.Enum:\n\t\tcase ControlType.EventHandler:\n\t\tcase ControlType.File:\n\t\tcase ControlType.Font:\n\t\tcase ControlType.FusedNumber:\n\t\tcase ControlType.Link:\n\t\tcase ControlType.LinkRelValues:\n\t\tcase ControlType.Location:\n\t\tcase ControlType.MultiCollectionReference:\n\t\tcase ControlType.Number:\n\t\tcase ControlType.Object:\n\t\tcase ControlType.PageScope:\n\t\tcase ControlType.RichText:\n\t\tcase ControlType.ScrollSectionRef:\n\t\tcase ControlType.SegmentedEnum:\n\t\tcase ControlType.Slot:\n\t\tcase ControlType.String:\n\t\tcase ControlType.TrackingId:\n\t\tcase ControlType.Transition:\n\t\tcase ControlType.VectorSetItem:\n\t\t\treturn\n\t\tdefault:\n\t\t\tassertNever(controlType)\n\t}\n}\n\nfunction getControlPropReferenceValue(controlType: ControlType | null, value: unknown): unknown {\n\tif (controlType === ControlType.ResponsiveImage) {\n\t\tif (!isObject(value)) return\n\t\tconst src = value.src\n\t\tif (!isString(src)) return\n\t\treturn src\n\t}\n\n\tif (controlType === ControlType.BoxShadow) {\n\t\treturn serializeBoxShadowControlValue(value)\n\t}\n\n\treturn value\n}\n\ntype DesignReferenceNodeKey =\n\t| keyof WithBoxShadow\n\t| keyof WithFill\n\t| keyof WithLayout\n\t| keyof WithOptionalFill\n\t| keyof WithPadding\n\t| keyof WithRadius\n\t| keyof WithRadiusPerCorner\n\t| keyof WithRelativeRadius\n\t| keyof WithShadow\n\t| keyof WithSize\n\t| keyof WithSizeConstraints\n\t| keyof WithSizeDimensionType\n\t| keyof WithStylePresets\n\nconst designReferenceNodeKeys = {\n\tboxShadows: true,\n\tfillType: true,\n\tfillColor: true,\n\tfillImage: true,\n\tfillImageOriginalName: true,\n\tfillImageResize: true,\n\tfillImagePixelWidth: true,\n\tfillImagePixelHeight: true,\n\tfillImagePositionX: true,\n\tfillImagePositionY: true,\n\tfillImageTileSize: true,\n\tfillLinearGradient: true,\n\tfillRadialGradient: true,\n\tfillConicGradient: true,\n\tfillEnabled: true,\n\tlayout: true,\n\tstackDirection: true,\n\tstackDistribution: true,\n\tstackAlignment: true,\n\tstackWrapEnabled: true,\n\tgridColumnCount: true,\n\tgridRowCount: true,\n\tgridAlignment: true,\n\tgridColumnWidthType: true,\n\tgridColumnWidth: true,\n\tgridColumnMinWidth: true,\n\tgridRowHeightType: true,\n\tgridRowHeight: true,\n\tgridType: true,\n\tgap: true,\n\tpadding: true,\n\tpaddingPerSide: true,\n\tpaddingTop: true,\n\tpaddingRight: true,\n\tpaddingBottom: true,\n\tpaddingLeft: true,\n\tradius: true,\n\tradiusIsRelative: true,\n\tradiusPerCorner: true,\n\tradiusTopLeft: true,\n\tradiusTopRight: true,\n\tradiusBottomRight: true,\n\tradiusBottomLeft: true,\n\tstylePresetHeading1: true,\n\tstylePresetHeading2: true,\n\tstylePresetHeading3: true,\n\tstylePresetHeading4: true,\n\tstylePresetHeading5: true,\n\tstylePresetHeading6: true,\n\tstylePresetParagraph: true,\n\tstylePresetLink: true,\n\tstylePresetAnchorLink: true,\n\tstylePresetBlockquote: true,\n\tstylePresetTable: true,\n\tstylePresetInlineCode: true,\n\tstylePresetImage: true,\n\tshadows: true,\n\twidth: true,\n\theight: true,\n\tmaxWidth: true,\n\tminWidth: true,\n\tmaxHeight: true,\n\tminHeight: true,\n\twidthType: true,\n\theightType: true,\n} as const satisfies Record<DesignReferenceNodeKey, true>\n\nfunction collectSupportedNodeReferences(matrix: MutableDesignReferenceMatrix, node: CanvasNode): void {\n\tfor (const key in designReferenceNodeKeys) {\n\t\tif (!isDesignReferenceNodeKey(key)) continue\n\t\tconst categories = getReferenceCategoriesForNodeKey(key, node)\n\t\tif (!categories) continue\n\n\t\tconst value = getReferenceValueForNodeKey(node, key)\n\t\tconst isDimension = isDimensionProperty(key)\n\t\tfor (const category of categories) addReference(matrix, category, value, key, node.id, isDimension)\n\t}\n}\n\nfunction isDesignReferenceNodeKey(key: string): key is DesignReferenceNodeKey {\n\treturn key in designReferenceNodeKeys\n}\n\n/**\n * Classifies a CanvasNode property key into one or more design reference categories.\n *\n * A single key can contribute to multiple categories, for example `fillColor`\n * can be both a color and a surface when it belongs to a frame-like node.\n */\nfunction getReferenceCategoriesForNodeKey(\n\tkey: DesignReferenceNodeKey,\n\tnode: CanvasNode,\n): readonly DesignReferenceCategory[] | undefined {\n\tswitch (key) {\n\t\tcase \"fillColor\":\n\t\t\treturn isFrameNode(node) ? [\"colors\", \"surfaces\"] : [\"colors\"]\n\t\tcase \"fillImage\":\n\t\tcase \"fillLinearGradient\":\n\t\tcase \"fillRadialGradient\":\n\t\tcase \"fillConicGradient\":\n\t\t\treturn [\"surfaces\"]\n\t\tcase \"gap\":\n\t\tcase \"padding\":\n\t\tcase \"paddingTop\":\n\t\tcase \"paddingRight\":\n\t\tcase \"paddingBottom\":\n\t\tcase \"paddingLeft\":\n\t\t\treturn [\"spacing\"]\n\t\tcase \"radius\":\n\t\tcase \"radiusTopLeft\":\n\t\tcase \"radiusTopRight\":\n\t\tcase \"radiusBottomRight\":\n\t\tcase \"radiusBottomLeft\":\n\t\t\treturn [\"radii\"]\n\t\tcase \"stylePresetHeading1\":\n\t\tcase \"stylePresetHeading2\":\n\t\tcase \"stylePresetHeading3\":\n\t\tcase \"stylePresetHeading4\":\n\t\tcase \"stylePresetHeading5\":\n\t\tcase \"stylePresetHeading6\":\n\t\tcase \"stylePresetParagraph\":\n\t\tcase \"stylePresetLink\":\n\t\tcase \"stylePresetAnchorLink\":\n\t\tcase \"stylePresetInlineCode\":\n\t\t\treturn [\"typography\"]\n\t\tcase \"layout\":\n\t\tcase \"stackDirection\":\n\t\tcase \"stackDistribution\":\n\t\tcase \"stackAlignment\":\n\t\tcase \"gridAlignment\":\n\t\tcase \"width\":\n\t\tcase \"height\":\n\t\tcase \"maxWidth\":\n\t\tcase \"minWidth\":\n\t\tcase \"maxHeight\":\n\t\tcase \"minHeight\":\n\t\t\treturn [\"layout\"]\n\t\tcase \"boxShadows\":\n\t\tcase \"shadows\":\n\t\t\treturn [\"shadows\"]\n\t\tcase \"fillType\":\n\t\tcase \"fillEnabled\":\n\t\tcase \"fillImageOriginalName\":\n\t\tcase \"fillImageResize\":\n\t\tcase \"fillImagePixelWidth\":\n\t\tcase \"fillImagePixelHeight\":\n\t\tcase \"fillImagePositionX\":\n\t\tcase \"fillImagePositionY\":\n\t\tcase \"fillImageTileSize\":\n\t\tcase \"stackWrapEnabled\":\n\t\tcase \"gridColumnCount\":\n\t\tcase \"gridRowCount\":\n\t\tcase \"gridColumnWidthType\":\n\t\tcase \"gridColumnWidth\":\n\t\tcase \"gridColumnMinWidth\":\n\t\tcase \"gridRowHeightType\":\n\t\tcase \"gridRowHeight\":\n\t\tcase \"gridType\":\n\t\tcase \"paddingPerSide\":\n\t\tcase \"radiusIsRelative\":\n\t\tcase \"radiusPerCorner\":\n\t\tcase \"stylePresetBlockquote\":\n\t\tcase \"stylePresetTable\":\n\t\tcase \"stylePresetImage\":\n\t\tcase \"widthType\":\n\t\tcase \"heightType\":\n\t\t\treturn\n\t\tdefault:\n\t\t\tassertNever(key)\n\t}\n}\n\nfunction getReferenceValueForNodeKey(node: CanvasNode, key: DesignReferenceNodeKey): unknown {\n\tswitch (key) {\n\t\tcase \"fillColor\":\n\t\t\treturn getFillColorReferenceValue(node)\n\t\tcase \"fillImage\":\n\t\t\treturn getFillImageReferenceValue(node)\n\t\tcase \"fillLinearGradient\":\n\t\tcase \"fillRadialGradient\":\n\t\tcase \"fillConicGradient\":\n\t\t\treturn getFillGradientReferenceValue(node, key)\n\t\tcase \"layout\":\n\t\tcase \"stackDirection\":\n\t\tcase \"stackDistribution\":\n\t\tcase \"stackAlignment\":\n\t\tcase \"gridAlignment\":\n\t\tcase \"gap\":\n\t\t\treturn getLayoutReferenceValue(node, key)\n\t\tcase \"padding\":\n\t\tcase \"paddingTop\":\n\t\tcase \"paddingRight\":\n\t\tcase \"paddingBottom\":\n\t\tcase \"paddingLeft\":\n\t\t\treturn getPaddingReferenceValue(node, key)\n\t\tcase \"radius\":\n\t\tcase \"radiusTopLeft\":\n\t\tcase \"radiusTopRight\":\n\t\tcase \"radiusBottomRight\":\n\t\tcase \"radiusBottomLeft\":\n\t\t\treturn getRadiusReferenceValue(node, key)\n\t\tcase \"stylePresetHeading1\":\n\t\tcase \"stylePresetHeading2\":\n\t\tcase \"stylePresetHeading3\":\n\t\tcase \"stylePresetHeading4\":\n\t\tcase \"stylePresetHeading5\":\n\t\tcase \"stylePresetHeading6\":\n\t\tcase \"stylePresetParagraph\":\n\t\tcase \"stylePresetLink\":\n\t\tcase \"stylePresetAnchorLink\":\n\t\tcase \"stylePresetInlineCode\":\n\t\t\treturn getStylePresetReferenceValue(node, key)\n\t\tcase \"width\":\n\t\tcase \"height\":\n\t\t\treturn getSizeReferenceValue(node, key)\n\t\tcase \"maxWidth\":\n\t\tcase \"minWidth\":\n\t\tcase \"maxHeight\":\n\t\tcase \"minHeight\":\n\t\t\treturn getSizeConstraintReferenceValue(node, key)\n\t\tcase \"boxShadows\":\n\t\t\treturn getBoxShadowsReferenceValue(node)\n\t\tcase \"shadows\":\n\t\t\treturn getFilterShadowsReferenceValue(node)\n\t\tcase \"fillType\":\n\t\tcase \"fillEnabled\":\n\t\tcase \"fillImageOriginalName\":\n\t\tcase \"fillImageResize\":\n\t\tcase \"fillImagePixelWidth\":\n\t\tcase \"fillImagePixelHeight\":\n\t\tcase \"fillImagePositionX\":\n\t\tcase \"fillImagePositionY\":\n\t\tcase \"fillImageTileSize\":\n\t\tcase \"stackWrapEnabled\":\n\t\tcase \"gridColumnCount\":\n\t\tcase \"gridRowCount\":\n\t\tcase \"gridColumnWidthType\":\n\t\tcase \"gridColumnWidth\":\n\t\tcase \"gridColumnMinWidth\":\n\t\tcase \"gridRowHeightType\":\n\t\tcase \"gridRowHeight\":\n\t\tcase \"gridType\":\n\t\tcase \"paddingPerSide\":\n\t\tcase \"radiusIsRelative\":\n\t\tcase \"radiusPerCorner\":\n\t\tcase \"stylePresetBlockquote\":\n\t\tcase \"stylePresetTable\":\n\t\tcase \"stylePresetImage\":\n\t\tcase \"widthType\":\n\t\tcase \"heightType\":\n\t\t\treturn\n\t\tdefault:\n\t\t\tassertNever(key)\n\t}\n}\n\nfunction getFillColorReferenceValue(node: CanvasNode): unknown {\n\tif (!hasFillEnabled(node)) return\n\tif (node.fillType !== \"color\") return\n\treturn node.resolveValue(\"fillColor\")\n}\n\nfunction getFillImageReferenceValue(node: CanvasNode): unknown {\n\tif (!hasFillEnabled(node)) return\n\tif (node.fillType !== \"image\") return\n\n\tconst value = node.resolveValue(\"fillImage\")\n\tif (!isString(value)) return\n\treturn assetReferenceToURL(value)\n}\n\nfunction getFillGradientReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<DesignReferenceNodeKey, \"fillLinearGradient\" | \"fillRadialGradient\" | \"fillConicGradient\">,\n): unknown {\n\tif (!hasFillEnabled(node)) return\n\n\tswitch (key) {\n\t\tcase \"fillLinearGradient\":\n\t\t\tif (node.fillType !== \"linear-gradient\") return\n\t\t\treturn node.fillLinearGradient?.toCSS()\n\t\tcase \"fillRadialGradient\":\n\t\t\tif (node.fillType !== \"radial-gradient\") return\n\t\t\treturn node.fillRadialGradient?.toCSS()\n\t\tcase \"fillConicGradient\":\n\t\t\tif (node.fillType !== \"conic-gradient\") return\n\t\t\treturn node.fillConicGradient?.toCSS()\n\t\tdefault:\n\t\t\tassertNever(key)\n\t}\n}\n\nfunction getLayoutReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<\n\t\tDesignReferenceNodeKey,\n\t\t\"layout\" | \"stackDirection\" | \"stackDistribution\" | \"stackAlignment\" | \"gridAlignment\" | \"gap\"\n\t>,\n): unknown {\n\tif (!withLayout(node)) return\n\treturn node.resolveValue(key)\n}\n\nfunction getPaddingReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<DesignReferenceNodeKey, \"padding\" | \"paddingTop\" | \"paddingRight\" | \"paddingBottom\" | \"paddingLeft\">,\n): unknown {\n\tif (!withPadding(node)) return\n\treturn node.resolveValue(key)\n}\n\nfunction getRadiusReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<\n\t\tDesignReferenceNodeKey,\n\t\t\"radius\" | \"radiusTopLeft\" | \"radiusTopRight\" | \"radiusBottomRight\" | \"radiusBottomLeft\"\n\t>,\n): unknown {\n\tif (key === \"radius\") return getSingleRadiusReferenceValue(node)\n\tif (!withRadiusPerCorner(node)) return\n\tif (!node.radiusPerCorner) return\n\treturn node[key]\n}\n\nfunction getSingleRadiusReferenceValue(node: CanvasNode): unknown {\n\tif (!withRadius(node)) return\n\n\tconst radius = node.resolveValue(\"radius\")\n\tif (!isNumber(radius)) return radius\n\tif (!withRelativeRadius(node) || !node.radiusIsRelative) return radius\n\treturn `${radius}%`\n}\n\nfunction getStylePresetReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<DesignReferenceNodeKey, keyof WithStylePresets>,\n): unknown {\n\tif (!withStylePresets(node)) return\n\treturn node[key]\n}\n\nfunction getSizeReferenceValue(node: CanvasNode, key: Extract<DesignReferenceNodeKey, \"width\" | \"height\">): unknown {\n\tif (!withSize(node) || !withSizeDimensionType(node)) return\n\n\tswitch (key) {\n\t\tcase \"width\":\n\t\t\treturn sizeFromNode(node.width, node.widthType, \"width\")\n\t\tcase \"height\":\n\t\t\treturn sizeFromNode(node.height, node.heightType, \"height\")\n\t\tdefault:\n\t\t\tassertNever(key)\n\t}\n}\n\nfunction sizeFromNode(value: number | undefined, type: DimensionType, axis: keyof WithSize): string | undefined {\n\tif (value === undefined) return\n\n\tswitch (type) {\n\t\tcase DimensionType.FixedNumber:\n\t\t\treturn createCSSDimension(value, \"px\")\n\t\tcase DimensionType.Percentage:\n\t\t\treturn createCSSDimension(value * 100, \"%\")\n\t\tcase DimensionType.FractionOfFreeSpace:\n\t\t\treturn createCSSDimension(value, \"fr\")\n\t\tcase DimensionType.Viewport:\n\t\t\treturn createCSSDimension(value * 100, viewportUnitForDimension(axis))\n\t\tcase DimensionType.Auto:\n\t\t\treturn \"auto\"\n\t\tcase DimensionType.FitImage:\n\t\t\treturn \"fit-image\"\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n\nfunction getSizeConstraintReferenceValue(\n\tnode: CanvasNode,\n\tkey: Extract<DesignReferenceNodeKey, keyof WithSizeConstraints>,\n): unknown {\n\tif (!supportsSizeConstraints(node)) return\n\n\tconst value = node[key]\n\tif (isNumber(value)) return createCSSDimension(value, \"px\")\n\treturn value\n}\n\nfunction getBoxShadowsReferenceValue(node: CanvasNode): unknown {\n\tif (!supportsBoxShadow(node)) return\n\n\tconst boxShadows = node.resolveValue(\"boxShadows\")\n\tif (!isBoxShadowList(boxShadows) || boxShadows.length === 0) return\n\n\tif (shouldRenderShadowUsingFilter(node)) {\n\t\tconst insetShadows = boxShadows.filter(shadow => shadow.inset)\n\t\tconst filterShadows = boxShadows.filter(shadow => !shadow.inset)\n\n\t\tconst parts: string[] = []\n\t\tif (insetShadows.length > 0) {\n\t\t\tparts.push(insetShadows.map(shadow => singleBoxShadowToCSS(shadow)).join(\", \"))\n\t\t}\n\t\tif (filterShadows.length > 0) {\n\t\t\tparts.push(\n\t\t\t\tfilterShadows\n\t\t\t\t\t.map(\n\t\t\t\t\t\tshadow =>\n\t\t\t\t\t\t\t`drop-shadow(${shadow.x}px ${shadow.y}px ${getFilterBlurForBoxBlur(shadow.blur)}px ${shadow.color})`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\" \"),\n\t\t\t)\n\t\t}\n\n\t\tif (parts.length === 0) return\n\t\treturn parts.join(\" | \")\n\t}\n\n\treturn boxShadows.map(shadow => singleBoxShadowToCSS(shadow)).join(\", \")\n}\n\nfunction getFilterShadowsReferenceValue(node: CanvasNode): unknown {\n\tif (!withShadow(node)) return\n\n\tconst shadows = node.shadows\n\tif (!isArray(shadows) || shadows.length === 0) return\n\n\tif (isAnyTextNode(node)) {\n\t\treturn shadows.map(shadow => `${shadow.x}px ${shadow.y}px ${shadow.blur}px ${shadow.color}`).join(\", \")\n\t}\n\n\treturn shadows.map(shadow => `drop-shadow(${shadow.x}px ${shadow.y}px ${shadow.blur}px ${shadow.color})`).join(\" \")\n}\n\nfunction serializeBoxShadowControlValue(value: unknown): string | undefined {\n\tif (!isBoxShadowList(value) || value.length === 0) return\n\n\treturn value.map(shadow => singleBoxShadowToCSS(shadow)).join(\", \")\n}\n\n/**\n * Adds one normalized observation to the mutable reference matrix.\n *\n * Repeated observations with the same category, property role, and value are folded\n * together, but the first few example ids are kept as output evidence.\n */\nfunction addReference(\n\tmatrix: MutableDesignReferenceMatrix,\n\tcategory: DesignReferenceCategory,\n\tvalue: unknown,\n\tproperty: string,\n\texampleId: string,\n\tisDimension = false,\n): void {\n\tconst normalizedValue = normalizeReferenceValue(value, category, isDimension)\n\tif (!normalizedValue) return\n\n\tconst entries = matrix[category]\n\tconst referenceKey = getReferenceKey(category, normalizedValue, property)\n\tconst existing = entries.get(referenceKey)\n\tconst entry = existing ?? {\n\t\treferenceKey,\n\t\tcategory,\n\t\tvalue: normalizedValue,\n\t\tproperty,\n\t\tcount: 0,\n\t\texampleIds: [],\n\t}\n\tentry.count++\n\n\tif (entry.exampleIds.length < maxReferenceExamples) {\n\t\tentry.exampleIds.push(exampleId)\n\t}\n\n\tif (!existing) entries.set(referenceKey, entry)\n}\n\n/**\n * Creates a unique key for a reference entry - ensures that values used in different contexts are treated as distinct.\n */\nfunction getReferenceKey(category: DesignReferenceCategory, value: string, property: string): string {\n\treturn `${category}:${property}:${value}`\n}\n\n/**\n * Converts raw serialized values into reusable design reference strings.\n *\n * Values that are not useful design guidance, such as empty strings, URLs used as\n * colors, gradients in the color category, or `null` layout strings, are skipped.\n */\nfunction normalizeReferenceValue(\n\tvalue: unknown,\n\tcategory: DesignReferenceCategory,\n\tisDimension: boolean,\n): string | undefined {\n\tif (isString(value)) {\n\t\tconst trimmed = value.trim()\n\t\tif (trimmed.length === 0) return\n\t\treturn normalizeReferenceStringValue(trimmed, category, isDimension)\n\t}\n\n\tif (isNumber(value)) {\n\t\tif (!Number.isFinite(value)) return\n\t\treturn normalizeNumericReferenceValue(value, category, isDimension)\n\t}\n\n\tif (isFontSize(value)) return createCSSDimension(...value)\n\n\tif (isBoolean(value)) return String(value)\n\n\treturn\n}\n\nfunction normalizeReferenceStringValue(\n\tvalue: string,\n\tcategory: DesignReferenceCategory,\n\tisDimension: boolean,\n): string | undefined {\n\tif (category === \"spacing\" || category === \"radii\") return normalizePixelLikeValue(value)\n\tif (category === \"colors\") return normalizeColorValue(value)\n\tif (isDimension) return normalizePixelLikeValue(value)\n\treturn value\n}\n\nfunction normalizeNumericReferenceValue(\n\tvalue: number,\n\tcategory: DesignReferenceCategory,\n\tisDimension: boolean,\n): string {\n\tswitch (category) {\n\t\tcase \"spacing\":\n\t\tcase \"radii\":\n\t\t\treturn createCSSDimension(value, \"px\")\n\t\tcase \"layout\":\n\t\t\tif (isDimension) return createCSSDimension(value, \"px\")\n\t\t\treturn String(value)\n\t\tcase \"colors\":\n\t\tcase \"components\":\n\t\tcase \"surfaces\":\n\t\tcase \"typography\":\n\t\tcase \"shadows\":\n\t\t\treturn String(value)\n\t\tdefault:\n\t\t\tassertNever(category)\n\t}\n}\n\nfunction normalizePixelLikeValue(value: string): string {\n\tconst numeric = Number(value)\n\tif (Number.isFinite(numeric)) return createCSSDimension(numeric, \"px\")\n\treturn value\n}\n\nfunction normalizeColorValue(value: string): string | undefined {\n\tif (isTokenCSSVariable(value)) return stripMetadataFromCSSVariable(value)\n\n\tif (Color.isP3String(value)) {\n\t\tconst p3Color = P3Color.fromString(value)\n\t\treturn p3Color?.toString(\"p3\")\n\t}\n\n\tif (!Color.isColorString(value)) return\n\n\tconst color = Color(value)\n\tif (color.a !== 1) return Color.toRgbString(color)\n\treturn Color.toHexString(color).toLowerCase()\n}\n\nfunction isDimensionProperty(property: DesignReferenceNodeKey): boolean {\n\treturn (\n\t\tproperty === \"width\" ||\n\t\tproperty === \"height\" ||\n\t\tproperty === \"maxWidth\" ||\n\t\tproperty === \"minWidth\" ||\n\t\tproperty === \"maxHeight\" ||\n\t\tproperty === \"minHeight\"\n\t)\n}\n\n/**\n * Combines model-authored pattern rows with deterministic evidence.\n *\n * This pass is the safety net after generation: rows without valid references are\n * removed, missing observations are surfaced, and avoid lists are attached.\n */\nexport function createFinalDesignPatterns(\n\tctx: AgentContext,\n\toutput: z.infer<typeof designPatternsSchema>,\n\tdesignReferences: DesignReferenceMatrix,\n\tcolorsToAvoid: DesignPatterns[\"colorsToAvoid\"],\n\ttextStylesToAvoid: DesignPatterns[\"textStylesToAvoid\"],\n): DesignPatterns {\n\tconst rows = designReferenceCategories.reduce<Partial<DesignPatternRows>>((acc, category) => {\n\t\tconst enhancedRows = ensureObservedRows(category, output[category], designReferences[category])\n\t\tacc[category] = enhancedRows.map(row => serializeRow(ctx, row))\n\t\treturn acc\n\t}, {})\n\n\treturn {\n\t\t...output,\n\t\t...rows,\n\t\tcolorsToAvoid,\n\t\ttextStylesToAvoid,\n\t}\n}\n\nfunction serializeRow(ctx: AgentContext, row: InternalDesignPatternRow): DesignPatternRow {\n\tconst exampleIds = new Set(row.examples)\n\tfor (const example of row.examples) {\n\t\tconst node = ctx.treeResolver.get(example)\n\t\tif (node && node.getPrimaryId() !== node.id) exampleIds.delete(example)\n\t}\n\n\treturn {\n\t\tvalue: row.value,\n\t\trole: row.role,\n\t\tcount: row.count,\n\t\twhenToUse: row.whenToUse,\n\t\tbreakpoint: row.breakpoint,\n\t\texamples: Array.from(exampleIds),\n\t}\n}\n", "//#region src/index.ts\nconst PATTERNS = {\n\twhitespace: /^\\s+$/,\n\tcjk: /[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3000-\\u303F\\uFF00-\\uFFEF\\u30A0-\\u30FF\\u2E80-\\u2EFF\\u31C0-\\u31EF\\u3200-\\u32FF\\u3300-\\u33FF\\uAC00-\\uD7AF\\u1100-\\u11FF\\u3130-\\u318F\\uA960-\\uA97F\\uD7B0-\\uD7FF]/,\n\tnumeric: /^\\d+(?:[.,]\\d+)*$/,\n\tpunctuation: /[.,!?;(){}[\\]<>:/\\\\|@#$%^&*+=`~_-]/,\n\talphanumeric: /^[a-zA-Z0-9\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF]+$/\n};\nconst TOKEN_SPLIT_PATTERN = /* @__PURE__ */ new RegExp(`(\\\\s+|${PATTERNS.punctuation.source}+)`);\nconst DEFAULT_CHARS_PER_TOKEN = 6;\nconst SHORT_TOKEN_THRESHOLD = 3;\nconst DEFAULT_LANGUAGE_CONFIGS = [\n\t{\n\t\tpattern: /[\u00E4\u00F6\u00FC\u00DF\u1E9E]/i,\n\t\taverageCharsPerToken: 3\n\t},\n\t{\n\t\tpattern: /[\u00E9\u00E8\u00EA\u00EB\u00E0\u00E2\u00EE\u00EF\u00F4\u00FB\u00F9\u00FC\u00FF\u00E7\u0153\u00E6\u00E1\u00ED\u00F3\u00FA\u00F1]/i,\n\t\taverageCharsPerToken: 3\n\t},\n\t{\n\t\tpattern: /[\u0105\u0107\u0119\u0142\u0144\u00F3\u015B\u017A\u017C\u011B\u0161\u010D\u0159\u017E\u00FD\u016F\u00FA\u010F\u0165\u0148]/i,\n\t\taverageCharsPerToken: 3.5\n\t}\n];\n/**\n* Checks if a text string is within a specified token limit\n*/\nfunction isWithinTokenLimit(text, tokenLimit, options) {\n\treturn estimateTokenCount(text, options) <= tokenLimit;\n}\n/** @deprecated Use `estimateTokenCount` instead */\nconst approximateTokenSize = estimateTokenCount;\n/**\n* Estimates the number of tokens in a text string using heuristic rules.\n*/\nfunction estimateTokenCount(text, options = {}) {\n\tif (!text) return 0;\n\tconst { defaultCharsPerToken = DEFAULT_CHARS_PER_TOKEN, languageConfigs = DEFAULT_LANGUAGE_CONFIGS } = options;\n\tconst segments = text.split(TOKEN_SPLIT_PATTERN).filter(Boolean);\n\tlet tokenCount = 0;\n\tfor (const segment of segments) tokenCount += estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken);\n\treturn tokenCount;\n}\n/**\n* Extracts a portion of text based on token positions, similar to Array.prototype.slice().\n*/\nfunction sliceByTokens(text, start = 0, end, options = {}) {\n\tif (!text) return \"\";\n\tconst { defaultCharsPerToken = DEFAULT_CHARS_PER_TOKEN, languageConfigs = DEFAULT_LANGUAGE_CONFIGS } = options;\n\tlet totalTokens = 0;\n\tif (start < 0 || end !== void 0 && end < 0) totalTokens = estimateTokenCount(text, options);\n\tconst normalizedStart = start < 0 ? Math.max(0, totalTokens + start) : Math.max(0, start);\n\tconst normalizedEnd = end === void 0 ? Infinity : end < 0 ? Math.max(0, totalTokens + end) : end;\n\tif (normalizedStart >= normalizedEnd) return \"\";\n\tconst segments = text.split(TOKEN_SPLIT_PATTERN).filter(Boolean);\n\tconst parts = [];\n\tlet currentTokenPos = 0;\n\tfor (const segment of segments) {\n\t\tif (currentTokenPos >= normalizedEnd) break;\n\t\tconst tokenCount = estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken);\n\t\tconst extracted = extractSegmentPart(segment, currentTokenPos, tokenCount, normalizedStart, normalizedEnd);\n\t\tif (extracted) parts.push(extracted);\n\t\tcurrentTokenPos += tokenCount;\n\t}\n\treturn parts.join(\"\");\n}\n/**\n* Splits text into chunks based on token count.\n*/\nfunction splitByTokens(text, tokensPerChunk, options = {}) {\n\tif (!text || tokensPerChunk <= 0) return [];\n\tconst { defaultCharsPerToken = DEFAULT_CHARS_PER_TOKEN, languageConfigs = DEFAULT_LANGUAGE_CONFIGS, overlap = 0 } = options;\n\tconst segments = text.split(TOKEN_SPLIT_PATTERN).filter(Boolean);\n\tconst chunks = [];\n\tlet currentChunk = [];\n\tlet currentTokenCount = 0;\n\tfor (const segment of segments) {\n\t\tconst tokenCount = estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken);\n\t\tcurrentChunk.push(segment);\n\t\tcurrentTokenCount += tokenCount;\n\t\tif (currentTokenCount >= tokensPerChunk) {\n\t\t\tchunks.push(currentChunk.join(\"\"));\n\t\t\tif (overlap > 0) {\n\t\t\t\tconst overlapSegments = [];\n\t\t\t\tlet overlapTokenCount = 0;\n\t\t\t\tfor (let i = currentChunk.length - 1; i >= 0 && overlapTokenCount < overlap; i--) {\n\t\t\t\t\tconst segmentValue = currentChunk[i];\n\t\t\t\t\tconst tokCount = estimateSegmentTokens(segmentValue, languageConfigs, defaultCharsPerToken);\n\t\t\t\t\toverlapSegments.unshift(segmentValue);\n\t\t\t\t\toverlapTokenCount += tokCount;\n\t\t\t\t}\n\t\t\t\tcurrentChunk = overlapSegments;\n\t\t\t\tcurrentTokenCount = overlapTokenCount;\n\t\t\t} else {\n\t\t\t\tcurrentChunk = [];\n\t\t\t\tcurrentTokenCount = 0;\n\t\t\t}\n\t\t}\n\t}\n\tif (currentChunk.length > 0) chunks.push(currentChunk.join(\"\"));\n\treturn chunks;\n}\nfunction estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken) {\n\tif (PATTERNS.whitespace.test(segment)) return 0;\n\tif (PATTERNS.cjk.test(segment)) return getCharacterCount(segment);\n\tif (PATTERNS.numeric.test(segment)) return 1;\n\tif (segment.length <= SHORT_TOKEN_THRESHOLD) return 1;\n\tif (PATTERNS.punctuation.test(segment)) return segment.length > 1 ? Math.ceil(segment.length / 2) : 1;\n\tif (PATTERNS.alphanumeric.test(segment)) {\n\t\tconst charsPerToken$1 = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;\n\t\treturn Math.ceil(segment.length / charsPerToken$1);\n\t}\n\tconst charsPerToken = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;\n\treturn Math.ceil(segment.length / charsPerToken);\n}\nfunction getLanguageSpecificCharsPerToken(segment, languageConfigs) {\n\tfor (const config of languageConfigs) if (config.pattern.test(segment)) return config.averageCharsPerToken;\n}\nfunction getCharacterCount(text) {\n\treturn Array.from(text).length;\n}\nfunction extractSegmentPart(segment, segmentTokenStart, segmentTokenCount, targetStart, targetEnd) {\n\tif (segmentTokenCount === 0) return segmentTokenStart >= targetStart && segmentTokenStart < targetEnd ? segment : \"\";\n\tconst segmentTokenEnd = segmentTokenStart + segmentTokenCount;\n\tif (segmentTokenStart >= targetEnd || segmentTokenEnd <= targetStart) return \"\";\n\tconst overlapStart = Math.max(0, targetStart - segmentTokenStart);\n\tconst overlapEnd = Math.min(segmentTokenCount, targetEnd - segmentTokenStart);\n\tif (overlapStart === 0 && overlapEnd === segmentTokenCount) return segment;\n\tconst charStart = Math.floor(overlapStart / segmentTokenCount * segment.length);\n\tconst charEnd = Math.ceil(overlapEnd / segmentTokenCount * segment.length);\n\treturn segment.slice(charStart, charEnd);\n}\n\n//#endregion\nexport { approximateTokenSize, estimateTokenCount, isWithinTokenLimit, sliceByTokens, splitByTokens };", "import type { Tool } from \"ai\"\nimport { z } from \"zod/v4\"\n\n/**\n * Converts a tool's schema to a JSON string suitable for token estimation.\n *\n * Tool schemas stored as `inputSchema` are raw Zod v4 schema objects whose\n * `JSON.stringify` output includes the full Zod internal representation \u2014\n * often 8-10x larger than the JSON Schema that the AI SDK actually sends to\n * providers. This caused the debugbar token estimate for tools to be wildly\n * inflated (e.g. 130k estimated vs 5k actual).\n *\n * This helper detects Zod schemas via the Standard Schema interface\n * (`~standard`) and converts them to JSON Schema with `z.toJSONSchema()`\n * before stringifying, matching the representation that providers receive.\n */\nexport function stringifyToolSchema(tool: Tool): string {\n\tconst schema: unknown = (tool as { inputSchema?: unknown }).inputSchema ?? {}\n\n\tif (isZodSchema(schema)) {\n\t\ttry {\n\t\t\treturn JSON.stringify(z.toJSONSchema(schema))\n\t\t} catch {\n\t\t\t// Fall back to raw stringify if conversion fails.\n\t\t}\n\t}\n\n\ttry {\n\t\treturn JSON.stringify(schema)\n\t} catch {\n\t\treturn \"{}\"\n\t}\n}\n\nfunction isZodSchema(value: unknown): value is z.ZodType {\n\tif (typeof value !== \"object\" || value === null) return false\n\tconst standard = (value as Record<string, unknown>)[\"~standard\"]\n\tif (typeof standard !== \"object\" || standard === null) return false\n\treturn (standard as Record<string, unknown>).vendor === \"zod\"\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport type { AssistantContent, ModelMessage, ToolContent, ToolSet, UserContent } from \"ai\"\nimport { estimateTokenCount } from \"tokenx\"\nimport { stringifyToolSchema } from \"./toolSchema.ts\"\n\ninterface MessageContentTokenEstimate {\n\tindex: number\n\ttype: string\n\testimatedTokens: number\n}\n\ninterface MessageTokenEstimate {\n\tindex: number\n\trole: ModelMessage[\"role\"]\n\testimatedTokens: number\n\tcontents: readonly MessageContentTokenEstimate[]\n}\n\ninterface ToolTokenEstimate {\n\tname: string\n\testimatedTokens: number\n}\n\nexport function estimateTextTokens(text: string): number {\n\treturn estimateTokenCount(text)\n}\n\nfunction getModelMessageTokenEstimates(modelMessages: readonly ModelMessage[]): {\n\ttotalEstimatedTokens: number\n\tmessageEstimates: readonly MessageTokenEstimate[]\n} {\n\tlet totalEstimatedTokens = 0\n\tconst messageEstimates = modelMessages.map((message, index) => {\n\t\tconst { totalEstimatedTokens: estimatedTokens, contents } = extractMessageContentTokenEstimates(message)\n\t\ttotalEstimatedTokens += estimatedTokens\n\t\treturn { index, role: message.role, estimatedTokens, contents }\n\t})\n\treturn { totalEstimatedTokens, messageEstimates }\n}\n\nexport function getStreamRequestTokenEstimates(\n\tmodelMessages: readonly ModelMessage[],\n\tsystem: string,\n\ttools: ToolSet,\n): {\n\ttotalEstimatedTokens: number\n\tmessageEstimates: readonly MessageTokenEstimate[]\n\tsystemEstimatedTokens: number\n\ttoolEstimatedTokens: number\n\ttoolEstimates: readonly ToolTokenEstimate[]\n} {\n\tconst { totalEstimatedTokens: messageTokens, messageEstimates } = getModelMessageTokenEstimates(modelMessages)\n\tconst systemEstimatedTokens = estimateTokenCount(system)\n\tconst { totalEstimatedTokens: toolEstimatedTokens, toolEstimates } = getToolTokenEstimates(tools)\n\n\treturn {\n\t\ttotalEstimatedTokens: messageTokens + systemEstimatedTokens + toolEstimatedTokens,\n\t\tmessageEstimates,\n\t\tsystemEstimatedTokens,\n\t\ttoolEstimatedTokens,\n\t\ttoolEstimates,\n\t}\n}\n\ntype ModelContentPart =\n\t| Exclude<AssistantContent, string>[number]\n\t| Exclude<UserContent, string>[number]\n\t| ToolContent[number]\n\nfunction extractMessageContentTokenEstimates(message: ModelMessage): {\n\ttotalEstimatedTokens: number\n\tcontents: readonly MessageContentTokenEstimate[]\n} {\n\tconst { content } = message\n\n\tif (typeof content === \"string\") {\n\t\tconst estimatedTokens = estimateTextTokens(content)\n\t\treturn { totalEstimatedTokens: estimatedTokens, contents: [{ index: 0, type: \"text\", estimatedTokens }] }\n\t}\n\n\tconst contentEstimates: MessageContentTokenEstimate[] = []\n\tlet totalEstimatedTokens = 0\n\n\tcontent.forEach((part, index) => {\n\t\tconst extracted = extractPartText(part)\n\t\tif (!extracted) return\n\n\t\tconst estimatedTokens = estimateTextTokens(extracted.value)\n\t\ttotalEstimatedTokens += estimatedTokens\n\t\tcontentEstimates.push({ index, type: extracted.type, estimatedTokens })\n\t})\n\n\treturn { totalEstimatedTokens, contents: contentEstimates }\n}\n\nfunction getToolTokenEstimates(tools: ToolSet): {\n\ttotalEstimatedTokens: number\n\ttoolEstimates: readonly ToolTokenEstimate[]\n} {\n\tconst toolEstimates = Object.entries(tools).map(([name, tool]) => {\n\t\tconst schema = stringifyToolSchema(tool)\n\t\tconst description = tool.description ?? \"\"\n\t\tconst text = `${name} ${description} ${schema}`\n\t\treturn { name, estimatedTokens: estimateTextTokens(text) }\n\t})\n\tconst totalEstimatedTokens = toolEstimates.reduce((sum, tool) => sum + tool.estimatedTokens, 0)\n\treturn { totalEstimatedTokens, toolEstimates }\n}\n\nfunction extractPartText(part: ModelContentPart): { type: string; value: string } | undefined {\n\tswitch (part.type) {\n\t\tcase \"text\":\n\t\tcase \"reasoning\":\n\t\t\treturn { type: part.type, value: part.text }\n\t\tcase \"tool-call\":\n\t\t\treturn { type: part.type, value: `${part.toolName} ${stringifyUnknown(part.input)}` }\n\t\tcase \"tool-result\":\n\t\t\treturn { type: part.type, value: `${part.toolName} ${stringifyUnknown(part.output)}` }\n\t\tcase \"image\":\n\t\tcase \"file\":\n\t\tcase \"tool-approval-request\":\n\t\tcase \"tool-approval-response\":\n\t\t\treturn undefined\n\t\tdefault:\n\t\t\tassertNever(part)\n\t}\n}\n\nfunction stringifyUnknown(value: unknown): string {\n\tif (typeof value === \"string\") return value\n\ttry {\n\t\treturn JSON.stringify(value) ?? \"\"\n\t} catch {\n\t\treturn \"\"\n\t}\n}\n", "import type { AIContextNode } from \"../../context/nodes.ts\"\nimport { estimateTextTokens } from \"../../tokens.ts\"\n\nexport function* packNodesIntoTokenBudgetBatches(\n\tnodes: readonly AIContextNode[],\n\tmaxTokens: number,\n): Generator<{ nodes: readonly AIContextNode[]; final: boolean }> {\n\tif (nodes.length === 0) return\n\n\tlet startIndex = 0\n\twhile (startIndex < nodes.length) {\n\t\tlet batchSize = 0\n\t\tlet totalNodeTokens = 0\n\n\t\twhile (startIndex + batchSize < nodes.length) {\n\t\t\tconst node = nodes[startIndex + batchSize]\n\t\t\tconst nextNodeTokens = estimateTextTokens(JSON.stringify(node))\n\t\t\tif (batchSize > 0 && totalNodeTokens + nextNodeTokens > maxTokens) break\n\t\t\ttotalNodeTokens += nextNodeTokens\n\t\t\tbatchSize++\n\t\t}\n\n\t\tyield {\n\t\t\tnodes: nodes.slice(startIndex, startIndex + batchSize),\n\t\t\tfinal: startIndex + batchSize === nodes.length,\n\t\t}\n\n\t\tstartIndex += batchSize\n\t}\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { generateText, Output, type UserModelMessage } from \"ai\"\nimport { createVekterOpenRouterExtraBody, openRouter } from \"app/ai/config/openRouter.ts\"\nimport { LanguageModel } from \"app/ai/languageModels.ts\"\nimport { getOpenRouterCostFromMetadata } from \"app/ai/utils/openRouterUsage.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { z } from \"zod/v4\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { getName, type AIContextNode } from \"../../context/nodes.ts\"\nimport { createBlock } from \"../../fencedBlock.ts\"\nimport { cms } from \"../../prompt/cms.ts\"\nimport { buildVariables } from \"../../prompt/componentRules.ts\"\nimport { richTextRules } from \"../../prompt/designRules.ts\"\nimport { eventHandlers } from \"../../prompt/eventHandlers.ts\"\nimport { Markdown } from \"../../prompt/markdown.ts\"\nimport { overlayRules } from \"../../prompt/overlayRules.ts\"\nimport { buildReplicas } from \"../../prompt/replicas.ts\"\nimport { scopeTypes } from \"../../prompt/scopeTypes.ts\"\nimport { transitions } from \"../../prompt/transitions.ts\"\nimport { escapeValue, formatNestedArray } from \"../../prompt/utils.ts\"\nimport type { Source } from \"../../source.ts\"\nimport type { ChatPart, ChatPartUpdater, EmitChatPart } from \"../../types.ts\"\nimport {\n\tcreateFinalDesignPatterns,\n\tdesignPatternsSchema,\n\textractDesignReferences,\n\tcreateColorsToAvoid,\n\tcreateTextStylesToAvoid,\n\tcreateObservedProjectReferences,\n\tserializeDesignReferences,\n\ttype ExtractDesignPatternsOptions,\n} from \"./extractDesignPatterns.ts\"\nimport { packNodesIntoTokenBudgetBatches } from \"./packNodesIntoTokenBudgetBatches.ts\"\nimport type { DesignPatterns, SearchResult, SearchSessionResult } from \"./types.ts\"\n\n// This module has three LLM-backed flows:\n// - analyze: answer an arbitrary question about a provided node set.\n// - extractDesignPatterns: turn reference nodes into reusable design guidance.\n// - SearchSessionStore: search large node sets across token-budgeted batches.\nconst searchNodeBatchTargetTokens = 1_000_000\nconst searchNodeBatchHeadroomTokens = 10_000\n\n/**\n * Builds the shared system prompt used by all intelligence calls.\n *\n * Each caller provides a short task overview, and this function appends the common\n * document-model reading rules so the model interprets serialized nodes consistently.\n */\nfunction createSystemPrompt(\n\toverview: ReturnType<typeof Markdown.section>,\n\t...sections: ReturnType<typeof Markdown.section>[]\n): string {\n\tconst source: Source = { agent: \"app\", prompt: \"in-app\" }\n\treturn Markdown.serialize(\n\t\toverview,\n\t\t...sections,\n\t\tMarkdown.section(\n\t\t\t\"How to read the provided json\",\n\t\t\tscopeTypes,\n\t\t\tbuildReplicas(source),\n\t\t\tcms(source),\n\t\t\tbuildVariables(source),\n\t\t\tMarkdown.section(\"Transitions\", ...transitions),\n\t\t\toverlayRules,\n\t\t\teventHandlers(source),\n\t\t\tMarkdown.section(\"Rich Text Structure\", formatNestedArray(richTextRules)),\n\t\t),\n\t)\n}\n\n/**\n * Creates the single user message shape used for model calls in this file.\n *\n * The free-form prompt explains the task, while the second content part gives the\n * raw serialized node context the model must ground its answer in.\n */\nfunction createUserMessage(prompt: string, nodes: readonly AIContextNode[]): UserModelMessage {\n\treturn {\n\t\trole: \"user\",\n\t\tcontent: [\n\t\t\t{ type: \"text\", text: prompt },\n\t\t\t{ type: \"text\", text: createBlock(\"json\", JSON.stringify(nodes)) },\n\t\t],\n\t}\n}\n\n/**\n * Creates the OpenRouter model instance and tags usage with the logical step name.\n */\nfunction createModel({ step }: { step: string }) {\n\treturn openRouter(LanguageModel.Gemini31FlashLite, {\n\t\textraBody: createVekterOpenRouterExtraBody({\n\t\t\tfeatureCategory: \"agents\",\n\t\t\tfeatureName: \"agents\",\n\t\t\tstep,\n\t\t\tsessionId: \"analyze\",\n\t\t}),\n\t})\n}\n\n/**\n * Answers an arbitrary question about the provided context nodes.\n *\n * This is the simplest flow in the module: it sends the prompt plus nodes to the\n * model, then returns the raw text answer and cost.\n */\nexport async function analyze(\n\tprompt: string,\n\tnodes: readonly AIContextNode[],\n\tsignal?: AbortSignal,\n): Promise<{ text: string; cost: number }> {\n\tconst result = await generateText({\n\t\tmaxRetries: 1,\n\t\ttimeout: 5_000,\n\t\tabortSignal: signal,\n\t\tmodel: createModel({ step: \"analyze\" }),\n\t\tsystem: createSystemPrompt(\n\t\t\tMarkdown.section(\n\t\t\t\t\"Overview\",\n\t\t\t\t`You are an assistant that performs analysis on Framer's document model.`,\n\t\t\t\t`Answer the prompt with concrete and objective answers based on the provided context nodes.`,\n\t\t\t\t`Return only the answer, no other text or formatting.`,\n\t\t\t),\n\t\t),\n\t\tmessages: [createUserMessage(prompt, nodes)],\n\t})\n\n\treturn { text: result.text, cost: getOpenRouterCostFromMetadata(result.providerMetadata) }\n}\n\ninterface SearchNodeBatch {\n\treadonly nodes: readonly AIContextNode[]\n}\n\ninterface SearchBatchResult {\n\treadonly result: SearchResult[]\n\treadonly cost: number\n\treadonly final: boolean\n}\n\ninterface SearchSessionState {\n\treadonly iterator: AsyncIterator<SearchBatchResult>\n\treadonly updater?: ChatPartUpdater<Extract<ChatPart, { type: \"blocking-task\" }>>\n}\n\nconst maxTokens = searchNodeBatchTargetTokens - searchNodeBatchHeadroomTokens\n\n/**\n * Searches a potentially large node list by streaming one model call per token-budgeted batch.\n *\n * The generator yields after each batch so callers can expose partial results and\n * resume later instead of forcing one long blocking call.\n */\nasync function* search(\n\tquery: string,\n\tnodes: readonly AIContextNode[],\n\tsignal?: AbortSignal,\n\tonBatchStart?: (batch: SearchNodeBatch) => void,\n): AsyncGenerator<SearchBatchResult> {\n\tlet i = 0\n\tfor (const batch of packNodesIntoTokenBudgetBatches(nodes, maxTokens)) {\n\t\ti++\n\n\t\tonBatchStart?.(batch)\n\n\t\t// Each batch is intentionally isolated so the model only returns matches from the current chunk.\n\t\tconst result = await generateText({\n\t\t\tmaxRetries: 1,\n\t\t\ttimeout: 10_000,\n\t\t\tabortSignal: signal,\n\t\t\toutput: Output.object({\n\t\t\t\tschema: z.object({\n\t\t\t\t\tresult: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\tid: z.string().describe(\"The id of the node that matches the query.\"),\n\t\t\t\t\t\t\treason: z.string().describe(\"Why this node matches the query.\"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t}),\n\t\t\tmodel: createModel({ step: \"search\" }),\n\t\t\tsystem: createSystemPrompt(\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"Overview\",\n\t\t\t\t\t`You are an assistant that performs chunked search over Framer's document model.`,\n\t\t\t\t\t`Answer the query using only the nodes in this chunk.`,\n\t\t\t\t\t`Return only the answer, no other text or formatting.`,\n\t\t\t\t),\n\t\t\t),\n\t\t\tmessages: [createUserMessage([query, `Analysis batch ${i}.`].join(\"\\n\"), batch.nodes)],\n\t\t})\n\n\t\tyield {\n\t\t\tresult: result.output.result,\n\t\t\tfinal: batch.final,\n\t\t\tcost: getOpenRouterCostFromMetadata(result.providerMetadata),\n\t\t}\n\t}\n}\n\n/**\n * Marks a blocking chat task as finished while preserving the original return value.\n */\nfunction sendFinalResult<T>(result: T, updater?: ChatPartUpdater<Extract<ChatPart, { type: \"blocking-task\" }>>): T {\n\tupdater?.((_, completedAt) => ({ completedAt }))\n\treturn result\n}\n\nfunction createSearchPart(): Extract<ChatPart, { type: \"blocking-task\" }> {\n\treturn {\n\t\ttype: \"blocking-task\",\n\t\ttask: \"search\",\n\t\t// Put a random key in the metadata to ensure the part is unique.\n\t\tmetadata: { key: Math.random(), pages: emptyArray<string>() },\n\t}\n}\n\n/**\n * Owns cursor-based pagination for chunked search sessions.\n *\n * `start` runs the first batch immediately. If more batches remain, the async\n * iterator is stored behind a numeric cursor so script callers can request more\n * results with `continue` or clean up early with `release`.\n */\nexport class SearchSessionStore {\n\tprivate readonly sessions = new Map<number, SearchSessionState>()\n\tprivate nextCursor = 0\n\n\t/**\n\t * Starts a search session and returns the first batch of results.\n\t *\n\t * If the first batch is also the final batch, no cursor is stored.\n\t */\n\tasync start(\n\t\tquery: string,\n\t\tnodes: readonly AIContextNode[],\n\t\tsignal?: AbortSignal,\n\t\tonPart?: EmitChatPart,\n\t): Promise<SearchSessionResult> {\n\t\tconst updater = onPart?.(createSearchPart())?.ui\n\n\t\tconst iterator = search(query, nodes, signal, async batch => {\n\t\t\tconst names = batch.nodes.map(node => getName(node) ?? \"page\")\n\t\t\tupdater?.(() => ({ metadata: { pages: names } }))\n\t\t})[Symbol.asyncIterator]()\n\n\t\ttry {\n\t\t\tconst first = await iterator.next()\n\t\t\tif (first.done || !first.value) {\n\t\t\t\treturn sendFinalResult({ result: undefined, nextCursor: undefined, cost: 0 }, updater)\n\t\t\t}\n\n\t\t\tif (first.value.final) {\n\t\t\t\treturn sendFinalResult({ result: first.value.result, nextCursor: undefined, cost: first.value.cost }, updater)\n\t\t\t}\n\n\t\t\t// More batches remain, so keep the iterator alive behind an opaque cursor.\n\t\t\tconst cursor = this.nextCursor++\n\t\t\tthis.sessions.set(cursor, { iterator, updater })\n\t\t\treturn { result: first.value.result, nextCursor: cursor, cost: first.value.cost }\n\t\t} catch (error) {\n\t\t\t// Mark the session as completed even if the error is thrown.\n\t\t\tupdater?.((_, completedAt) => ({ completedAt }))\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/**\n\t * Runs the next batch for an existing search cursor.\n\t *\n\t * The cursor remains valid until the generator reports the final batch or throws.\n\t */\n\tasync continue(cursor: number): Promise<SearchSessionResult> {\n\t\tconst state = this.sessions.get(cursor)\n\t\tif (!state) throw new Error(`api.search could not find cursor ${cursor}.`)\n\n\t\ttry {\n\t\t\tconst next = await state.iterator.next()\n\t\t\tif (!next.done && next.value.final === false) {\n\t\t\t\treturn { result: next.value.result, cost: next.value.cost, nextCursor: cursor }\n\t\t\t}\n\n\t\t\tthis.sessions.delete(cursor)\n\n\t\t\treturn sendFinalResult(\n\t\t\t\t{ result: next.value?.result, nextCursor: undefined, cost: next.value?.cost ?? 0 },\n\t\t\t\tstate.updater,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tthis.sessions.delete(cursor)\n\t\t\t// Mark the session as completed even if the error is thrown.\n\t\t\tstate.updater?.((_, completedAt) => ({ completedAt }))\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/**\n\t * Releases a search cursor without reading all remaining batches.\n\t *\n\t * Scripts do not need to iterate all batches, so this removes the session and lets the async\n\t * iterator clean up if the caller stops early.\n\t */\n\tasync release(cursor: number): Promise<void> {\n\t\tconst state = this.sessions.get(cursor)\n\t\tif (!state) return\n\n\t\tthis.sessions.delete(cursor)\n\n\t\ttry {\n\t\t\tawait state.iterator.return?.()\n\t\t} finally {\n\t\t\tstate.updater?.((_, completedAt) => ({ completedAt }))\n\t\t}\n\t}\n}\n\nfunction fencedJson(value: unknown): string {\n\treturn createBlock(\"json\", JSON.stringify(value))\n}\n\nconst observedDesignReferenceTitle = \"Observed Design Reference Values\"\n\n/**\n * Extracts reusable design patterns from reference nodes.\n *\n * Flow:\n * 1. Locally collect observed values and project-level avoid lists.\n * 2. Ask the model to turn those observations into structured pattern rows.\n * 3. Reconcile the model output against the observed reference matrix.\n */\nexport async function extractDesignPatterns(\n\tctx: AgentContext,\n\tnodes: readonly CanvasNode[],\n\tcontext: readonly AIContextNode[],\n\toptions: ExtractDesignPatternsOptions = {},\n): Promise<{ patterns: DesignPatterns; cost: number }> {\n\t// Reduce the the context nodes into a dense list of observed values.\n\tconst designReferences = await extractDesignReferences(ctx, nodes)\n\n\t// Create a list of project references that the model can use to name tokens and text styles.\n\tconst contextSystemReferences = createObservedProjectReferences(options.projectReferences, designReferences)\n\n\t// Format the design references into a checklist for the model.\n\tconst spacing = serializeDesignReferences(designReferences.spacing)\n\tconst colors = serializeDesignReferences(designReferences.colors)\n\tconst components = serializeDesignReferences(designReferences.components)\n\tconst radii = serializeDesignReferences(designReferences.radii)\n\tconst typography = serializeDesignReferences(designReferences.typography)\n\tconst surfaces = serializeDesignReferences(designReferences.surfaces)\n\tconst layout = serializeDesignReferences(designReferences.layout)\n\tconst shadows = serializeDesignReferences(designReferences.shadows)\n\n\tconst result = await generateText({\n\t\tmaxRetries: 1,\n\t\ttimeout: 10_000,\n\t\tabortSignal: options.signal,\n\t\toutput: Output.object({ schema: designPatternsSchema }),\n\t\tmodel: createModel({ step: \"extract-design-patterns\" }),\n\t\tsystem: createSystemPrompt(\n\t\t\tMarkdown.section(\n\t\t\t\t\"Overview\",\n\t\t\t\t`You are an assistant that extracts reusable design patterns from Framer's document model.`,\n\t\t\t\t`Return structured, concrete patterns that help an agent match an existing project's design system.`,\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Design Pattern Extraction Instructions\",\n\t\t\t\t\"Create a practical design plan from the provided Framer reference nodes.\",\n\t\t\t\tMarkdown.section(\"Reference Keys\", [\n\t\t\t\t\t\"- Return concrete usage patterns, not a high-level aesthetic summary.\",\n\t\t\t\t\t\"- Build an operational matrix, not a representative sample.\",\n\t\t\t\t\t`- Use ${escapeValue(observedDesignReferenceTitle)} below as the reference checklist.`,\n\t\t\t\t\t`- Every row you return should include a ${escapeValue(\"referenceKeys\")} array with exact ${escapeValue(\"referenceKey\")} values from the category arrays under ${escapeValue(observedDesignReferenceTitle)}.`,\n\t\t\t\t\t`- Only include a ${escapeValue(\"referenceKey\")} in ${escapeValue(\"referenceKeys\")} when the row explains that exact observed value and property context.`,\n\t\t\t\t\t`- Every entry in each category array under ${escapeValue(observedDesignReferenceTitle)} must either receive a row in the matching output category or be folded into a row that names that exact value.`,\n\t\t\t\t\t`- Do not treat the ${escapeValue(observedDesignReferenceTitle)} category arrays as mere examples; they are the exhaustive observed values from the reference nodes.`,\n\t\t\t\t\t\"- Do not stop at 1-2 rows for colors, typography, spacing, components, radii, surfaces, layout, or shadows when more observed values exist.\",\n\t\t\t\t\t\"- Target 5-12 rows per populated category when the source has enough distinct values.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Rows\", [\n\t\t\t\t\t\"- If the same value appears in different semantic contexts, create separate rows instead of merging them.\",\n\t\t\t\t\t\"- A value observed only once should be described as a one-off/local pattern unless there is strong structural evidence it is a reusable component or token role.\",\n\t\t\t\t\t\"- Each row must explain when to use a concrete value and include example node ids from the provided nodes.\",\n\t\t\t\t\t`- Keep the output dense: ${escapeValue(\"examples\")} must be plain node id strings, not objects, prose, or evidence explanations.`,\n\t\t\t\t\t`- Prefer example ids that are useful containers or styled nodes the caller can inspect by ID.`,\n\t\t\t\t\t\"- Use breakpoint-specific rows **only** when a value's usage differs by breakpoint or media query.\",\n\t\t\t\t\t\"- When evidence is weak for a category, e.g. there are is no typography in the requested nodes, return an empty array instead of inventing patterns.\",\n\t\t\t\t\t`- Never omit ${escapeValue(\"whenToUse\")} guidance for any row.`,\n\t\t\t\t\t`- Every example id must come from the provided nodes.`,\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Colors\", [\n\t\t\t\t\t\"- Never merge text color usage with fill/surface/background usage just because the raw color value is the same.\",\n\t\t\t\t\t`- The same value used as a local surface fill and as repeated text color must become separate rows with different roles, ${escapeValue(\"examples\")}, and ${escapeValue(\"whenToUse\")} guidance.`,\n\t\t\t\t\t\"- A color observed only once as fill/surface/background must not be recommended for general dark backgrounds, high-contrast sections, branding, or future surfaces.\",\n\t\t\t\t\t`- For one-off colors, ${escapeValue(\"whenToUse\")} should say to reuse only when duplicating or closely matching the specific example node.`,\n\t\t\t\t\t\"- Before assigning a color role, carefully check whether the colored node is actually visible in the provided hierarchy. Do not infer reusable color roles from colors on nodes that appear hidden, fully covered by later siblings/overlays, transparent due to opacity, clipped away, or otherwise not visually exposed. If a color appears only on covered or non-visible nodes, omit it or describe it as non-visible implementation detail rather than design guidance.\",\n\t\t\t\t\t\"- Colors should explain semantic roles for tokens or raw colors, including property context like fill or textColor.\",\n\t\t\t\t\t\"- Project color references only include tokens observed in the reference nodes; do not invent or use other project color tokens.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Surfaces\", [\n\t\t\t\t\t\"- Image fills, video/image URLs, gradients, and other fill materials are valid surface/background patterns; describe them in surfaces, not colors\",\n\t\t\t\t\t\"- Surface rows should explain whether a fill is a page background, section image background, card surface, decorative material, or local asset-backed surface.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Typography\", [\n\t\t\t\t\t\"- Typography should use the same row shape: describe H1, H2, H3, body, label, and other observed text roles using presets when present or concrete inline construction when no preset is present.\",\n\t\t\t\t\t\"- Project text style preset references only include text styles observed in the reference nodes; do not invent or use other project text style presets.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Components\", [\n\t\t\t\t\t\"- Components should describe which components are default/common vs rare/high-emphasis.\",\n\t\t\t\t\t`- Every observed component value in ${escapeValue(\"Components\")} must be represented in the ${escapeValue(\"components\")} array unless it is folded into a broader row that names that exact component value.`,\n\t\t\t\t\t\"- Do not reduce components to only the most important 1-2 examples; component exhaustiveness matters because the caller may duplicate these examples directly.\",\n\t\t\t\t\t\"- When two component values have different names, parents, siblings, breakpoint, or placement, prefer separate rows instead of merging them.\",\n\t\t\t\t\t`- Component ${escapeValue(\"whenToUse\")} should mention observed placement context when the provided nodes make it clear.`,\n\t\t\t\t\t\"- Use parent and colocated sibling context from the provided nodes to avoid recommending a component outside the layout context where it was observed.\",\n\t\t\t\t\t\"- If a component is only observed next to text inside a prose/content block, do not recommend using it as a full-width page-level CTA.\",\n\t\t\t\t\t\"- A component observed once should be described as local/specific unless it is clearly a repeated component definition or layout primitive.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Spacing, Radii, And Layout\", [\n\t\t\t\t\t\"- Radii and spacing should distinguish use cases such as buttons, cards, sections, chips, hero spacing, and dense groups.\",\n\t\t\t\t]),\n\t\t\t\tMarkdown.section(\"Shadows\", [\n\t\t\t\t\t\"- Shadows include box-shadow CSS values from node properties and component controls.\",\n\t\t\t\t\t\"- A single shadow (e.g. one box-shadow layer) is distinct from a shadow stack (multiple comma-separated layers); treat them as separate patterns.\",\n\t\t\t\t\t\"- Describe the visual intent of each shadow: subtle elevation, card lift, deep drop, inset depression, layered depth, etc.\",\n\t\t\t\t\t\"- When the same shadow value appears on different node types (e.g. cards vs buttons), prefer separate rows with different roles.\",\n\t\t\t\t\t\"- A shadow observed only once should be described as a local/one-off effect unless structural repetition is evident.\",\n\t\t\t\t]),\n\t\t\t),\n\t\t),\n\t\tmessages: [\n\t\t\tcreateUserMessage(\n\t\t\t\tMarkdown.serialize(\n\t\t\t\t\tMarkdown.section(\n\t\t\t\t\t\tobservedDesignReferenceTitle,\n\t\t\t\t\t\tMarkdown.section(\"Spacing\", fencedJson(spacing)),\n\t\t\t\t\t\tMarkdown.section(\"Colors\", fencedJson(colors)),\n\t\t\t\t\t\tMarkdown.section(\"Components\", fencedJson(components)),\n\t\t\t\t\t\tMarkdown.section(\"Radii\", fencedJson(radii)),\n\t\t\t\t\t\tMarkdown.section(\"Typography\", fencedJson(typography)),\n\t\t\t\t\t\tMarkdown.section(\"Surfaces\", fencedJson(surfaces)),\n\t\t\t\t\t\tMarkdown.section(\"Layout\", fencedJson(layout)),\n\t\t\t\t\t\tMarkdown.section(\"Shadows\", fencedJson(shadows)),\n\t\t\t\t\t\tMarkdown.section(\"Project References\", fencedJson(contextSystemReferences ?? emptyArray())),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tcontext,\n\t\t\t),\n\t\t],\n\t})\n\n\treturn {\n\t\tpatterns: createFinalDesignPatterns(\n\t\t\tctx,\n\t\t\tresult.output,\n\t\t\tdesignReferences,\n\t\t\t{\n\t\t\t\tmessage:\n\t\t\t\t\t\"These color tokens exist in the project token list, but they were not observed in the analyzed reference nodes. Do not use these tokens or their resolved raw color values based on this extraction.\",\n\t\t\t\tvalues: createColorsToAvoid(options.projectReferences, designReferences),\n\t\t\t},\n\t\t\t{\n\t\t\t\tmessage:\n\t\t\t\t\t\"These text style presets exist in the project style preset list, but they were not observed in the analyzed reference nodes. Do not use them based on this extraction.\",\n\t\t\t\tvalues: createTextStylesToAvoid(options.projectReferences, designReferences),\n\t\t\t},\n\t\t),\n\t\tcost: getOpenRouterCostFromMetadata(result.providerMetadata),\n\t}\n}\n", "/* eslint-disable framer-studio/require-error-cause-in-catch */\nimport { assert, murmurHash } from \"@framerjs/shared\"\nimport { estimateTokenCount } from \"tokenx\"\nimport { isArray, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\n\ninterface PaginateResult {\n\tkeyName: string\n\ttotalResults: number\n\toffset: number\n\tresults: readonly unknown[]\n\tnextOffset?: number\n}\n\n/**\n * Cursor-based pagination payload returned to scripts.\n * The cursor is intentionally opaque and only valid inside the same `AgentContext`.\n */\nexport interface PaginateCursorResult {\n\tkeyName: string\n\ttotalResults: number\n\tcursor: number\n\tresults: readonly unknown[]\n\tnextCursor?: number\n}\n\nconst paginationTokenBudget = 50_000\n// Retention caps keep long-lived agent contexts from accumulating unbounded pagination state.\nconst maxScriptPaginationStoredKeys = 64\nconst maxScriptPaginationCursors = 1024\n// Pagination state is scoped to an AgentContext lifetime and released with the context via WeakMap GC.\nconst scriptPaginationCursorStateByContext = new WeakMap<AgentContext, ScriptPaginationCursorState>()\nconst scriptPaginationStorageStateByContext = new WeakMap<AgentContext, ScriptPaginationStorageState>()\n\ninterface ScriptPaginationCursorPayload {\n\tkeyName: string\n\toffset: number\n}\n\n/**\n * Cursor registry for one AgentContext.\n *\n * - `cursorByKey` stores opaque cursor -> payload.\n * - `keyBySerializedCursor` deduplicates payloads so the same (keyName, offset) reuses cursor ids.\n */\ninterface ScriptPaginationCursorState {\n\tnextCursorIndex: number\n\tcursorByKey: Map<number, ScriptPaginationCursorPayload>\n\tkeyBySerializedCursor: Map<string, number>\n}\n\n/**\n * Stored arrays for one AgentContext.\n * Arrays are keyed by generated key names and continued via cursor offsets.\n */\ninterface ScriptPaginationStorageState {\n\titemsByKey: Map<string, readonly unknown[]>\n\tnextKeyIndex: number\n}\n\n/**\n * Public script API entry-point.\n *\n * Usage contract:\n * - First page: `paginate(ctx, items, undefined)`\n * - Continuation: `paginate(ctx, keyName, cursor)`\n */\nexport function paginate(\n\tctx: AgentContext,\n\tinputOrKey: readonly unknown[] | string,\n\tcursor: number | undefined,\n): PaginateCursorResult {\n\tconst cursorState = getOrCreateScriptPaginationCursorState(ctx)\n\tconst storageState = getOrCreateScriptPaginationStorageState(ctx)\n\tif (isArray(inputOrKey) && !isUndefined(cursor)) {\n\t\tthrow new Error(\n\t\t\t\"api.paginate expected no cursor when paginating a fresh array. Use api.paginate(array) first, then api.paginate(keyName, cursor) for continuation.\",\n\t\t)\n\t}\n\n\tconst offset = getOffsetFromCursor(cursorState, inputOrKey, cursor)\n\tconst page = isString(inputOrKey)\n\t\t? paginateStoredArray(storageState, inputOrKey, offset ?? 0)\n\t\t: paginateFreshArray(storageState, cursorState, inputOrKey)\n\tconst result = toScriptPaginateResult(page, cursor, cursorState)\n\n\t// Once continuation reaches the terminal page there is no future resume path for this key.\n\t// We eagerly drop both stored items and key-specific cursors to free memory.\n\tif (isString(inputOrKey) && isUndefined(page.nextOffset)) {\n\t\tremoveScriptPaginationKey(storageState, cursorState, page.keyName)\n\t}\n\treturn result\n}\n\n/**\n * Converts internal offset-based pagination into cursor-based pagination for scripts.\n */\nfunction toScriptPaginateResult(\n\tpage: PaginateResult,\n\tcursor: number | undefined,\n\tcursorState: ScriptPaginationCursorState,\n): PaginateCursorResult {\n\t// Continuation calls keep the provided cursor as the current cursor.\n\t// Fresh calls mint a cursor for offset 0.\n\tconst currentCursor =\n\t\tcursor ??\n\t\tstoreScriptPaginationCursor(cursorState, {\n\t\t\tkeyName: page.keyName,\n\t\t\toffset: page.offset,\n\t\t})\n\n\t// `nextOffset` is translated into an opaque cursor token if more pages are available.\n\tconst nextCursor = !isUndefined(page.nextOffset)\n\t\t? storeScriptPaginationCursor(cursorState, {\n\t\t\t\tkeyName: page.keyName,\n\t\t\t\toffset: page.nextOffset,\n\t\t\t})\n\t\t: undefined\n\n\treturn {\n\t\tkeyName: page.keyName,\n\t\ttotalResults: page.totalResults,\n\t\tcursor: currentCursor,\n\t\tresults: page.results,\n\t\tnextCursor,\n\t}\n}\n\nfunction getOrCreateScriptPaginationCursorState(ctx: AgentContext): ScriptPaginationCursorState {\n\tconst existing = scriptPaginationCursorStateByContext.get(ctx)\n\tif (existing) return existing\n\n\tconst created: ScriptPaginationCursorState = {\n\t\tnextCursorIndex: 0,\n\t\tcursorByKey: new Map(),\n\t\tkeyBySerializedCursor: new Map(),\n\t}\n\tscriptPaginationCursorStateByContext.set(ctx, created)\n\treturn created\n}\n\nfunction getOrCreateScriptPaginationStorageState(ctx: AgentContext): ScriptPaginationStorageState {\n\tconst existing = scriptPaginationStorageStateByContext.get(ctx)\n\tif (existing) return existing\n\n\tconst created: ScriptPaginationStorageState = {\n\t\titemsByKey: new Map(),\n\t\tnextKeyIndex: 0,\n\t}\n\tscriptPaginationStorageStateByContext.set(ctx, created)\n\treturn created\n}\n\n/**\n * Returns a stable opaque cursor id for a `(keyName, offset)` pair.\n * Cursor ids are deterministic within a context and deduplicated by payload.\n */\nfunction storeScriptPaginationCursor(\n\tcursorState: ScriptPaginationCursorState,\n\tcursorPayload: ScriptPaginationCursorPayload,\n): number {\n\tconst serializedCursor = serializeScriptPaginationCursorPayload(cursorPayload)\n\tconst existing = cursorState.keyBySerializedCursor.get(serializedCursor)\n\tif (!isUndefined(existing)) {\n\t\tconst existingPayload = cursorState.cursorByKey.get(existing)\n\t\t// Touch existing cursors to keep frequently used continuation paths hot under the LRU cap.\n\t\tif (existingPayload) touchScriptPaginationCursor(cursorState, existing, existingPayload)\n\t\treturn existing\n\t}\n\n\tlet key = toOpaqueCursorKey(serializedCursor, cursorState.nextCursorIndex)\n\tcursorState.nextCursorIndex++\n\twhile (cursorState.cursorByKey.has(key)) {\n\t\tkey = toOpaqueCursorKey(serializedCursor, cursorState.nextCursorIndex)\n\t\tcursorState.nextCursorIndex++\n\t}\n\tassert(\n\t\tNumber.isSafeInteger(key) && key >= 0,\n\t\t\"Expected script pagination cursor key to be a safe non-negative integer\",\n\t)\n\n\tcursorState.cursorByKey.set(key, cursorPayload)\n\tcursorState.keyBySerializedCursor.set(serializedCursor, key)\n\tenforceScriptPaginationCursorLimit(cursorState)\n\treturn key\n}\n\n/**\n * Stable serialization shape used for cursor payload identity.\n */\nfunction serializeScriptPaginationCursorPayload(payload: ScriptPaginationCursorPayload): string {\n\treturn JSON.stringify([payload.keyName, payload.offset])\n}\n\n/**\n * Derives a non-sequential opaque numeric cursor key.\n * The sequence suffix keeps keys unique when hash collisions occur.\n */\nfunction toOpaqueCursorKey(serializedCursorPayload: string, sequence: number): number {\n\treturn murmurHash(`${serializedCursorPayload}:${sequence}`) >>> 0\n}\n\nfunction getPaginationKey(key: string): string {\n\tif (!isString(key) || key.trim().length === 0) {\n\t\tthrow new Error(\"api.paginate expected a non-empty key string.\")\n\t}\n\treturn key\n}\n\nfunction getOffsetFromCursor(\n\tcursorState: ScriptPaginationCursorState,\n\tinputOrKey: readonly unknown[] | string,\n\tcursor: number | undefined,\n): number | undefined {\n\tif (isUndefined(cursor)) return undefined\n\tif (!Number.isInteger(cursor) || cursor < 0) {\n\t\tthrow new Error(\"api.paginate expected 'cursor' to be a non-negative integer when provided.\")\n\t}\n\tif (!isString(inputOrKey)) {\n\t\tthrow new Error(\"api.paginate expected a key string when a cursor is provided.\")\n\t}\n\tconst payload = cursorState.cursorByKey.get(cursor)\n\tif (!payload) {\n\t\tthrow new Error(\"api.paginate expected a cursor returned by a previous api.paginate call.\")\n\t}\n\tif (payload.keyName !== inputOrKey) {\n\t\tthrow new Error(\"api.paginate expected the provided cursor to match the provided keyName.\")\n\t}\n\n\t// Successful use counts as recent access for cursor retention.\n\ttouchScriptPaginationCursor(cursorState, cursor, payload)\n\treturn payload.offset\n}\n\n/**\n * Stores a fresh array and returns the first token-budgeted page.\n */\nfunction paginateFreshArray(\n\tstorageState: ScriptPaginationStorageState,\n\tcursorState: ScriptPaginationCursorState,\n\titems: readonly unknown[],\n): PaginateResult {\n\tconst keyName = createPaginationStoreKey(storageState)\n\tconst itemSnapshot = createPaginationItemsSnapshot(items)\n\tstorageState.itemsByKey.set(keyName, itemSnapshot)\n\tenforceScriptPaginationStorageLimit(storageState, cursorState)\n\treturn buildPaginatedResponseFromItems(itemSnapshot, keyName, 0)\n}\n\n/**\n * Continues pagination over a previously stored array key.\n */\nfunction paginateStoredArray(\n\tstorageState: ScriptPaginationStorageState,\n\tinputOrKey: string,\n\toffset: number,\n): PaginateResult {\n\tconst keyName = getPaginationKey(inputOrKey)\n\tconst storedItems = storageState.itemsByKey.get(keyName)\n\tif (isUndefined(storedItems)) {\n\t\tthrow new Error(\"api.paginate expected a pagination key returned by api.paginate(array).\")\n\t}\n\ttouchScriptPaginationStorageKey(storageState, keyName, storedItems)\n\treturn buildPaginatedResponseFromItems(storedItems, keyName, offset)\n}\n\n/**\n * Maintains simple LRU order using Map insertion order.\n */\nfunction touchScriptPaginationStorageKey(\n\tstorageState: ScriptPaginationStorageState,\n\tkeyName: string,\n\tstoredItems: readonly unknown[],\n): void {\n\tstorageState.itemsByKey.delete(keyName)\n\tstorageState.itemsByKey.set(keyName, storedItems)\n}\n\n/**\n * Evicts least-recently-used stored arrays when the key cap is exceeded.\n */\nfunction enforceScriptPaginationStorageLimit(\n\tstorageState: ScriptPaginationStorageState,\n\tcursorState: ScriptPaginationCursorState,\n): void {\n\twhile (storageState.itemsByKey.size > maxScriptPaginationStoredKeys) {\n\t\tconst oldestKey = storageState.itemsByKey.keys().next().value\n\t\tif (isUndefined(oldestKey)) return\n\t\tremoveScriptPaginationKey(storageState, cursorState, oldestKey)\n\t}\n}\n\n/**\n * Removes stored array data and all cursors that refer to that array key.\n */\nfunction removeScriptPaginationKey(\n\tstorageState: ScriptPaginationStorageState,\n\tcursorState: ScriptPaginationCursorState,\n\tkeyName: string,\n): void {\n\tstorageState.itemsByKey.delete(keyName)\n\tremoveScriptPaginationCursorsForKey(cursorState, keyName)\n}\n\n/**\n * Cursor cleanup for one pagination key.\n */\nfunction removeScriptPaginationCursorsForKey(cursorState: ScriptPaginationCursorState, keyName: string): void {\n\tfor (const [cursorKey, payload] of cursorState.cursorByKey.entries()) {\n\t\tif (payload.keyName !== keyName) continue\n\t\tremoveScriptPaginationCursor(cursorState, cursorKey, payload)\n\t}\n}\n\n/**\n * Maintains LRU order for cursor entries.\n */\nfunction touchScriptPaginationCursor(\n\tcursorState: ScriptPaginationCursorState,\n\tcursorKey: number,\n\tpayload: ScriptPaginationCursorPayload,\n): void {\n\tcursorState.cursorByKey.delete(cursorKey)\n\tcursorState.cursorByKey.set(cursorKey, payload)\n}\n\n/**\n * Evicts least-recently-used cursor entries when cursor cap is exceeded.\n */\nfunction enforceScriptPaginationCursorLimit(cursorState: ScriptPaginationCursorState): void {\n\twhile (cursorState.cursorByKey.size > maxScriptPaginationCursors) {\n\t\tconst oldestCursor = cursorState.cursorByKey.entries().next().value\n\t\tif (isUndefined(oldestCursor)) return\n\t\tconst [cursorKey, payload] = oldestCursor\n\t\tremoveScriptPaginationCursor(cursorState, cursorKey, payload)\n\t}\n}\n\n/**\n * Removes a cursor and its reverse-lookup mapping when still pointing to that cursor id.\n */\nfunction removeScriptPaginationCursor(\n\tcursorState: ScriptPaginationCursorState,\n\tcursorKey: number,\n\tpayload: ScriptPaginationCursorPayload,\n): void {\n\tcursorState.cursorByKey.delete(cursorKey)\n\tconst serializedPayload = serializeScriptPaginationCursorPayload(payload)\n\tif (cursorState.keyBySerializedCursor.get(serializedPayload) === cursorKey) {\n\t\tcursorState.keyBySerializedCursor.delete(serializedPayload)\n\t}\n}\n\n/**\n * Generates monotonic key names for stored arrays.\n * Keys are internal only and are validated on continuation.\n */\nfunction createPaginationStoreKey(storageState: ScriptPaginationStorageState): string {\n\tconst timestamp = Date.now().toString(36)\n\tconst counter = (storageState.nextKeyIndex++).toString(36)\n\treturn `script-pagination:${timestamp}:${counter}`\n}\n\n/**\n * Deep snapshot of the input array at first-page time.\n * This guarantees continuation pages are stable even if caller mutates original input later.\n */\nfunction createPaginationItemsSnapshot(items: readonly unknown[]): readonly unknown[] {\n\ttry {\n\t\tconst snapshot = structuredClone(items)\n\t\tassert(isArray(snapshot), \"Expected structuredClone to preserve paginate input array shape\")\n\t\treturn snapshot\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`api.paginate expected a JSON-compatible array. Received value that could not be stringified: ${error instanceof Error ? error.message : String(error)}`,\n\t\t)\n\t}\n}\n\n/**\n * Builds the best page around `offset` under the token budget.\n *\n * Strategy:\n * - Grow incrementally while estimated size stays within budget.\n * - Once boundary is crossed, compare nearest under/over candidates and choose the closest.\n */\nfunction buildPaginatedResponseFromItems(items: readonly unknown[], keyName: string, offset: number): PaginateResult {\n\tconst safeOffset = Math.min(offset, items.length)\n\tconst totalResults = items.length\n\n\tif (safeOffset >= totalResults) {\n\t\treturn {\n\t\t\tkeyName: keyName,\n\t\t\ttotalResults: totalResults,\n\t\t\toffset: safeOffset,\n\t\t\tresults: [],\n\t\t}\n\t}\n\n\tconst estimationState = createPaginationEstimationState(keyName, safeOffset, totalResults)\n\tconst resultItems: unknown[] = []\n\n\tfor (let itemIndex = safeOffset; itemIndex < totalResults; itemIndex++) {\n\t\tconst item = items[itemIndex]\n\t\tconst candidateEnd = safeOffset + resultItems.length + 1\n\t\tconst candidateEstimatedTokens = estimateCandidatePaginationTokens(\n\t\t\testimationState,\n\t\t\titem,\n\t\t\tresultItems.length > 0,\n\t\t\ttotalResults,\n\t\t\tcandidateEnd,\n\t\t)\n\t\tif (candidateEstimatedTokens <= paginationTokenBudget) {\n\t\t\tresultItems.push(item)\n\t\t\tupdatePaginationEstimationState(estimationState, candidateEstimatedTokens, candidateEnd)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst boundaryItems = [...resultItems, item]\n\t\treturn chooseNearestPaginationResult(boundaryItems, keyName, safeOffset, totalResults, resultItems.length)\n\t}\n\n\treturn chooseNearestPaginationResult(resultItems, keyName, safeOffset, totalResults, resultItems.length)\n}\n\ninterface PaginationEstimationState {\n\tcurrentEnd: number\n\testimatedTokens: number\n}\n\n/**\n * Seeds estimation with the empty page at the current offset.\n */\nfunction createPaginationEstimationState(\n\tkeyName: string,\n\toffset: number,\n\ttotalResults: number,\n): PaginationEstimationState {\n\tconst baseResult = createPaginationResult([], keyName, offset, offset, totalResults)\n\treturn {\n\t\tcurrentEnd: offset,\n\t\testimatedTokens: estimatePaginatedResponseTokens(baseResult),\n\t}\n}\n\n/**\n * Fast incremental estimate for adding one item to the current page candidate.\n * Avoids full re-serialization on each loop iteration.\n */\nfunction estimateCandidatePaginationTokens(\n\tstate: PaginationEstimationState,\n\titem: unknown,\n\thasAcceptedItems: boolean,\n\ttotalResults: number,\n\tcandidateEnd: number,\n): number {\n\tlet estimatedTokens = state.estimatedTokens\n\testimatedTokens += estimateTokenCount(stringifyPaginationValue(item))\n\tif (hasAcceptedItems) {\n\t\testimatedTokens += estimateTokenCount(\",\")\n\t}\n\n\tconst currentEnd = state.currentEnd\n\tconst hadNextOffset = currentEnd < totalResults\n\tconst hasNextOffset = candidateEnd < totalResults\n\tif (hadNextOffset && hasNextOffset) {\n\t\testimatedTokens += estimateTokenCount(String(candidateEnd)) - estimateTokenCount(String(currentEnd))\n\t} else if (hadNextOffset && !hasNextOffset) {\n\t\testimatedTokens -= estimateTokenCount(`,\"nextOffset\":${currentEnd}`)\n\t} else if (!hadNextOffset && hasNextOffset) {\n\t\testimatedTokens += estimateTokenCount(`,\"nextOffset\":${candidateEnd}`)\n\t}\n\n\treturn estimatedTokens\n}\n\n/**\n * Commits latest estimate snapshot after accepting a candidate item.\n */\nfunction updatePaginationEstimationState(\n\tstate: PaginationEstimationState,\n\testimatedTokens: number,\n\tcurrentEnd: number,\n): void {\n\tstate.estimatedTokens = estimatedTokens\n\tstate.currentEnd = currentEnd\n}\n\n/**\n * Evaluates nearest candidate counts around the boundary and picks the closest page to budget.\n */\nfunction chooseNearestPaginationResult(\n\titems: readonly unknown[],\n\tkeyName: string,\n\toffset: number,\n\ttotalResults: number,\n\tpreferredUndershootCount: number,\n): PaginateResult {\n\tconst evaluationCache = new Map<number, { result: PaginateResult; tokens: number }>()\n\n\tconst evaluateCount = (count: number): { result: PaginateResult; tokens: number } => {\n\t\tconst existing = evaluationCache.get(count)\n\t\tif (existing) return existing\n\n\t\tconst end = offset + count\n\t\tconst result = createPaginationResult(items.slice(0, count), keyName, offset, end, totalResults)\n\t\tconst tokens = estimatePaginatedResponseTokens(result)\n\t\tconst evaluated = { result, tokens }\n\t\tevaluationCache.set(count, evaluated)\n\t\treturn evaluated\n\t}\n\n\tconst boundedPreferredUndershootCount = Math.max(0, Math.min(preferredUndershootCount, items.length))\n\tlet undershootCount = boundedPreferredUndershootCount\n\tlet undershoot = evaluateCount(undershootCount)\n\tif (undershoot.tokens > paginationTokenBudget && undershootCount > 0) {\n\t\tundershootCount = findMaxPaginationCountWithinBudget(evaluateCount, undershootCount)\n\t\tundershoot = evaluateCount(undershootCount)\n\t}\n\n\tconst overshootCount = Math.min(undershootCount + 1, items.length)\n\tif (overshootCount === undershootCount) {\n\t\treturn undershoot.result\n\t}\n\n\tconst overshoot = evaluateCount(overshootCount)\n\tif (overshoot.tokens > paginationTokenBudget) {\n\t\tif (undershootCount === 0) {\n\t\t\tthrow new Error(\"api.paginate could not fit even a single result within the pagination token budget.\")\n\t\t}\n\t\treturn undershoot.result\n\t}\n\tconst overshootDistance = Math.abs(overshoot.tokens - paginationTokenBudget)\n\tconst undershootDistance = Math.abs(paginationTokenBudget - undershoot.tokens)\n\n\treturn (overshootDistance <= undershootDistance ? overshoot : undershoot).result\n}\n\n/**\n * Binary-searches the maximum count that stays within budget.\n */\nfunction findMaxPaginationCountWithinBudget(\n\tevaluateCount: (count: number) => { result: PaginateResult; tokens: number },\n\tmaxCount: number,\n): number {\n\tlet low = 0\n\tlet high = maxCount\n\twhile (low < high) {\n\t\tconst mid = Math.ceil((low + high) / 2)\n\t\tconst midTokens = evaluateCount(mid).tokens\n\t\tif (midTokens <= paginationTokenBudget) {\n\t\t\tlow = mid\n\t\t} else {\n\t\t\thigh = mid - 1\n\t\t}\n\t}\n\treturn low\n}\n\n/**\n * Internal offset-based page shape.\n */\nfunction createPaginationResult(\n\tresults: readonly unknown[],\n\tkeyName: string,\n\toffset: number,\n\tend: number,\n\ttotalResults: number,\n): PaginateResult {\n\treturn {\n\t\tkeyName,\n\t\ttotalResults,\n\t\toffset,\n\t\tresults,\n\t\tnextOffset: end < totalResults ? end : undefined,\n\t}\n}\n\n/**\n * Estimates token usage of the exact serialized response object.\n */\nfunction estimatePaginatedResponseTokens(value: PaginateResult): number {\n\tconst serialized = stringifyPaginationValue(value)\n\treturn estimateTokenCount(serialized)\n}\n\n/**\n * Shared JSON serialization guard used both for page estimation and error reporting.\n */\nfunction stringifyPaginationValue(value: unknown): string {\n\ttry {\n\t\tconst serialized = JSON.stringify(value)\n\t\tif (serialized === undefined) {\n\t\t\tthrow new Error(\"Unexpected undefined serialization output\")\n\t\t}\n\t\treturn serialized\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`api.paginate expected a JSON-compatible array. Received value that could not be stringified: ${error instanceof Error ? error.message : String(error)}`,\n\t\t)\n\t}\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport {\n\ttype VirtualNodeId,\n\ttype VirtualRichTextNode,\n\ttype VirtualRichTextTextBlock,\n\ttype VirtualRichTextTextRun,\n\tisVirtualNodeId,\n\tisVirtualRichTextTextBlock,\n\tisVirtualRichTextTextRun,\n} from \"../../context/richtext/document.ts\"\nimport { resolveRichTextTargetHandle } from \"../../context/richtext/targets.ts\"\nimport { getVirtualRichTextChildren } from \"../../context/richtext/traversal.ts\"\nimport { CommandType } from \"../../dsl.ts\"\nimport { commandToDSL } from \"../../nodeToDSLCommands.ts\"\n\ninterface TextUpdate {\n\tid: string\n\ttext: string\n}\n\nexport interface ScriptReplaceTextInput {\n\tid: string\n\tsearchText: string\n\treplaceText: string\n}\n\nexport async function executeReplaceText(\n\tctx: AgentContext,\n\tinput: ScriptReplaceTextInput,\n\tapplyUpdateWithParser: (dsl: string) => Promise<string[]>,\n): Promise<boolean> {\n\tif (!isString(input.id) || input.id.trim().length === 0) {\n\t\tthrow new Error(\"api.replaceText expected a non-empty node id.\")\n\t}\n\tif (!isString(input.searchText) || input.searchText.length === 0) {\n\t\tthrow new Error(\"api.replaceText expected a non-empty search text.\")\n\t}\n\tif (!isString(input.replaceText)) {\n\t\tthrow new Error(\"api.replaceText expected replacement text to be a string.\")\n\t}\n\n\tconst resolvedId = ctx.treeResolver.resolveVirtualId(input.id)\n\tconst richTextUpdates = isVirtualNodeId(resolvedId)\n\t\t? getVirtualNodeUpdates(ctx, resolvedId, input.searchText, input.replaceText)\n\t\t: getRichTextTargetUpdates(ctx, resolvedId, input.searchText, input.replaceText)\n\tconst updates = richTextUpdates ?? emptyArray<TextUpdate>()\n\tif (updates.length === 0) return false\n\n\tawait applyUpdateWithParser(formatReplaceTextDSL(updates))\n\n\treturn true\n}\n\nfunction getVirtualNodeUpdates(\n\tctx: AgentContext,\n\tvirtualId: VirtualNodeId,\n\tsearchText: string,\n\treplaceText: string,\n): readonly TextUpdate[] {\n\tconst virtualNode = ctx.virtualText.resolve(virtualId)\n\tif (!virtualNode) return emptyArray()\n\n\tif (isVirtualRichTextTextRun(virtualNode)) {\n\t\tconst update = getUpdatedTextRun(virtualNode.id, virtualNode.text, searchText, replaceText)\n\t\treturn update ? [update] : emptyArray()\n\t}\n\n\tconst updates: TextUpdate[] = []\n\tcollectTextBlockUpdates(virtualNode, searchText, replaceText, updates)\n\treturn updates\n}\n\nfunction getRichTextTargetUpdates(\n\tctx: AgentContext,\n\tid: string,\n\tsearchText: string,\n\treplaceText: string,\n): readonly TextUpdate[] | undefined {\n\tconst handle = resolveRichTextTargetHandle(id, ctx)\n\tif (!handle) return\n\n\tctx.virtualText.hydrate(handle)\n\tconst document = ctx.virtualText.getDocument(handle.target)\n\tif (!document) return emptyArray()\n\n\tconst updates: TextUpdate[] = []\n\tcollectTextBlockUpdates(document.children, searchText, replaceText, updates)\n\n\treturn updates\n}\n\nfunction formatReplaceTextDSL(updates: readonly { id: string; text: string }[]): string {\n\treturn updates\n\t\t.map(({ id, text }) =>\n\t\t\tcommandToDSL({\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: { id, text },\n\t\t\t}),\n\t\t)\n\t\t.join(\" \")\n}\n\nfunction collectTextBlockUpdates(\n\tnodeOrNodes: VirtualRichTextNode | readonly VirtualRichTextNode[],\n\tsearchText: string,\n\treplaceText: string,\n\tupdates: TextUpdate[],\n): void {\n\tconst nodes = Array.isArray(nodeOrNodes) ? nodeOrNodes : [nodeOrNodes]\n\n\tfor (const node of nodes) {\n\t\tif (isVirtualRichTextTextBlock(node)) {\n\t\t\tcollectTextBlockRunUpdates(node, searchText, replaceText, updates)\n\t\t\tcontinue\n\t\t}\n\n\t\tcollectTextBlockUpdates(getVirtualRichTextChildren(node) ?? emptyArray(), searchText, replaceText, updates)\n\t}\n}\n\nfunction collectTextBlockRunUpdates(\n\tblock: VirtualRichTextTextBlock,\n\tsearchText: string,\n\treplaceText: string,\n\tupdates: TextUpdate[],\n): void {\n\tlet runs: VirtualRichTextTextRun[] = []\n\tconst processRuns = () => {\n\t\tif (runs.length === 0) return\n\t\tconst textRuns = runs\n\t\truns = []\n\t\tcollectTextRunUpdates(textRuns, searchText, replaceText, updates)\n\t}\n\n\tfor (const child of block.children) {\n\t\tif (isVirtualRichTextTextRun(child)) {\n\t\t\truns.push(child)\n\t\t\tcontinue\n\t\t}\n\n\t\tprocessRuns()\n\t}\n\n\tprocessRuns()\n}\n\nfunction collectTextRunUpdates(\n\truns: readonly VirtualRichTextTextRun[],\n\tsearchText: string,\n\treplaceText: string,\n\tupdates: TextUpdate[],\n): void {\n\tif (runs.length === 0) return\n\n\tconst currentText = runs.map(run => run.text).join(\"\")\n\tlet textOffset = 0\n\tconst runRanges = runs.map(run => {\n\t\tconst start = textOffset\n\t\tconst end = start + run.text.length\n\t\ttextOffset = end\n\t\treturn { start, end }\n\t})\n\tconst nextRunTexts = runs.map(() => \"\")\n\n\tconst appendOriginalText = (start: number, end: number) => {\n\t\tif (end <= start) return\n\t\tfor (const [index, range] of runRanges.entries()) {\n\t\t\tconst overlapStart = Math.max(start, range.start)\n\t\t\tconst overlapEnd = Math.min(end, range.end)\n\t\t\tif (overlapEnd <= overlapStart) continue\n\t\t\tnextRunTexts[index] += currentText.slice(overlapStart, overlapEnd)\n\t\t}\n\t}\n\n\tconst getRunIndexForPosition = (position: number): number => {\n\t\tfor (const [index, range] of runRanges.entries()) {\n\t\t\tif (position < range.end) return index\n\t\t}\n\t\treturn runRanges.length - 1\n\t}\n\n\tlet hasMatch = false\n\tlet cursor = 0\n\twhile (cursor <= currentText.length) {\n\t\tconst matchStart = currentText.indexOf(searchText, cursor)\n\t\tif (matchStart === -1) break\n\n\t\thasMatch = true\n\t\tappendOriginalText(cursor, matchStart)\n\t\tnextRunTexts[getRunIndexForPosition(matchStart)] += replaceText\n\t\tcursor = matchStart + searchText.length\n\t}\n\n\tif (!hasMatch) return\n\tappendOriginalText(cursor, currentText.length)\n\n\tfor (const [index, run] of runs.entries()) {\n\t\tconst nextText = nextRunTexts[index]\n\t\tif (nextText === run.text) continue\n\t\tupdates.push({ id: run.id, text: nextText ?? \"\" })\n\t}\n}\n\nfunction getUpdatedTextRun(\n\tid: string,\n\tcurrentText: string,\n\tsearchText: string,\n\treplaceText: string,\n): { id: string; text: string } | undefined {\n\tconst nextText = currentText.replaceAll(searchText, replaceText)\n\tif (nextText === currentText) return\n\treturn { id, text: nextText }\n}\n", "// The exports in this file are mostly recreated from existing Vekter functions to avoid pulling in\n// dependencies into the worker.\nimport type { AIContextNode, AnyNode } from \"app/ai/agents/context/nodes.ts\"\n\nconst children = \"children\" satisfies keyof AnyNode\nexport function hasChildren<T extends AIContextNode>(node: T): node is T & { children: readonly AIContextNode[] } {\n\treturn children in node && Array.isArray(node.children) && node.children.length > 0\n}\n\nexport function getChildren(node: AIContextNode): readonly AIContextNode[] {\n\treturn hasChildren(node) ? node.children : []\n}\n\nconst attributes = \"attributes\" satisfies keyof AnyNode\nexport function hasAttributes(node: object): node is AIContextNode & { attributes?: Record<string, unknown> } {\n\treturn attributes in node && typeof node.attributes === \"object\" && node.attributes !== null\n}\n\nexport function isString(value: unknown): value is string {\n\treturn typeof value === \"string\"\n}\n\nexport function isObject(value: unknown): value is object {\n\treturn typeof value === \"object\" && value !== null\n}\n\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === \"number\"\n}\n", "import type { AgentScriptFetchResult, AgentScriptHostApi } from \"../bridge.ts\"\nimport type { ScriptFetchBaseResponse, ScriptFetchHeaderEntry } from \"../fetch/types.ts\"\nimport { isString } from \"./utils.ts\"\n\nexport interface ScriptFetchHeaders {\n\tget: Headers[\"get\"]\n}\n\nexport interface ScriptFetchResponse extends ScriptFetchBaseResponse<ScriptFetchHeaders>, Pick<Response, \"bodyUsed\"> {\n\tarrayBuffer: Response[\"arrayBuffer\"]\n\tblob: Response[\"blob\"]\n\tclone: Response[\"clone\"]\n\tformData: Response[\"formData\"]\n\ttext: () => Promise<string>\n\tjson: () => Promise<unknown>\n\ttoJSON: () => Record<string, unknown>\n}\n\nexport function createScriptFetch(hostApi: AgentScriptHostApi): (url: string | URL) => Promise<ScriptFetchResponse> {\n\treturn async url => {\n\t\tconst result = await hostApi.fetch({ url: getFetchUrl(url) })\n\t\treturn createScriptFetchResponse(result)\n\t}\n}\n\nfunction createScriptFetchResponse(result: AgentScriptFetchResult): ScriptFetchResponse {\n\tconst response: ScriptFetchResponse = {\n\t\t...createFetchMetadata(result, createScriptFetchHeaders(result.headers)),\n\t\tarrayBuffer: createUnsupportedMethod(\"response.arrayBuffer\"),\n\t\tblob: createUnsupportedMethod(\"response.blob\"),\n\t\tclone: createUnsupportedMethod(\"response.clone\"),\n\t\tformData: createUnsupportedMethod(\"response.formData\"),\n\t\ttext: async () => result.bodyText,\n\t\tjson: async () => parseScriptFetchJson(result),\n\t\ttoJSON: () => createFetchMetadataJson(result),\n\t}\n\n\t// Keep returned responses JSON-friendly: scripts can call these methods, but returned response metadata\n\t// should not enumerate function properties that the model cannot use.\n\tmakeMethodsNonEnumerable(response, [\"arrayBuffer\", \"blob\", \"clone\", \"formData\", \"text\", \"json\", \"toJSON\"])\n\treturn response\n}\n\nfunction createFetchMetadata<THeaders>(\n\tresult: AgentScriptFetchResult,\n\theaders: THeaders,\n): ScriptFetchBaseResponse<THeaders> & Pick<Response, \"bodyUsed\"> {\n\treturn {\n\t\tok: result.ok,\n\t\turl: result.url,\n\t\tstatus: result.status,\n\t\tstatusText: result.statusText,\n\t\theaders,\n\t\tredirected: result.redirected,\n\t\ttype: result.type,\n\t\tbodyUsed: false,\n\t\tcontentType: result.contentType,\n\t\tchars: result.chars,\n\t\ttruncated: result.truncated,\n\t}\n}\n\nfunction createScriptFetchHeaders(headerEntries: readonly ScriptFetchHeaderEntry[]): ScriptFetchHeaders {\n\tconst headers = {\n\t\t...Object.fromEntries(headerEntries.map(header => [header.name, header.value])),\n\t\tget: (name: string) => {\n\t\t\tconst normalizedName = getNonEmptyString(name, \"headers.get expected a non-empty header name.\").toLowerCase()\n\t\t\treturn headerEntries.find(header => header.name.toLowerCase() === normalizedName)?.value ?? null\n\t\t},\n\t}\n\tmakeMethodsNonEnumerable(headers, [\"get\"])\n\treturn headers\n}\n\nfunction createFetchMetadataJson(result: AgentScriptFetchResult): Record<string, unknown> {\n\treturn {\n\t\t...createFetchMetadata(result, Object.fromEntries(result.headers.map(header => [header.name, header.value]))),\n\t\t...(result.error ? { error: result.error } : undefined),\n\t}\n}\n\nfunction createUnsupportedMethod(methodName: string): () => never {\n\treturn () => {\n\t\tthrow new Error(`${methodName} is not supported in script fetch.`)\n\t}\n}\n\nfunction parseScriptFetchJson(result: AgentScriptFetchResult): unknown {\n\tif (result.truncated) {\n\t\tthrow new Error(\n\t\t\t`response.json() cannot parse ${result.url} because the fetched body was truncated at ${result.bodyText.length} of ${result.chars} characters. Use response.text() for a preview or fetch a smaller JSON source.`,\n\t\t)\n\t}\n\treturn JSON.parse(result.bodyText)\n}\n\nfunction makeMethodsNonEnumerable<T extends object>(target: T, methodNames: readonly (keyof T)[]): void {\n\tfor (const name of methodNames) {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(target, name)\n\t\tif (!descriptor || descriptor.get || descriptor.set) continue\n\t\tObject.defineProperty(target, name, { ...descriptor, enumerable: false })\n\t}\n}\n\nfunction getFetchUrl(url: string | URL): string {\n\tif (url instanceof URL) return url.toString()\n\tif (isString(url) && url.trim().length > 0) return url\n\tthrow new Error(\"fetch expected a non-empty URL string.\")\n}\n\nfunction getNonEmptyString(value: string, errorMessage: string): string {\n\tif (!isString(value) || value.trim().length === 0) throw new Error(errorMessage)\n\treturn value\n}\n", "import type { AIContextNode } from \"app/ai/agents/context/nodes.ts\"\nimport { getChildren, hasAttributes } from \"./utils.ts\"\n\nexport function getInnerText(node: AIContextNode | null | undefined): string {\n\tif (!node) return \"\"\n\n\tif (node.type === \"TextLineBreak\") return \"\\n\"\n\tif (node.type === \"TextRun\") {\n\t\tconst text = hasAttributes(node) ? node.attributes?.text : undefined\n\t\treturn typeof text === \"string\" ? text : \"\"\n\t}\n\n\tconst children = getChildren(node)\n\tif (children.length === 0) {\n\t\tconst text = hasAttributes(node) ? node.attributes?.text : undefined\n\t\treturn typeof text === \"string\" ? text : \"\"\n\t}\n\n\tconst childrenText = children.map(getInnerText)\n\tif (node.type === \"TextBlock\") return childrenText.join(\"\")\n\treturn childrenText.join(\"\\n\")\n}\n", "import type { AIContextNode, AnyNode } from \"app/ai/agents/context/nodes.ts\"\nimport { getChildren, isObject, isString } from \"./utils.ts\"\n\nexport function* walkWithSkipChildren(\n\tinput: AIContextNode | AIContextNode[],\n): IterableIterator<WalkNodeWithSkipChildrenEntry> {\n\tif (Array.isArray(input)) {\n\t\tfor (const root of input) {\n\t\t\tif (isAIContextNodeLike(root)) {\n\t\t\t\tyield* walkNodeWithSkipChildren(root)\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tif (isAIContextNodeLike(input)) {\n\t\tyield* walkNodeWithSkipChildren(input)\n\t}\n}\n\nfunction* walkNodeWithSkipChildren(node: AIContextNode): IterableIterator<WalkNodeWithSkipChildrenEntry> {\n\tlet skipChildren = false\n\tyield {\n\t\tnode,\n\t\tskipChildren: () => {\n\t\t\tskipChildren = true\n\t\t},\n\t}\n\tif (skipChildren) return\n\n\tfor (const child of getChildren(node)) {\n\t\tyield* walkNodeWithSkipChildren(child)\n\t}\n}\n\ninterface WalkNodeWithSkipChildrenEntry {\n\tnode: AIContextNode\n\tskipChildren: () => void\n}\n\nexport type SearchWithSkipChildren = (\n\tinput: AIContextNode | AIContextNode[],\n) => IterableIterator<WalkNodeWithSkipChildrenEntry>\n\nconst id = \"id\" satisfies keyof AnyNode\nconst type = \"type\" satisfies keyof AnyNode\nfunction isAIContextNodeLike(node: unknown): node is AIContextNode {\n\tif (!isObject(node) || node === null) return false\n\treturn id in node && type in node && isString(node.id) && isString(node.type)\n}\n", "// This runtime intentionally keeps dependencies small for worker bundle performance.\n/* eslint-disable framer-studio/require-error-cause-in-catch */\n\nimport { parse } from \"csv-parse/browser/esm/sync\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { Rect } from \"library/index.ts\"\nimport type { AIContextNode } from \"../../../context/nodes.ts\"\nimport type { AgentScriptHostApi } from \"../bridge.ts\"\nimport type { PaginateCursorResult } from \"../paginate.ts\"\nimport type { AIContextNodeWithSpine, ControlsByIdentifier, DesignPatterns, SearchResult } from \"../types.ts\"\nimport { createScriptFetch, type ScriptFetchResponse } from \"./fetch.ts\"\nimport { getInnerText } from \"./getInnerText.ts\"\nimport { hasAttributes, isNumber, isObject, isString } from \"./utils.ts\"\nimport { walkWithSkipChildren, type SearchWithSkipChildren } from \"./walkWithSkipChildren.ts\"\n\ninterface SerializeOptions {\n\tdepth?: number\n\tancestors?: number\n\tattributeFilter?: string[]\n\tancestorPath?: boolean\n}\n\ntype SerializeResult = AIContextNode | AIContextNodeWithSpine\n\ntype NodeOrNodeID = NodeID | AIContextNode\ntype ContextNodeType = AIContextNode[\"type\"] | string\n\nexport interface AgentScriptApi {\n\tfiles: {\n\t\treadText: (fileIdOrName: string) => Promise<string>\n\t\tparseCsv: (fileIdOrName: string, options?: ParseCsvOptions) => Promise<unknown[]>\n\t}\n\ttree: {\n\t\tgetNodesOfTypes: (...types: ContextNodeType[]) => Promise<AIContextNode[]>\n\t\tgetNode: (node: NodeOrNodeID) => Promise<AIContextNode | null>\n\t\tgetNodes: (nodes: NodeOrNodeID[]) => Promise<AIContextNode[]>\n\t\tgetRect: (node: NodeOrNodeID) => Promise<Rect | null>\n\t\tgetScopeNodeFor: (node: NodeOrNodeID) => Promise<AIContextNode | null>\n\t\tgetGroundNodeFor: (node: NodeOrNodeID) => Promise<AIContextNode | null>\n\t\tgetParentNodeFor: (node: NodeOrNodeID) => Promise<AIContextNode | null>\n\t\tgetAncestorsFor: (node: NodeOrNodeID) => Promise<AIContextNode[]>\n\t}\n\tcontrols: {\n\t\tcomponents: (componentIds: string[]) => Promise<ControlsByIdentifier>\n\t\ticonSets: (iconSetNames: string[]) => Promise<ControlsByIdentifier>\n\t\tlayoutTemplates: (layoutTemplateIds: string[]) => Promise<ControlsByIdentifier>\n\t\tshaders: (shaderNames: string[]) => Promise<ControlsByIdentifier>\n\t}\n\tupdateProject: (dsl: string) => Promise<AIContextNode[]>\n\tserialize: (node: NodeOrNodeID, options?: SerializeOptions) => Promise<SerializeResult | null>\n\tserializeNodes: (nodes: NodeOrNodeID[], options?: SerializeOptions) => Promise<SerializeResult[]>\n\tpaginate: (inputOrKey: readonly unknown[] | string, cursor?: number) => Promise<PaginateCursorResult>\n\treplaceText: (node: NodeOrNodeID, searchText: string, replaceText: string) => Promise<boolean>\n\tstore: (key: string, value: unknown) => Promise<void>\n\tload: (key: string) => Promise<unknown>\n\tanalyze: (prompt: string, nodes: NodeOrNodeID[]) => Promise<string>\n\textractDesignPatterns: (nodes: NodeOrNodeID | NodeOrNodeID[]) => Promise<DesignPatterns>\n\tsearch: (query: string, nodes: NodeOrNodeID[]) => AsyncGenerator<SearchResult[]>\n\tanalytics: {\n\t\tquery: (sql: string, range: { from: Date; to?: Date }) => Promise<unknown[]>\n\t}\n\ticons: {\n\t\tlist: (iconSetName: string) => Promise<string[]>\n\t}\n}\n\ninterface ParseCsvOptions {\n\t/** When true, the first CSV row is treated as headers and each remaining row is returned as an object keyed by those headers. Otherwise rows are returned as string arrays. */\n\tasObjects?: boolean\n\tskipEmptyLines?: boolean\n\tdelimiter?: string\n}\n\ninterface SearchWithScriptSerializeHostOptions {\n\tdepth?: number\n\tancestors?: number\n\tattributeFilter?: string[]\n\tancestorPath?: boolean\n}\n\nconst BLOCKED_SCRIPT_GLOBAL_NAMES = [\n\t\"globalThis\",\n\t\"fetch\",\n\t\"WebSocket\",\n\t\"XMLHttpRequest\",\n\t\"EventSource\",\n\t\"Worker\",\n\t\"SharedWorker\",\n\t\"importScripts\",\n\t\"Function\",\n\t\"eval\",\n\t\"self\",\n] as const\n// Keep `Function` available on globalThis while the script runs, and block it via sandbox params only.\n// Overriding the real global could break host/runtime code executing in the same process.\nconst HARDENED_SCRIPT_GLOBAL_NAMES = BLOCKED_SCRIPT_GLOBAL_NAMES.filter(name => name !== \"Function\")\n\ntype BlockedScriptGlobalName = (typeof BLOCKED_SCRIPT_GLOBAL_NAMES)[number]\nconst BLOCKED_SCRIPT_PARAMETER_NAMES = BLOCKED_SCRIPT_GLOBAL_NAMES.filter(\n\tname => name !== \"eval\" && name !== \"fetch\",\n) as readonly Exclude<BlockedScriptGlobalName, \"eval\" | \"fetch\">[]\n\ninterface ScriptGlobalDescriptorSnapshot {\n\texisted: boolean\n\tdescriptor: PropertyDescriptor | undefined\n}\n\ninterface AgentScriptConsoleEntry {\n\tlevel: \"log\" | \"warn\" | \"error\"\n\ttext: string\n}\n\ninterface SearchWithScriptConsole {\n\tlog: (...args: unknown[]) => void\n\twarn: (...args: unknown[]) => void\n\terror: (...args: unknown[]) => void\n\tinfo: (...args: unknown[]) => void\n\tdebug: (...args: unknown[]) => void\n\ttrace: (...args: unknown[]) => void\n}\n\nexport async function runAgentScriptInProcess(script: string, hostApi: AgentScriptHostApi): Promise<unknown> {\n\tconst api = createAgentScriptApi(hostApi)\n\tconst AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as new (\n\t\tapiName: string,\n\t\twalkName: string,\n\t\tgetInnerTextName: string,\n\t\tconsoleName: string,\n\t\tfetchName: string,\n\t\t...blockedGlobalNamesAndBody: readonly string[]\n\t) => (\n\t\tapiValue: AgentScriptApi,\n\t\twalkValue: SearchWithSkipChildren,\n\t\tgetInnerTextValue: (node: AIContextNode | null | undefined) => string,\n\t\tconsoleValue: SearchWithScriptConsole,\n\t\tfetchValue: (url: string | URL) => Promise<ScriptFetchResponse>,\n\t\t...blockedGlobalValues: readonly unknown[]\n\t) => Promise<unknown>\n\tconst hardenedScript = `\"use strict\";\\n${script}`\n\tconst fn = new AsyncFunction(\n\t\t\"api\",\n\t\t\"walkWithSkipChildren\",\n\t\t\"getInnerText\",\n\t\t\"console\",\n\t\t\"fetch\",\n\t\t...BLOCKED_SCRIPT_PARAMETER_NAMES,\n\t\thardenedScript,\n\t)\n\tconst logs: AgentScriptConsoleEntry[] = []\n\tconst capturedConsole = createCapturedSearchWithScriptConsole(logs)\n\tconst scriptFetch = createScriptFetch(hostApi)\n\tconst blockedGlobalValues = BLOCKED_SCRIPT_PARAMETER_NAMES.map(name =>\n\t\tname === \"globalThis\" ? undefined : createBlockedScriptGlobal(name),\n\t)\n\treturn executeSearchWithScript(\n\t\t() => fn(api, walkWithSkipChildren, getInnerText, capturedConsole, scriptFetch, ...blockedGlobalValues),\n\t\tlogs,\n\t)\n}\n\nfunction createBlockedScriptGlobal(name: BlockedScriptGlobalName): (..._args: readonly unknown[]) => never {\n\treturn () => {\n\t\tthrow new Error(`${name} is disabled in script runtime`)\n\t}\n}\n\nfunction withHardenedSearchWithScriptGlobals<T>(run: () => Promise<T>): Promise<T> {\n\tconst target = globalThis as Record<string, unknown>\n\tconst originals = new Map<string, ScriptGlobalDescriptorSnapshot>()\n\n\tfor (const name of HARDENED_SCRIPT_GLOBAL_NAMES) {\n\t\toriginals.set(name, {\n\t\t\texisted: Object.prototype.hasOwnProperty.call(target, name),\n\t\t\tdescriptor: Object.getOwnPropertyDescriptor(target, name),\n\t\t})\n\n\t\tconst blockedValue = name === \"globalThis\" ? undefined : createBlockedScriptGlobal(name)\n\t\tObject.defineProperty(target, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\twritable: false,\n\t\t\tvalue: blockedValue,\n\t\t})\n\t}\n\n\treturn run().finally(() => {\n\t\tfor (const name of HARDENED_SCRIPT_GLOBAL_NAMES) {\n\t\t\tconst original = originals.get(name)\n\t\t\tif (!original) continue\n\n\t\t\tif (original.existed && original.descriptor) {\n\t\t\t\tObject.defineProperty(target, name, original.descriptor)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdelete target[name]\n\t\t}\n\t})\n}\n\nasync function executeSearchWithScript(run: () => Promise<unknown>, logs: AgentScriptConsoleEntry[]): Promise<unknown> {\n\ttry {\n\t\treturn await withHardenedSearchWithScriptGlobals(run)\n\t} catch (error) {\n\t\tthrow createSearchWithScriptRuntimeError(error, logs)\n\t}\n}\n\nfunction createCapturedSearchWithScriptConsole(logs: AgentScriptConsoleEntry[]): SearchWithScriptConsole {\n\tconst writeLog = (level: AgentScriptConsoleEntry[\"level\"], args: unknown[]) => {\n\t\tlogs.push({ level, text: formatConsoleArgs(args) })\n\t}\n\n\treturn {\n\t\tlog: (...args: unknown[]) => writeLog(\"log\", args),\n\t\twarn: (...args: unknown[]) => writeLog(\"warn\", args),\n\t\terror: (...args: unknown[]) => writeLog(\"error\", args),\n\t\tinfo: (...args: unknown[]) => writeLog(\"log\", args),\n\t\tdebug: (...args: unknown[]) => writeLog(\"log\", args),\n\t\ttrace: (...args: unknown[]) => writeLog(\"log\", args),\n\t}\n}\n\nfunction formatConsoleArgs(args: readonly unknown[]): string {\n\tif (args.length === 0) return \"\"\n\treturn args.map(formatConsoleValue).join(\" \")\n}\n\nfunction formatConsoleValue(value: unknown): string {\n\tif (isString(value)) return value\n\tif (value instanceof Error) return value.stack || value.message || String(value)\n\tif (value === undefined) return \"undefined\"\n\n\ttry {\n\t\treturn JSON.stringify(value)\n\t} catch {\n\t\treturn String(value)\n\t}\n}\n\nfunction createSearchWithScriptRuntimeError(error: unknown, logs: readonly AgentScriptConsoleEntry[]): Error {\n\tconst stackOrMessage = error instanceof Error ? error.stack || error.message || String(error) : String(error)\n\tconst consoleText = logs.length === 0 ? \"\" : `\\nConsole output before failure:\\n${formatConsoleLogs(logs)}`\n\treturn new Error(`${stackOrMessage}${consoleText}`)\n}\n\nfunction formatConsoleLogs(logs: readonly AgentScriptConsoleEntry[]): string {\n\treturn logs.map(entry => `[${entry.level}] ${entry.text}`).join(\"\\n\")\n}\n\nfunction createAgentScriptApi(hostApi: AgentScriptHostApi): AgentScriptApi {\n\treturn {\n\t\tfiles: {\n\t\t\treadText: fileIdOrName => hostApi.readAttachedFileText({ idOrName: getFileIdOrName(fileIdOrName) }),\n\t\t\tparseCsv: async (fileIdOrName, options) => {\n\t\t\t\tconst text = await hostApi.readAttachedFileText({ idOrName: getFileIdOrName(fileIdOrName) })\n\t\t\t\tconst result = parse(text, getValidatedParseCsvOptions(options))\n\t\t\t\tif (!Array.isArray(result)) throw new Error(\"api.files.parseCsv received an unexpected parser result.\")\n\t\t\t\treturn result\n\t\t\t},\n\t\t},\n\t\tupdateProject: dsl => hostApi.updateProject({ dsl: getValidatedProjectDSL(dsl) }),\n\t\ttree: {\n\t\t\tgetNodesOfTypes: (...types) =>\n\t\t\t\thostApi.getNodesOfTypes({ types: getValidatedNodeTypes(types as AIContextNode[\"type\"][]) }),\n\t\t\tgetRect: node => hostApi.getRect({ id: getNodeId(node, \"api.tree.getRect\") }),\n\t\t\tgetNode: node => hostApi.getNode({ id: getNodeId(node, \"api.tree.*\") }),\n\t\t\tgetNodes: nodes => hostApi.getNodes({ ids: getValidatedIds(nodes) }),\n\t\t\tgetScopeNodeFor: node => hostApi.getScopeNodeFor({ id: getNodeId(node, \"api.tree.*\") }),\n\t\t\tgetGroundNodeFor: node => hostApi.getGroundNodeFor({ id: getNodeId(node, \"api.tree.*\") }),\n\t\t\tgetParentNodeFor: node => hostApi.getParentNodeFor({ id: getNodeId(node, \"api.tree.*\") }),\n\t\t\tgetAncestorsFor: node => hostApi.getAncestorsFor({ id: getNodeId(node, \"api.tree.*\") }),\n\t\t},\n\t\tcontrols: {\n\t\t\tcomponents: componentIds =>\n\t\t\t\thostApi.getComponentControls({\n\t\t\t\t\tcomponentIds: getValidatedControlIdentifiers(componentIds, \"api.controls.components\", \"component id\"),\n\t\t\t\t}),\n\t\t\ticonSets: iconSetNames =>\n\t\t\t\thostApi.getIconSetControls({\n\t\t\t\t\ticonSetNames: getValidatedControlIdentifiers(iconSetNames, \"api.controls.iconSets\", \"icon set\"),\n\t\t\t\t}),\n\t\t\tlayoutTemplates: layoutTemplateIds =>\n\t\t\t\thostApi.getLayoutTemplateControls({\n\t\t\t\t\tlayoutTemplateIds: getValidatedControlIdentifiers(\n\t\t\t\t\t\tlayoutTemplateIds,\n\t\t\t\t\t\t\"api.controls.layoutTemplates\",\n\t\t\t\t\t\t\"layout template id\",\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\tshaders: shaderNames =>\n\t\t\t\thostApi.getShaderControls({\n\t\t\t\t\tshaderNames: getValidatedControlIdentifiers(shaderNames, \"api.controls.shaders\", \"shader name\"),\n\t\t\t\t}),\n\t\t},\n\t\tserialize: (node, options) =>\n\t\t\thostApi.serialize({\n\t\t\t\tid: getNodeId(node, \"api.serialize\"),\n\t\t\t\t...getValidatedSerializeHostOptions(options),\n\t\t\t}),\n\t\tserializeNodes: (nodes, options) =>\n\t\t\thostApi.serializeNodes({\n\t\t\t\tids: getValidatedIds(nodes, \"api.serializeNodes\"),\n\t\t\t\t...getValidatedSerializeHostOptions(options),\n\t\t\t}),\n\t\treplaceText: async (node, searchText, replacementText) => {\n\t\t\treturn hostApi.replaceText({\n\t\t\t\tid: getNodeId(node, \"api.replaceText\"),\n\t\t\t\tsearchText: getReplaceTextSearchText(searchText),\n\t\t\t\treplaceText: getReplaceTextReplacementText(replacementText),\n\t\t\t})\n\t\t},\n\t\tpaginate: (inputOrKey, cursor) => {\n\t\t\treturn hostApi.paginate(getValidatedPaginateInputOrKey(inputOrKey), getValidatedPaginateCursor(cursor))\n\t\t},\n\t\tstore: async (key, value) => {\n\t\t\tawait hostApi.store({ key: getStorageKey(key), serializedValue: serializeStoredValue(value) })\n\t\t},\n\t\tload: async key => {\n\t\t\tconst serializedValue = await hostApi.load({ key: getStorageKey(key) })\n\t\t\treturn deserializeStoredValue(serializedValue)\n\t\t},\n\t\tanalyze: async (prompt, nodes) => {\n\t\t\treturn hostApi.analyze({ ...getValidatedNodesOrIds(nodes, \"api.analyze\"), prompt: getAnalyzePrompt(prompt) })\n\t\t},\n\t\tanalytics: {\n\t\t\tquery: (sql, range) => hostApi.queryAnalytics({ query: getAnalyticsQuery(sql), ...getAnalyticsRange(range) }),\n\t\t},\n\t\textractDesignPatterns: async nodes => {\n\t\t\treturn hostApi.extractDesignPatterns({ ids: getValidatedIds(toNodeArray(nodes), \"api.extractDesignPatterns\") })\n\t\t},\n\t\tsearch: async function* (query, nodes) {\n\t\t\tlet releasableCursor: number | undefined\n\t\t\ttry {\n\t\t\t\tlet nextResult = await hostApi.search({\n\t\t\t\t\t...getValidatedNodesOrIds(nodes, \"api.search\"),\n\t\t\t\t\tquery: getSearchQuery(query),\n\t\t\t\t})\n\n\t\t\t\twhile (nextResult.result !== undefined) {\n\t\t\t\t\treleasableCursor = nextResult.nextCursor\n\t\t\t\t\tyield nextResult.result\n\t\t\t\t\tif (nextResult.nextCursor === undefined) {\n\t\t\t\t\t\treleasableCursor = undefined\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tnextResult = await hostApi.search({ cursor: nextResult.nextCursor })\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (isNumber(releasableCursor)) await hostApi.releaseSearchCursor(releasableCursor)\n\t\t\t}\n\t\t},\n\t\ticons: {\n\t\t\tlist: iconSetName => {\n\t\t\t\treturn hostApi.listIcons({ iconSetName: getIconSetName(iconSetName) })\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunction getFileIdOrName(fileIdOrName: string): string {\n\tif (!isString(fileIdOrName) || fileIdOrName.trim().length === 0) {\n\t\tthrow new Error(\"api.files.readText/api.files.parseCsv expected a non-empty file id or file name.\")\n\t}\n\treturn fileIdOrName\n}\n\nfunction getValidatedParseCsvOptions(options: ParseCsvOptions | undefined): {\n\tcolumns?: boolean\n\tskip_empty_lines?: boolean\n\tdelimiter?: string\n} {\n\tif (options === undefined) return {}\n\tif (!isObject(options) || options === null || Array.isArray(options)) {\n\t\tthrow new Error(\"api.files.parseCsv expected an options object when provided.\")\n\t}\n\n\tconst { asObjects, skipEmptyLines, delimiter } = options\n\tif (asObjects !== undefined && typeof asObjects !== \"boolean\") {\n\t\tthrow new Error(\"api.files.parseCsv expected 'asObjects' to be a boolean when provided.\")\n\t}\n\tif (skipEmptyLines !== undefined && typeof skipEmptyLines !== \"boolean\") {\n\t\tthrow new Error(\"api.files.parseCsv expected 'skipEmptyLines' to be a boolean when provided.\")\n\t}\n\tif (delimiter !== undefined && (!isString(delimiter) || delimiter.length === 0)) {\n\t\tthrow new Error(\"api.files.parseCsv expected 'delimiter' to be a non-empty string when provided.\")\n\t}\n\n\treturn {\n\t\tcolumns: asObjects,\n\t\tskip_empty_lines: skipEmptyLines,\n\t\tdelimiter,\n\t}\n}\n\nfunction getNodeId(node: NodeOrNodeID, methodName: string): string {\n\tif (isString(node)) {\n\t\tif (node.trim().length === 0) throw new Error(`${methodName} expected a non-empty node id string.`)\n\t\treturn node\n\t}\n\tif (!isObject(node) || node === null || !isString(node.id) || node.id.trim().length === 0) {\n\t\tthrow new Error(`${methodName} expected a node id string or a node-like object with a non-empty string 'id'.`)\n\t}\n\treturn node.id\n}\n\nfunction getValidatedIds(nodes: NodeOrNodeID[], methodName = \"api.tree.getNodes\"): string[] {\n\tif (!Array.isArray(nodes)) {\n\t\tthrow new Error(`${methodName} expected an array of node ids or node-like objects.`)\n\t}\n\n\treturn nodes.map(node => getNodeId(node, methodName))\n}\n\nfunction toNodeArray(nodes: NodeOrNodeID | NodeOrNodeID[]): NodeOrNodeID[] {\n\treturn Array.isArray(nodes) ? nodes : [nodes]\n}\n\nfunction getValidatedNodesOrIds(\n\tnodes: NodeOrNodeID[],\n\tmethodName = \"api.tree.getNodes\",\n): { ids: string[] } | { nodes: AIContextNode[] } {\n\tif (!Array.isArray(nodes)) {\n\t\tthrow new Error(`${methodName} expected an array of node ids or node-like objects.`)\n\t}\n\n\t// If the nodes have attributes, use them directly, allowing the script to provide custom\n\t// serialization.\n\tif (nodes.every(node => isObject(node) && hasAttributes(node))) {\n\t\treturn { nodes }\n\t}\n\n\treturn { ids: nodes.map(node => getNodeId(node, methodName)) }\n}\n\nfunction getValidatedNodeTypes(types: AIContextNode[\"type\"][]): AIContextNode[\"type\"][] {\n\tfor (const [index, type] of types.entries()) {\n\t\tif (!isString(type) || type.trim().length === 0) {\n\t\t\tthrow new Error(`api.tree.getNodesOfTypes expected non-empty string types. Invalid value at index ${index}.`)\n\t\t}\n\t}\n\treturn types\n}\n\nfunction getValidatedControlIdentifiers(identifiers: string[], methodName: string, identifierKind: string): string[] {\n\tif (!Array.isArray(identifiers)) {\n\t\tthrow new Error(`${methodName} expected a non-empty array of ${identifierKind} strings.`)\n\t}\n\n\tif (identifiers.length === 0) {\n\t\tthrow new Error(`${methodName} expected a non-empty array of ${identifierKind} strings.`)\n\t}\n\n\treturn identifiers.map((identifier, index) => {\n\t\tif (!isString(identifier) || identifier.trim().length === 0) {\n\t\t\tthrow new Error(`${methodName} expected non-empty ${identifierKind} strings. Invalid value at index ${index}.`)\n\t\t}\n\n\t\treturn identifier\n\t})\n}\n\nfunction getValidatedProjectDSL(dsl: string): string {\n\tif (!isString(dsl) || dsl.trim().length === 0) {\n\t\tthrow new Error(\"api.updateProject expected a non-empty project-update string.\")\n\t}\n\treturn dsl\n}\n\nfunction getValidatedSerializeHostOptions(options: SerializeOptions | undefined): SearchWithScriptSerializeHostOptions {\n\tif (options === undefined) return {}\n\tif (!isObject(options) || options === null || Array.isArray(options)) {\n\t\tthrow new Error(\"api.serialize/api.serializeNodes expected an options object when provided.\")\n\t}\n\n\tconst { depth, ancestors, attributeFilter, ancestorPath } = options\n\tif (depth !== undefined && (!Number.isInteger(depth) || depth < 0)) {\n\t\tthrow new Error(\"api.serialize/api.serializeNodes expected 'depth' to be a non-negative integer.\")\n\t}\n\n\tif (ancestors !== undefined && (!Number.isInteger(ancestors) || ancestors < 0)) {\n\t\tthrow new Error(\"api.serialize/api.serializeNodes expected 'ancestors' to be a non-negative integer.\")\n\t}\n\n\tif (\n\t\tattributeFilter !== undefined &&\n\t\t(!Array.isArray(attributeFilter) || attributeFilter.some(value => typeof value !== \"string\"))\n\t) {\n\t\tthrow new Error(\"api.serialize/api.serializeNodes expected 'attributeFilter' to be an array of strings.\")\n\t}\n\n\tif (ancestorPath !== undefined && typeof ancestorPath !== \"boolean\") {\n\t\tthrow new Error(\"api.serialize/api.serializeNodes expected 'ancestorPath' to be a boolean.\")\n\t}\n\n\treturn {\n\t\tdepth,\n\t\tancestors,\n\t\tattributeFilter,\n\t\tancestorPath,\n\t}\n}\n\nfunction getStorageKey(key: string): string {\n\tif (!isString(key) || key.trim().length === 0) {\n\t\tthrow new Error(\"api.store/api.load expected a non-empty key string.\")\n\t}\n\n\treturn key\n}\n\nfunction getValidatedPaginateInputOrKey(inputOrKey: readonly unknown[] | string): readonly unknown[] | string {\n\tif (Array.isArray(inputOrKey)) return inputOrKey\n\tif (isString(inputOrKey)) return inputOrKey\n\tthrow new Error(\"api.paginate expected an array, or a key string returned by a previous api.paginate call.\")\n}\n\nfunction getValidatedPaginateCursor(cursor: number | undefined): number | undefined {\n\tif (cursor === undefined) return undefined\n\tif (!Number.isInteger(cursor) || cursor < 0) {\n\t\tthrow new Error(\"api.paginate expected 'cursor' to be a non-negative integer when provided.\")\n\t}\n\treturn cursor\n}\n\nfunction getAnalyzePrompt(prompt: string): string {\n\tif (!isString(prompt) || prompt.trim().length === 0) {\n\t\tthrow new Error(\"api.analyze expected a non-empty prompt string.\")\n\t}\n\n\treturn prompt\n}\n\nfunction getSearchQuery(query: string): string {\n\tif (!isString(query) || query.trim().length === 0) {\n\t\tthrow new Error(\"api.search expected a non-empty query string.\")\n\t}\n\n\treturn query\n}\n\nfunction getAnalyticsQuery(sql: string): string {\n\tif (!isString(sql) || sql.trim().length === 0) {\n\t\tthrow new Error(\"api.analytics.query expected a non-empty SQL string.\")\n\t}\n\n\treturn sql\n}\n\nfunction getAnalyticsRange(range: { from: Date; to?: Date }): { from: string; to: string } {\n\tif (!isObject(range) || range === null) {\n\t\tthrow new Error(\"api.analytics.query expected a { from, to } range.\")\n\t}\n\n\tconst from = toValidDate(range.from, \"from\")\n\tconst to = range.to === undefined ? new Date() : toValidDate(range.to, \"to\")\n\tif (from.getTime() > to.getTime()) {\n\t\tthrow new Error(\"api.analytics.query expected 'from' to be before 'to'.\")\n\t}\n\n\treturn { from: from.toISOString(), to: to.toISOString() }\n}\n\nfunction toValidDate(value: unknown, field: \"from\" | \"to\"): Date {\n\tif (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n\t\tthrow new Error(`api.analytics.query expected '${field}' to be a valid Date.`)\n\t}\n\n\treturn value\n}\n\nfunction getIconSetName(iconSetName: string): string {\n\tif (!isString(iconSetName) || iconSetName.trim().length === 0) {\n\t\tthrow new Error(\"api.icons.list expected a non-empty icon set name string.\")\n\t}\n\n\treturn iconSetName.trim()\n}\n\nfunction getReplaceTextSearchText(searchText: string): string {\n\tif (!isString(searchText) || searchText.length === 0) {\n\t\tthrow new Error(\"api.replaceText expected a non-empty search text string.\")\n\t}\n\n\treturn searchText\n}\n\nfunction getReplaceTextReplacementText(replacementText: string): string {\n\tif (!isString(replacementText)) {\n\t\tthrow new Error(\"api.replaceText expected replacement text to be a string.\")\n\t}\n\n\treturn replacementText\n}\n\nfunction serializeStoredValue(value: unknown): string {\n\ttry {\n\t\tconst serialized = JSON.stringify({ value })\n\t\tif (serialized === undefined) {\n\t\t\tthrow new Error(\"Unexpected undefined serialization output\")\n\t\t}\n\t\treturn serialized\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`api.store expected a JSON-compatible value. Received value that could not be stringified: ${error instanceof Error ? error.message : String(error)}`,\n\t\t)\n\t}\n}\n\nfunction deserializeStoredValue(serializedValue: string): unknown {\n\ttry {\n\t\treturn JSON.parse(serializedValue)?.value\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`api.load failed to parse the stored value for the requested key: ${error instanceof Error ? error.message : String(error)}`,\n\t\t)\n\t}\n}\n", "import { assertNever, emptyArray, getLogger } from \"@framerjs/shared\"\nimport type { AgentAttachmentFile } from \"app/agent/attachments.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { proxy, wrap } from \"comlink\"\nimport { TaskScheduler } from \"document/loader/TaskScheduler.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { Rect } from \"library/index.ts\"\nimport { absoluteEditorPath } from \"utils/platformPaths.ts\"\nimport { isArray, isNull, isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { formatProjectUpdateBlock, type DocumentParser } from \"../../DocumentParser.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { type AIContextNode, getName } from \"../../context/nodes.ts\"\nimport {\n\tcollectCanvasNodes,\n\tgetAncestorsFor,\n\tgetGroundNodeFor,\n\tgetNode,\n\tgetNodes,\n\tgetNodesOfTypes,\n\tgetParentNodeFor,\n\tgetRect,\n\tgetScopeNodeFor,\n\tserializeCanvasNodeWithOptions,\n\tserializeCanvasNodes,\n} from \"../../treeTraversal.ts\"\nimport type { EmitChatPart } from \"../../types.ts\"\nimport { fetchExternalUrlResource } from \"../fetchExternalUrl.ts\"\nimport { wrapExecutionInChatPartUpdater } from \"../utils/wrapExecutionInUpdater.ts\"\nimport { getComponentControls, getIconSetControls, getLayoutTemplateControls, getShaderControls } from \"./controls.ts\"\nimport type { ScriptFetchBaseResponse, ScriptFetchHeaderEntry } from \"./fetch/types.ts\"\nimport { getIconListItems } from \"./icons.ts\"\nimport { analyze, extractDesignPatterns, SearchSessionStore } from \"./intelligence.ts\"\nimport { paginate, type PaginateCursorResult } from \"./paginate.ts\"\nimport { executeReplaceText, type ScriptReplaceTextInput } from \"./replaceText.ts\"\nimport { runAgentScriptInProcess } from \"./runtime/main.ts\"\nimport type { AIContextNodeWithSpine, ControlsByIdentifier, DesignPatterns, SearchSessionResult } from \"./types.ts\"\n\nconst defaultTimeoutMs = 30_000\nconst log = getLogger(\"ai:agents\")\nexport interface AgentScriptHostApi {\n\tfetch: (input: { url: string }) => Promise<AgentScriptFetchResult>\n\treadAttachedFileText: (input: { idOrName: string }) => Promise<string>\n\tgetNodesOfTypes: (input: { types: AIContextNode[\"type\"][] }) => Promise<AIContextNode[]>\n\tgetNode: (input: { id: string }) => Promise<AIContextNode | null>\n\tgetNodes: (input: { ids: string[] }) => Promise<AIContextNode[]>\n\tgetRect: (input: { id: string }) => Promise<Rect | null>\n\tgetScopeNodeFor: (input: { id: string }) => Promise<AIContextNode | null>\n\tgetGroundNodeFor: (input: { id: string }) => Promise<AIContextNode | null>\n\tgetParentNodeFor: (input: { id: string }) => Promise<AIContextNode | null>\n\tgetAncestorsFor: (input: { id: string }) => Promise<AIContextNode[]>\n\tgetComponentControls: (input: { componentIds: string[] }) => Promise<ControlsByIdentifier>\n\tgetIconSetControls: (input: { iconSetNames: string[] }) => Promise<ControlsByIdentifier>\n\tgetLayoutTemplateControls: (input: { layoutTemplateIds: string[] }) => Promise<ControlsByIdentifier>\n\tgetShaderControls: (input: { shaderNames: string[] }) => Promise<ControlsByIdentifier>\n\tupdateProject: (input: { dsl: string }) => Promise<AIContextNode[]>\n\tserialize: (input: ScriptSerializeNodeInput) => Promise<AIContextNode | AIContextNodeWithSpine | null>\n\tserializeNodes: (input: ScriptSerializeNodesInput) => Promise<(AIContextNode | AIContextNodeWithSpine)[]>\n\tstore: (input: { key: string; serializedValue: string }) => Promise<void>\n\tload: (input: { key: string }) => Promise<string>\n\tpaginate: (inputOrKey: readonly unknown[] | string, cursor: number | undefined) => Promise<PaginateCursorResult>\n\treplaceText: (input: { id: string; searchText: string; replaceText: string }) => Promise<boolean>\n\tanalyze: (input: { prompt: string; ids?: string[]; nodes?: AIContextNode[] }) => Promise<string>\n\textractDesignPatterns: (input: { ids: string[] }) => Promise<DesignPatterns>\n\tsearch: (input: {\n\t\tquery?: string\n\t\tids?: string[]\n\t\tnodes?: AIContextNode[]\n\t\tcursor?: number\n\t}) => Promise<Omit<SearchSessionResult, \"cost\">>\n\tlistIcons: (input: { iconSetName: string }) => Promise<string[]>\n\treleaseSearchCursor: (cursor: number) => Promise<void>\n\tqueryAnalytics: (input: { query: string; from: string; to: string }) => Promise<unknown[]>\n}\n\nexport type AgentScriptRecordedCall = AgentScriptRecordedCallInput & { error?: string; elapsedMs: number }\n\nexport interface AgentScriptInstrumentation {\n\trecordCall: (call: AgentScriptRecordedCall) => void\n}\n\nexport interface AgentScriptFetchResult extends ScriptFetchBaseResponse<readonly ScriptFetchHeaderEntry[]> {\n\tbodyText: string\n\terror?: string\n}\ntype AgentScriptRecordedCallInput = {\n\t[K in keyof AgentScriptHostApi]: { method: K; input: Parameters<AgentScriptHostApi[K]>[0] }\n}[keyof AgentScriptHostApi]\n\ninterface DesignPatternExtractionSource {\n\treadonly nodes: readonly CanvasNode[]\n\treadonly context: readonly AIContextNode[]\n}\n\ninterface ScriptSerializeOptions {\n\tdepth?: number\n\tancestors?: number\n\tattributeFilter?: string[]\n\tancestorPath?: boolean\n}\n\ninterface ScriptSerializeNodeInput extends ScriptSerializeOptions {\n\tid: string\n}\n\ninterface ScriptSerializeNodesInput extends ScriptSerializeOptions {\n\tids: readonly string[]\n}\n\n// Used by worker.ts\nexport interface AgentScriptWorkerApi {\n\trun: (script: string, hostApi: AgentScriptHostApi) => Promise<unknown>\n}\n\ninterface AgentScriptRunInput {\n\tscript: string\n\tsignal?: AbortSignal\n\ttimeoutMs?: number\n}\n\nexport type ScriptErrorType = \"script_error\" | \"timeout\" | \"abort\" | \"worker_crash\"\ntype ScriptErrorRuntime = \"worker\" | \"in_process\"\n\nexport interface ScriptErrorDiagnostics {\n\truntime: ScriptErrorRuntime\n\tphase: \"execution\" | \"timeout\" | \"abort\" | \"serialization\"\n\tcause?: \"comlink_serialization\"\n}\n\ninterface AgentScriptRunResult {\n\tok: boolean\n\tresult?: unknown\n\terror?: string\n\terrorType?: ScriptErrorType\n\tline?: number\n\tdiagnostics?: ScriptErrorDiagnostics\n}\n\ninterface ScriptTaskScheduler {\n\tscheduler: TaskScheduler\n\tcancel: () => void\n\tcomplete: () => void\n\tthrowIfTimedOut: () => void\n\tdispose: () => void\n}\n\nclass ScriptTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(timeoutErrorMessage(timeoutMs))\n\t\tthis.name = \"ScriptTimeoutError\"\n\t}\n}\n\nclass ScriptExecutionDeadline {\n\tprivate readonly startedAtMs = Date.now()\n\tprivate completed = false\n\n\tconstructor(private readonly timeoutMs: number) {}\n\n\tcomplete(): void {\n\t\tthis.completed = true\n\t}\n\n\tthrowIfTimedOut(): void {\n\t\tif (this.completed) return\n\t\tif (this.timeoutMs === Infinity) return\n\t\tif (Date.now() - this.startedAtMs < this.timeoutMs) return\n\t\tthrow new ScriptTimeoutError(this.timeoutMs)\n\t}\n}\n\n/** Adds deadline checks to every cooperative scheduler yield used by host-side script APIs. */\nclass DeadlineTaskScheduler extends TaskScheduler {\n\tconstructor(private readonly deadline: ScriptExecutionDeadline) {\n\t\tsuper()\n\t}\n\n\tthrowIfTimedOut(): void {\n\t\ttry {\n\t\t\tthis.deadline.throwIfTimedOut()\n\t\t} catch (error) {\n\t\t\tthis.cancel()\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tcompleteDeadline(): void {\n\t\tthis.deadline.complete()\n\t}\n\n\toverride async sleep(ms: number): Promise<void> {\n\t\tthis.throwIfTimedOut()\n\t\tawait super.sleep(ms)\n\t\tthis.throwIfTimedOut()\n\t}\n\n\toverride async yield(): Promise<void> {\n\t\tthis.throwIfTimedOut()\n\t\tawait super.yield()\n\t\tthis.throwIfTimedOut()\n\t}\n}\n\nexport class AgentScriptBridge<T extends string> {\n\tconstructor(\n\t\tprivate readonly ctx: AgentContext,\n\t\tprivate readonly parser: DocumentParser<T>,\n\t\tprivate readonly synchronize: (fullSync?: boolean) => Promise<void>,\n\t\tprivate readonly onPart?: EmitChatPart,\n\t\tprivate readonly instrumentation?: AgentScriptInstrumentation,\n\t) {}\n\n\tasync run(input: AgentScriptRunInput): Promise<AgentScriptRunResult> {\n\t\tconst timeoutMs = input.timeoutMs ?? defaultTimeoutMs\n\t\tconst scriptTaskScheduler = createScriptTaskScheduler(input.signal, timeoutMs)\n\t\tif (process.env.NODE_ENV === \"test\") {\n\t\t\ttry {\n\t\t\t\tconst runResult = await this.runInProcess(input, scriptTaskScheduler)\n\t\t\t\tawait this.synchronize()\n\t\t\t\treturn runResult\n\t\t\t} finally {\n\t\t\t\tscriptTaskScheduler.dispose()\n\t\t\t}\n\t\t}\n\n\t\tconst worker = new Worker(absoluteEditorPath(\"./agentScriptToolWorker.js\"), { type: \"module\" })\n\t\tconst workerApi = wrap<AgentScriptWorkerApi>(worker)\n\n\t\tconst runResult = await new Promise<AgentScriptRunResult>(resolve => {\n\t\t\tlet done = false\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tscriptTaskScheduler.cancel()\n\t\t\t\tfinish({\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorType: \"timeout\",\n\t\t\t\t\terror: timeoutErrorMessage(timeoutMs),\n\t\t\t\t\tdiagnostics: { runtime: \"worker\", phase: \"timeout\" },\n\t\t\t\t})\n\t\t\t}, timeoutMs)\n\n\t\t\tfunction cleanup() {\n\t\t\t\tclearTimeout(timeout)\n\t\t\t\tinput.signal?.removeEventListener(\"abort\", abort)\n\t\t\t\tscriptTaskScheduler.dispose()\n\t\t\t\tworker.terminate()\n\t\t\t}\n\n\t\t\tfunction finish(result: AgentScriptRunResult) {\n\t\t\t\tif (done) return\n\t\t\t\tdone = true\n\t\t\t\tif (result.ok) scriptTaskScheduler.complete()\n\t\t\t\tcleanup()\n\t\t\t\tresolve(result)\n\t\t\t}\n\n\t\t\tfunction abort() {\n\t\t\t\tfinish({\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorType: \"abort\",\n\t\t\t\t\terror: \"Agent Script run was aborted. Worker execution was terminated and any partial result was discarded.\",\n\t\t\t\t\tdiagnostics: { runtime: \"worker\", phase: \"abort\" },\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tinput.signal?.addEventListener(\"abort\", abort)\n\n\t\t\tvoid workerApi\n\t\t\t\t.run(input.script, proxy(this.createHostApi(input.signal, scriptTaskScheduler)))\n\t\t\t\t.then(result => {\n\t\t\t\t\tfinish({ ok: true, result })\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tfinish(formatScriptError(error, \"worker\"))\n\t\t\t\t})\n\t\t})\n\n\t\tif (runResult.ok) await scriptTaskScheduler.scheduler.yield()\n\t\tawait this.synchronize()\n\n\t\treturn runResult\n\t}\n\n\tprivate async runInProcess(\n\t\tinput: AgentScriptRunInput,\n\t\ttaskScheduler: ScriptTaskScheduler,\n\t): Promise<AgentScriptRunResult> {\n\t\tconst timeoutMs = input.timeoutMs ?? defaultTimeoutMs\n\n\t\tif (input.signal?.aborted) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terrorType: \"abort\",\n\t\t\t\terror:\n\t\t\t\t\t\"Agent Script run was aborted. In-process execution was interrupted and any partial result was discarded.\",\n\t\t\t\tdiagnostics: { runtime: \"in_process\", phase: \"abort\" },\n\t\t\t}\n\t\t}\n\n\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined\n\t\tlet onAbort: (() => void) | undefined\n\t\tconst timeoutPromise = new Promise<AgentScriptRunResult>(resolve => {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\ttaskScheduler.cancel()\n\t\t\t\tresolve({\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorType: \"timeout\",\n\t\t\t\t\terror: timeoutErrorMessage(timeoutMs),\n\t\t\t\t\tdiagnostics: { runtime: \"in_process\", phase: \"timeout\" },\n\t\t\t\t})\n\t\t\t}, timeoutMs)\n\n\t\t\tonAbort = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId)\n\t\t\t\tresolve({\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorType: \"abort\",\n\t\t\t\t\terror:\n\t\t\t\t\t\t\"Agent Script run was aborted. In-process execution was interrupted and any partial result was discarded.\",\n\t\t\t\t\tdiagnostics: { runtime: \"in_process\", phase: \"abort\" },\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tinput.signal?.addEventListener(\"abort\", onAbort, { once: true })\n\t\t})\n\n\t\tconst runPromise = (async (): Promise<AgentScriptRunResult> => {\n\t\t\ttry {\n\t\t\t\tconst result = await runAgentScriptInProcess(input.script, this.createHostApi(input.signal, taskScheduler))\n\t\t\t\treturn { ok: true, result }\n\t\t\t} catch (error) {\n\t\t\t\treturn formatScriptError(error, \"in_process\")\n\t\t\t}\n\t\t})()\n\n\t\ttry {\n\t\t\tconst result = await Promise.race([runPromise, timeoutPromise])\n\t\t\tif (result.ok) taskScheduler.complete()\n\t\t\treturn result\n\t\t} finally {\n\t\t\tif (timeoutId) clearTimeout(timeoutId)\n\t\t\tif (onAbort) input.signal?.removeEventListener(\"abort\", onAbort)\n\t\t}\n\t}\n\n\tprivate createHostApi(signal: AbortSignal | undefined, scriptTaskScheduler: ScriptTaskScheduler): AgentScriptHostApi {\n\t\tconst searchSessions = new SearchSessionStore()\n\t\tconst taskScheduler = scriptTaskScheduler.scheduler\n\t\tconst fetcher = globalThis.fetch?.bind(globalThis) ?? (() => Promise.reject(new Error(\"fetch is unavailable\")))\n\n\t\treturn {\n\t\t\tfetch: ({ url }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"fetch\", input: { url } }, async () => {\n\t\t\t\t\tconst result = await fetchExternalUrlResource({ url })\n\t\t\t\t\tif (!result.ok) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tok: false,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\tstatus: 0,\n\t\t\t\t\t\t\tstatusText: result.error,\n\t\t\t\t\t\t\theaders: [],\n\t\t\t\t\t\t\tredirected: false,\n\t\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\t\tcontentType: \"\",\n\t\t\t\t\t\t\tbodyText: \"\",\n\t\t\t\t\t\t\tchars: 0,\n\t\t\t\t\t\t\ttruncated: false,\n\t\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.ctx.files.registerTrustedUrls([result.url, ...result.trustedUrls])\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: true,\n\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tstatusText: \"OK\",\n\t\t\t\t\t\theaders: [{ name: \"content-type\", value: result.contentType }],\n\t\t\t\t\t\tredirected: false,\n\t\t\t\t\t\ttype: \"basic\",\n\t\t\t\t\t\tcontentType: result.contentType,\n\t\t\t\t\t\tbodyText: result.bodyText,\n\t\t\t\t\t\tchars: result.textTotalChars,\n\t\t\t\t\t\ttruncated: result.bodyTextTruncated,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\treadAttachedFileText: ({ idOrName }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"readAttachedFileText\", input: { idOrName } }, () =>\n\t\t\t\t\treadAttachedFileText(this.ctx.attachedFiles(), idOrName, fetcher),\n\t\t\t\t),\n\t\t\tgetNodesOfTypes: ({ types }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getNodesOfTypes\", input: { types } },\n\t\t\t\t\tasync () => getNodesOfTypes(this.ctx, types, taskScheduler),\n\t\t\t\t),\n\t\t\tgetNode: ({ id }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getNode\", input: { id } },\n\t\t\t\t\tasync () => getNode(this.ctx, id, taskScheduler),\n\t\t\t\t),\n\t\t\tgetNodes: ({ ids }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getNodes\", input: { ids } },\n\t\t\t\t\tasync () => getNodes(this.ctx, ids, taskScheduler),\n\t\t\t\t),\n\t\t\tgetRect: ({ id }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"getRect\", input: { id } }, async () =>\n\t\t\t\t\tgetRect(this.ctx, id),\n\t\t\t\t),\n\t\t\tgetScopeNodeFor: ({ id }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getScopeNodeFor\", input: { id } },\n\t\t\t\t\tasync () => getScopeNodeFor(this.ctx, id, taskScheduler),\n\t\t\t\t),\n\t\t\tgetGroundNodeFor: ({ id }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getGroundNodeFor\", input: { id } },\n\t\t\t\t\tasync () => getGroundNodeFor(this.ctx, id, taskScheduler),\n\t\t\t\t),\n\t\t\tgetParentNodeFor: ({ id }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getParentNodeFor\", input: { id } },\n\t\t\t\t\tasync () => getParentNodeFor(this.ctx, id, taskScheduler),\n\t\t\t\t),\n\t\t\tgetAncestorsFor: ({ id }) =>\n\t\t\t\trunScriptReadWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\tthis.onPart,\n\t\t\t\t\t{ method: \"getAncestorsFor\", input: { id } },\n\t\t\t\t\tasync () => getAncestorsFor(this.ctx, id, taskScheduler),\n\t\t\t\t),\n\t\t\tgetComponentControls: ({ componentIds }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"getComponentControls\", input: { componentIds } }, () =>\n\t\t\t\t\tgetComponentControls(this.ctx, componentIds),\n\t\t\t\t),\n\t\t\tgetIconSetControls: ({ iconSetNames }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"getIconSetControls\", input: { iconSetNames } }, () =>\n\t\t\t\t\tgetIconSetControls(this.ctx, iconSetNames),\n\t\t\t\t),\n\t\t\tgetLayoutTemplateControls: ({ layoutTemplateIds }) =>\n\t\t\t\trunWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\t{ method: \"getLayoutTemplateControls\", input: { layoutTemplateIds } },\n\t\t\t\t\t() => getLayoutTemplateControls(this.ctx, layoutTemplateIds),\n\t\t\t\t),\n\t\t\tgetShaderControls: ({ shaderNames }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"getShaderControls\", input: { shaderNames } }, () =>\n\t\t\t\t\tgetShaderControls(this.ctx, shaderNames),\n\t\t\t\t),\n\t\t\tupdateProject: ({ dsl }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"updateProject\", input: { dsl } }, async () => {\n\t\t\t\t\tconst changedNodeIds = await this.applyUpdateWithParser(dsl, taskScheduler)\n\t\t\t\t\tif (changedNodeIds.length === 0) return []\n\t\t\t\t\treturn serializeCanvasNodes(this.ctx, collectCanvasNodes(this.ctx, changedNodeIds), false, taskScheduler)\n\t\t\t\t}),\n\t\t\tserialize: ({ id, ...options }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"serialize\", input: { id, ...options } }, async () => {\n\t\t\t\t\tconst node = this.ctx.treeResolver.get(id)\n\t\t\t\t\tif (!node) return null\n\t\t\t\t\treturn serializeCanvasNodeWithOptions(this.ctx, node, options, taskScheduler)\n\t\t\t\t}),\n\t\t\tserializeNodes: ({ ids, ...options }) =>\n\t\t\t\trunWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\t{ method: \"serializeNodes\", input: { ids, ...options } },\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst serializedNodes: (AIContextNode | AIContextNodeWithSpine)[] = []\n\t\t\t\t\t\tfor (const node of collectCanvasNodes(this.ctx, ids)) {\n\t\t\t\t\t\t\tconst serialized = await serializeCanvasNodeWithOptions(this.ctx, node, options, taskScheduler)\n\t\t\t\t\t\t\tif (serialized) serializedNodes.push(serialized)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn serializedNodes\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\tstore: ({ key, serializedValue }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"store\", input: { key, serializedValue } }, async () => {\n\t\t\t\t\tthis.ctx.storeScriptData(key, serializedValue)\n\t\t\t\t}),\n\t\t\tload: ({ key }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"load\", input: { key } }, async () => {\n\t\t\t\t\tconst value = this.ctx.loadScriptData(key)\n\t\t\t\t\tif (!isNull(value)) return value\n\t\t\t\t\tthrow createMissingStoredKeyError(key, this.ctx.getScriptDataKeys())\n\t\t\t\t}),\n\t\t\treplaceText: input =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"replaceText\", input }, async () => {\n\t\t\t\t\treturn this.replaceText(input, taskScheduler)\n\t\t\t\t}),\n\t\t\tpaginate: (inputOrKey, cursor) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"paginate\", input: inputOrKey }, async () => {\n\t\t\t\t\treturn paginate(this.ctx, inputOrKey, cursor)\n\t\t\t\t}),\n\t\t\tanalyze: ({ prompt, ids, nodes }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"analyze\", input: { prompt, ids, nodes } }, async () => {\n\t\t\t\t\tif (!isArray(ids) && !isArray(nodes)) {\n\t\t\t\t\t\tthrow new Error(\"api.analyze expected an array of nodes or ids.\")\n\t\t\t\t\t}\n\n\t\t\t\t\tconst context = ids?.every(isString)\n\t\t\t\t\t\t? await serializeCanvasNodes(\n\t\t\t\t\t\t\t\tthis.ctx,\n\t\t\t\t\t\t\t\tcollectCanvasNodes(this.ctx, ids ?? emptyArray()),\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\ttaskScheduler,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: nodes\n\n\t\t\t\t\tif (!context?.length) {\n\t\t\t\t\t\tthrow new Error(\"api.analyze expected a non-empty array of nodes or ids.\")\n\t\t\t\t\t}\n\n\t\t\t\t\tconst names = context.map(node => getName(node) ?? Dictionary.WebPage)\n\n\t\t\t\t\tconst { text, cost } = await wrapExecutionInChatPartUpdater(\n\t\t\t\t\t\tthis.onPart,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"blocking-task\",\n\t\t\t\t\t\t\ttask: \"analyze\",\n\t\t\t\t\t\t\tmessage: names.length === 1 ? (names[0] ?? Dictionary.WebPage) : `${names.length} layers`,\n\t\t\t\t\t\t\tmetadata: { pages: names },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tanalyze(prompt, context, signal),\n\t\t\t\t\t)\n\n\t\t\t\t\tthis.ctx.addSubModelCost(cost)\n\n\t\t\t\t\treturn text\n\t\t\t\t}),\n\t\t\textractDesignPatterns: ({ ids }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"extractDesignPatterns\", input: { ids } }, async () => {\n\t\t\t\t\tconst nodes = collectCanvasNodes(this.ctx, ids)\n\t\t\t\t\tconst source = await this.createDesignPatternExtractionSource(nodes, taskScheduler)\n\n\t\t\t\t\tif (source.context.length === 0) {\n\t\t\t\t\t\tthrow new Error(\"api.extractDesignPatterns expected existing node ids or node-like objects.\")\n\t\t\t\t\t}\n\n\t\t\t\t\tconst names = source.context.map(node => getName(node) ?? Dictionary.WebPage)\n\n\t\t\t\t\tconst { patterns, cost } = await wrapExecutionInChatPartUpdater(\n\t\t\t\t\t\tthis.onPart,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"blocking-task\",\n\t\t\t\t\t\t\ttask: \"analyze\",\n\t\t\t\t\t\t\tmessage: names.length === 1 ? (names[0] ?? Dictionary.WebPage) : `${names.length} layers`,\n\t\t\t\t\t\t\tmetadata: { pages: names },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Use a small/fast model to extract generalizable design patterns from the input nodes.\n\t\t\t\t\t\textractDesignPatterns(this.ctx, source.nodes, source.context, {\n\t\t\t\t\t\t\tprojectReferences: {\n\t\t\t\t\t\t\t\ttokens: this.ctx.tokens.toJSON(),\n\t\t\t\t\t\t\t\tstylePresets: this.ctx.stylePresets.toJSON(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\n\t\t\t\t\tthis.ctx.addSubModelCost(cost)\n\n\t\t\t\t\treturn patterns\n\t\t\t\t}),\n\t\t\tsearch: ({ query, ids, nodes, cursor }) =>\n\t\t\t\trunWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\t{ method: \"search\", input: { query, ids, nodes, cursor } },\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tif (isNumber(cursor)) {\n\t\t\t\t\t\t\tconst { cost, ...result } = await searchSessions.continue(cursor)\n\t\t\t\t\t\t\tthis.ctx.addSubModelCost(cost)\n\t\t\t\t\t\t\treturn result\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!isString(query)) {\n\t\t\t\t\t\t\tthrow new Error(\"api.search expected a non-empty query string.\")\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!isArray(ids) && !isArray(nodes)) {\n\t\t\t\t\t\t\tthrow new Error(\"api.search expected an array of nodes or ids.\")\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst context = ids?.every(isString)\n\t\t\t\t\t\t\t? await serializeCanvasNodes(\n\t\t\t\t\t\t\t\t\tthis.ctx,\n\t\t\t\t\t\t\t\t\tcollectCanvasNodes(this.ctx, ids ?? emptyArray()),\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\ttaskScheduler,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: nodes\n\n\t\t\t\t\t\tif (!context?.length) {\n\t\t\t\t\t\t\tthrow new Error(\"api.search expected a non-empty array of nodes or ids.\")\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { cost, ...result } = await searchSessions.start(query, context, signal, this.onPart)\n\t\t\t\t\t\tthis.ctx.addSubModelCost(cost)\n\t\t\t\t\t\treturn result\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\tlistIcons: ({ iconSetName }) =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"listIcons\", input: { iconSetName } }, async () => {\n\t\t\t\t\treturn getIconListItems(this.ctx, iconSetName)\n\t\t\t\t}),\n\t\t\treleaseSearchCursor: cursor =>\n\t\t\t\trunWithInstrumentation(this.instrumentation, { method: \"releaseSearchCursor\", input: cursor }, async () => {\n\t\t\t\t\tawait searchSessions.release(cursor)\n\t\t\t\t}),\n\t\t\tqueryAnalytics: ({ query, from, to }) =>\n\t\t\t\trunWithInstrumentation(\n\t\t\t\t\tthis.instrumentation,\n\t\t\t\t\t{ method: \"queryAnalytics\", input: { query, from, to } },\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst projectStore = this.ctx.hooks.getEngine()?.stores.projectStore\n\t\t\t\t\t\tconst projectId = projectStore?.projectId\n\t\t\t\t\t\tif (!projectId) {\n\t\t\t\t\t\t\tthrow new Error(\"api.analytics.query is unavailable in this context (no project id).\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst analyticsRangeInDays = projectStore?.resourceLimits?.analyticsRangeInDays\n\t\t\t\t\t\tif (typeof analyticsRangeInDays === \"number\") {\n\t\t\t\t\t\t\t// One-day grace so a `from` set to exactly the limit (e.g. \"30 days ago\") isn't rejected\n\t\t\t\t\t\t\t// by sub-second clock skew between computing `from` and this check.\n\t\t\t\t\t\t\tconst earliestAllowedMs = Date.now() - (analyticsRangeInDays + 1) * 86_400_000\n\t\t\t\t\t\t\tif (new Date(from).getTime() < earliestAllowedMs) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`api.analytics.query 'from' is outside this site's analytics range of ${analyticsRangeInDays} days.`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst response = await apiFetcher.post(`/web/analytics/${projectId}/query`, { query, from, to }, signal)\n\t\t\t\t\t\treturn isArray(response) ? response : []\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t}\n\t}\n\n\tprivate async applyUpdateWithParser(dsl: string, taskScheduler: TaskScheduler): Promise<string[]> {\n\t\tawait taskScheduler.yield()\n\t\tconst { changedNodeIds } = await this.ctx.treeResolver.process(async () => {\n\t\t\tthis.parser.addToken(formatProjectUpdateBlock(dsl))\n\t\t\t// Finalize the script parser. It is not handled by synchronize since it is a temporary\n\t\t\t// parser, not the main parser.\n\t\t\tthis.parser.finalize()\n\n\t\t\t// Await the document writes the script depends on without charging slow external\n\t\t\t// side effects, such as asset uploads, to the script execution timeout.\n\t\t\tawait taskScheduler.yield()\n\t\t\tawait this.synchronize(false)\n\t\t})\n\t\treturn changedNodeIds\n\t}\n\n\tprivate async replaceText(input: ScriptReplaceTextInput, taskScheduler: TaskScheduler): Promise<boolean> {\n\t\treturn executeReplaceText(this.ctx, input, dsl => this.applyUpdateWithParser(dsl, taskScheduler))\n\t}\n\n\t/**\n\t * Enhance the provided extraction nodes with Layout Templates if required.\n\t */\n\tprivate async createDesignPatternExtractionSource(\n\t\tnodes: CanvasNode[],\n\t\ttaskScheduler: TaskScheduler,\n\t): Promise<DesignPatternExtractionSource> {\n\t\tconst serializedSource = await serializeCanvasNodes(this.ctx, nodes, true, taskScheduler)\n\t\tif (serializedSource.length === 0) return { nodes: emptyArray(), context: emptyArray() }\n\n\t\tconst layoutTemplateIds = new Set<NodeID>()\n\t\tfor (const node of nodes) {\n\t\t\tconst scope = this.ctx.treeResolver.getScopeNodeFor(node.id)\n\t\t\tif (!isWebPageNode(scope)) continue\n\t\t\tconst tree = this.ctx.treeResolver.getLookupTree()\n\t\t\tconst id = scope.getLayoutTemplateNode(tree)?.id\n\t\t\tif (id) layoutTemplateIds.add(id)\n\t\t}\n\n\t\tif (layoutTemplateIds.size === 0) return { nodes, context: serializedSource }\n\n\t\tconst layoutTemplates = collectCanvasNodes(this.ctx, Array.from(layoutTemplateIds))\n\t\tif (layoutTemplates.length === 0) return { nodes, context: serializedSource }\n\n\t\tconst serializedLayoutTemplate = await serializeCanvasNodes(this.ctx, layoutTemplates, true, taskScheduler)\n\t\treturn {\n\t\t\tnodes: [...nodes, ...layoutTemplates],\n\t\t\tcontext: [...serializedSource, ...serializedLayoutTemplate],\n\t\t}\n\t}\n}\n\ntype ScriptReadResult = AIContextNode | null | readonly AIContextNode[]\n\nfunction getScriptReadNodeCount(result: ScriptReadResult): number {\n\tif (Array.isArray(result)) return result.length\n\tif (!result) return 0\n\treturn 1\n}\n\nasync function readAttachedFileText(\n\tfiles: Iterable<AgentAttachmentFile>,\n\tidOrName: string,\n\tfetcher: typeof fetch,\n): Promise<string> {\n\tif (!isString(idOrName) || idOrName.trim().length === 0) {\n\t\tthrow new Error(\"api.files.readText expected a non-empty file id or file name.\")\n\t}\n\n\t// `files` is expected to be ordered newest-first, so the first match by id or name resolves\n\t// to the most recently attached file. This is intentional: duplicate filenames across turns\n\t// transparently pick the newest version instead of surfacing an ambiguous-match error.\n\tfor (const file of files) {\n\t\tif (\n\t\t\tfile.uploadResult.asset.key === idOrName ||\n\t\t\tfile.fileName === idOrName ||\n\t\t\tfile.uploadResult.asset.name === idOrName\n\t\t) {\n\t\t\treturn fetchAttachmentText(file, fetcher)\n\t\t}\n\t}\n\n\tthrow new Error(`No attached file found for ${JSON.stringify(idOrName)}.`)\n}\n\nasync function fetchAttachmentText(file: AgentAttachmentFile, fetcher: typeof fetch): Promise<string> {\n\tif (file.text !== undefined) return file.text\n\n\tconst response = await fetcher(file.uploadResult.url)\n\tconst text = await response.text()\n\tif (!response.ok) throw new Error(text || `HTTP ${response.status} ${response.statusText}`)\n\treturn text\n}\n\nfunction createScriptTaskScheduler(signal: AbortSignal | undefined, timeoutMs: number): ScriptTaskScheduler {\n\tconst scheduler = new DeadlineTaskScheduler(new ScriptExecutionDeadline(timeoutMs)).fast()\n\tconst cancel = scheduler.cancel.bind(scheduler)\n\tif (signal?.aborted) scheduler.cancel()\n\tsignal?.addEventListener(\"abort\", cancel, { once: true })\n\n\treturn {\n\t\tscheduler,\n\t\tcancel,\n\t\tcomplete: scheduler.completeDeadline.bind(scheduler),\n\t\tthrowIfTimedOut: scheduler.throwIfTimedOut.bind(scheduler),\n\t\tdispose: () => {\n\t\t\tsignal?.removeEventListener(\"abort\", cancel)\n\t\t},\n\t}\n}\n\nfunction timeoutErrorMessage(timeoutMs: number): string {\n\treturn [\n\t\t`Agent Script timed out after ${timeoutMs}ms. Execution was terminated and any partial result was discarded.`,\n\t\t\"Try reducing tree API calls, avoiding deeply nested loops, or using batched lookups like api.tree.getNodes([...]) instead of repeated api.tree.getNode(...).\",\n\t].join(\" \")\n}\n\nfunction createMissingStoredKeyError(requestedKey: string, availableKeys: string[]): Error {\n\tconst sortedAvailableKeys = [...availableKeys].sort((a, b) => a.localeCompare(b))\n\tconst availableKeysMessage =\n\t\tsortedAvailableKeys.length === 0 ? \"(none)\" : sortedAvailableKeys.map(key => JSON.stringify(key)).join(\", \")\n\n\treturn new Error(\n\t\t`api.load could not find key ${JSON.stringify(requestedKey)}. Available keys: ${availableKeysMessage}.`,\n\t)\n}\n\nfunction formatScriptError(error: unknown, runtime: ScriptErrorRuntime): AgentScriptRunResult {\n\tconst errorText = error instanceof Error ? error.stack || error.message || String(error) : String(error)\n\tconst errorType = classifyScriptErrorType(errorText, runtime)\n\tconst line = extractScriptErrorLine(errorText)\n\tconst serializationFailure = errorType === \"worker_crash\" && looksLikeSerializationFailure(errorText)\n\tconst normalizedError = serializationFailure\n\t\t? `Failed to serialize result from worker \u2014 ensure the return value is JSON-serializable. Original error: ${errorText}`\n\t\t: errorText\n\n\treturn {\n\t\tok: false,\n\t\terrorType,\n\t\terror: normalizedError,\n\t\t...(line ? { line } : undefined),\n\t\tdiagnostics: {\n\t\t\truntime,\n\t\t\tphase: getScriptErrorDiagnosticsPhase(errorType, serializationFailure),\n\t\t\t...(serializationFailure ? { cause: \"comlink_serialization\" as const } : undefined),\n\t\t},\n\t}\n}\n\nfunction getScriptErrorDiagnosticsPhase(\n\terrorType: ScriptErrorType,\n\tserializationFailure: boolean,\n): ScriptErrorDiagnostics[\"phase\"] {\n\tif (serializationFailure) return \"serialization\"\n\n\tswitch (errorType) {\n\t\tcase \"timeout\":\n\t\t\treturn \"timeout\"\n\t\tcase \"abort\":\n\t\t\treturn \"abort\"\n\t\tcase \"script_error\":\n\t\tcase \"worker_crash\":\n\t\t\treturn \"execution\"\n\t\tdefault:\n\t\t\treturn assertNever(errorType)\n\t}\n}\n\nfunction classifyScriptErrorType(errorText: string, runtime: ScriptErrorRuntime): ScriptErrorType {\n\tconst normalizedErrorText = errorText.toLowerCase()\n\tif (normalizedErrorText.includes(\"timed out\")) return \"timeout\"\n\tif (normalizedErrorText.includes(\"cancelled\")) return \"abort\"\n\tif (normalizedErrorText.includes(\"abort\")) return \"abort\"\n\tif (runtime === \"worker\" && looksLikeWorkerCrash(errorText)) return \"worker_crash\"\n\treturn \"script_error\"\n}\n\nfunction looksLikeWorkerCrash(errorText: string): boolean {\n\treturn (\n\t\tlooksLikeSerializationFailure(errorText) ||\n\t\terrorText.includes(\"DOMException\") ||\n\t\terrorText.includes(\"DataCloneError\")\n\t)\n}\n\nfunction looksLikeSerializationFailure(errorText: string): boolean {\n\tconst normalizedErrorText = errorText.toLowerCase()\n\treturn (\n\t\tnormalizedErrorText.includes(\"clone\") ||\n\t\tnormalizedErrorText.includes(\"serialize\") ||\n\t\tnormalizedErrorText.includes(\"transfer\") ||\n\t\tnormalizedErrorText.includes(\"datacloneerror\")\n\t)\n}\n\nfunction extractScriptErrorLine(errorText: string): number | undefined {\n\tconst patterns = [\n\t\t/<anonymous>:(\\d+):\\d+/u,\n\t\t/eval at [^(]*\\([^)]*<anonymous>:(\\d+):\\d+\\)/u,\n\t\t/at [^(]*\\(.*?:(\\d+):\\d+\\)/u,\n\t\t/(?:^|\\s).*?:(\\d+):\\d+(?:\\s|$)/u,\n\t] as const\n\n\tfor (const pattern of patterns) {\n\t\tconst match = errorText.match(pattern)\n\t\tif (!match?.[1]) continue\n\t\tconst parsed = Number.parseInt(match[1], 10)\n\t\tif (Number.isFinite(parsed)) return parsed\n\t}\n\n\treturn undefined\n}\n\nasync function runScriptReadWithInstrumentation<T extends ScriptReadResult>(\n\tinstrumentation: AgentScriptInstrumentation | undefined,\n\tonPart: EmitChatPart | undefined,\n\tcallInput: AgentScriptRecordedCallInput,\n\trun: () => Promise<T>,\n): Promise<T> {\n\treturn runWithInstrumentation(instrumentation, callInput, run, result => {\n\t\tonPart?.({ type: \"script-read\", count: getScriptReadNodeCount(result) }, false)\n\t})\n}\n\nasync function runWithInstrumentation<T>(\n\tinstrumentation: AgentScriptInstrumentation | undefined,\n\tcallInput: AgentScriptRecordedCallInput,\n\trun: () => Promise<T>,\n\tonResult?: (result: T) => void,\n): Promise<T> {\n\tconst startedAtMs = Date.now()\n\tconst startedAt = new Date(startedAtMs).toISOString()\n\tlog.debug(\"Agent Script bridge request\", { at: startedAt, ...callInput })\n\n\ttry {\n\t\tconst result = await run()\n\t\tconst endedAtMs = Date.now()\n\t\tconst endedAt = new Date(endedAtMs).toISOString()\n\t\tconst elapsedMs = endedAtMs - startedAtMs\n\t\tlog.debug(\"Agent Script bridge response\", {\n\t\t\tat: endedAt,\n\t\t\tstartedAt,\n\t\t\telapsedMs,\n\t\t\t...getCallDebugInfo(callInput),\n\t\t})\n\n\t\trecordInstrumentedScriptCall(instrumentation, createRecordedScriptCall(callInput, elapsedMs))\n\n\t\tonResult?.(result)\n\n\t\treturn result\n\t} catch (error) {\n\t\tconst endedAtMs = Date.now()\n\t\tconst endedAt = new Date(endedAtMs).toISOString()\n\t\tconst elapsedMs = endedAtMs - startedAtMs\n\t\tlog.debug(\"Agent Script bridge response error\", {\n\t\t\tat: endedAt,\n\t\t\tstartedAt,\n\t\t\telapsedMs,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t...getCallDebugInfo(callInput),\n\t\t})\n\t\trecordInstrumentedScriptCall(\n\t\t\tinstrumentation,\n\t\t\tcreateRecordedScriptCall(callInput, elapsedMs, formatScriptInstrumentationError(error)),\n\t\t)\n\t\tthrow error\n\t}\n}\n\nfunction getCallDebugInfo(callInput: AgentScriptRecordedCallInput): Record<string, unknown> {\n\tconst info: Record<string, unknown> = {}\n\tfor (const [key, value] of Object.entries(callInput)) {\n\t\tif (isArray(value)) {\n\t\t\tinfo[`${key}Length`] = value.length\n\t\t\tcontinue\n\t\t}\n\n\t\tif (isObject(value)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfo[key] = value\n\t}\n\treturn info\n}\n\nfunction createRecordedScriptCall(\n\tcallInput: AgentScriptRecordedCallInput,\n\telapsedMs: number,\n\terror?: string,\n): AgentScriptRecordedCall {\n\treturn { ...callInput, elapsedMs, ...(error ? { error } : undefined) }\n}\n\nfunction recordInstrumentedScriptCall(\n\tinstrumentation: AgentScriptInstrumentation | undefined,\n\tcall: AgentScriptRecordedCall,\n): void {\n\tif (!instrumentation) return\n\n\ttry {\n\t\tinstrumentation.recordCall(call)\n\t} catch (error) {\n\t\tlog.debug(\"Agent Script instrumentation failed\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t})\n\t}\n}\n\nfunction formatScriptInstrumentationError(error: unknown): string {\n\tconst maxLength = 300\n\tconst text = error instanceof Error ? error.message : String(error)\n\treturn text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n}\n", "import { tool } from \"ai\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../../raindrop/agentStreamTrace.ts\"\nimport { createDocumentParser } from \"../../DocumentParser.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { QUOTE_REPAIR_WARNING, type Command } from \"../../dsl.ts\"\nimport type { EmitChatPart } from \"../../types.ts\"\nimport { SCRIPT_TOOL_NAME } from \"../toolNames.ts\"\nimport { createUIConnectedTool } from \"../transformers/createUIConnectedTool.ts\"\nimport type { AgentScriptInstrumentation, ScriptErrorDiagnostics, ScriptErrorType } from \"./bridge.ts\"\nimport { AgentScriptBridge } from \"./bridge.ts\"\n\nconst ScriptInputSchema = z.object({\n\tscript: z.string(),\n})\n\nexport type ScriptToolResult =\n\t| {\n\t\t\tresult: unknown\n\t  }\n\t| {\n\t\t\terror: string\n\t\t\terrorType?: ScriptErrorType\n\t\t\tline?: number\n\t\t\tdiagnostics?: ScriptErrorDiagnostics\n\t  }\n\nconst description = \"Execute a JS script that reads from the project tree and can apply project updates.\" as const\n\nexport function createScriptTool(\n\tctx: AgentContext,\n\tsignal: AbortSignal | undefined,\n\tcreateDSLCommandHandler: (persistParts?: boolean) => (parsed: Command | Error, raw: string) => void,\n\tsynchronize: (fullSync?: boolean) => Promise<void>,\n\t{\n\t\tscriptEvalInstrumentation,\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\tscriptEvalInstrumentation?: AgentScriptInstrumentation\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: ScriptInputSchema,\n\t\t\texecute: async input => {\n\t\t\t\tconst parser = createDocumentParser({\n\t\t\t\t\tonDSLCommand: createDSLCommandHandler(false),\n\t\t\t\t\t// TODO: Consider if it matters if the script parser sends annotation parts.\n\t\t\t\t\tonAnnotation: text => onPart?.({ type: \"annotation\", text, complete: true }, false),\n\t\t\t\t\tonDSLRepair: info => ctx.issues.warning(info.repairedRaw, { syntax: QUOTE_REPAIR_WARNING }),\n\t\t\t\t\tonText: () => {},\n\t\t\t\t\tonDesignPlan: () => {},\n\t\t\t\t})\n\n\t\t\t\tconst bridge = new AgentScriptBridge(ctx, parser, synchronize, onPart, scriptEvalInstrumentation)\n\t\t\t\tconst execution = await bridge.run({ script: input.script, signal })\n\n\t\t\t\tif (!execution.ok) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: execution.error ?? \"Script execution failed.\",\n\t\t\t\t\t\terrorType: execution.errorType,\n\t\t\t\t\t\tline: execution.line,\n\t\t\t\t\t\tdiagnostics: execution.diagnostics,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tresult: normalizeScriptResult(execution.result),\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttoolName: SCRIPT_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t\tgetTraceInput: input => ({ script: input.script }),\n\t\t\t\tgetTraceOutput: output => output,\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\t// If a script takes a while to stream the input, show the ui message early.\n\t\t\tonFirstInputDelta: () => ({ type: \"scripting\" }),\n\t\t\t// Once the full script is available, label analytics queries distinctly.\n\t\t\tonStart: input => ({ type: \"scripting\", task: scriptQueriesAnalytics(input.script) ? \"analytics\" : undefined }),\n\t\t},\n\t)\n}\n\n/** The analytics API is documented to the model as `api.analytics.query(...)`. */\nfunction scriptQueriesAnalytics(script: string): boolean {\n\treturn /\\.analytics\\s*\\.\\s*query\\b/.test(script)\n}\n\nexport function createScriptToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: ScriptInputSchema,\n\t})\n}\n\nfunction normalizeScriptResult(result: unknown): unknown {\n\treturn result === undefined ? null : result\n}\n", "import type { JSONValue } from \"@ai-sdk/provider\"\nimport type { ImagePart, ModelMessage, ToolModelMessage, ToolResultPart, UserContent } from \"ai\"\nimport { isObject } from \"utils/typeChecks.ts\"\nimport type { ReadProjectResponse } from \"../readProject.ts\"\nimport {\n\tcreateReadProjectResponseCustomContentPart,\n\tisReadProjectToolResponseValue,\n\tparseReadProjectResponseCustomContentPart,\n} from \"../readProjectToolResultOutput.ts\"\nimport { isReviewChangesToolResponseValue, type ReviewChangesResponse } from \"../reviewChanges.ts\"\nimport { READ_PROJECT_TOOL_NAME, REVIEW_CHANGES_TOOL_NAME } from \"../toolNames.ts\"\n\nexport function isUserModelMessage(message: ModelMessage): message is Extract<ModelMessage, { role: \"user\" }> {\n\treturn message.role === \"user\"\n}\n\nexport function isToolModelMessage(message: ModelMessage): message is Extract<ModelMessage, { role: \"tool\" }> {\n\treturn message.role === \"tool\"\n}\n\nexport function isImageUserContentPart(part: Exclude<UserContent, string>[number] | undefined): part is ImagePart {\n\treturn part?.type === \"image\"\n}\n\ntype ToolMessagePart = ToolModelMessage[\"content\"][number]\nexport function isToolResultModelPart(part: ToolMessagePart): part is ToolResultPart {\n\treturn part.type === \"tool-result\"\n}\n\nexport function isReadProjectToolResultPart(part: ToolResultPart) {\n\treturn part.toolName === READ_PROJECT_TOOL_NAME\n}\n\nexport function isReviewChangesToolResultPart(part: ToolResultPart) {\n\treturn part.toolName === REVIEW_CHANGES_TOOL_NAME\n}\n\ntype ToolResultOutput = ToolResultPart[\"output\"]\nexport function isJSONToolResultOutput(output: unknown): output is Extract<ToolResultOutput, { type: \"json\" }> {\n\treturn isObject(output) && output.type === \"json\"\n}\n\nexport function isContentToolResultOutput(output: unknown): output is Extract<ToolResultOutput, { type: \"content\" }> {\n\treturn isObject(output) && output.type === \"content\"\n}\n\ntype ContentToolResultOutput = Extract<ToolResultOutput, { type: \"content\" }>\ntype ContentToolResultPart = ContentToolResultOutput[\"value\"][number]\n\nfunction parseReadProjectResponseContent(output: ContentToolResultOutput): ReadProjectResponse | undefined {\n\tfor (const part of output.value) {\n\t\tif (part.type !== \"custom\") continue\n\t\tconst response = parseReadProjectResponseCustomContentPart(part)\n\t\tif (response) return response\n\t}\n}\n\nfunction rewriteReadProjectResponseContentParts(\n\tparts: readonly ContentToolResultPart[],\n\tresponse: ReadProjectResponse,\n): ContentToolResultPart[] | undefined {\n\tlet didRewriteCustomPart = false\n\tlet didRewriteTextPart = false\n\tconst rewrittenParts = parts.map(part => {\n\t\tif (part.type === \"custom\") {\n\t\t\tconst parsed = parseReadProjectResponseCustomContentPart(part)\n\t\t\tif (!parsed) return part\n\t\t\tdidRewriteCustomPart = true\n\t\t\treturn createReadProjectResponseCustomContentPart(response)\n\t\t}\n\n\t\tif (part.type !== \"text\") return part\n\n\t\tdidRewriteTextPart = true\n\t\treturn { ...part, text: JSON.stringify(response) }\n\t})\n\n\tif (!didRewriteCustomPart && !didRewriteTextPart) return\n\tif (!didRewriteCustomPart) rewrittenParts.push(createReadProjectResponseCustomContentPart(response))\n\treturn rewrittenParts\n}\n\n/**\n * Parses tool output that carries a `ReadProjectResponse`-shaped `queryResults`\n * payload without caring whether it came back as JSON or multimodal content.\n *\n * This exists because image-example queries now return tool-output images so\n * the model can use vision on them, while callers still need access to the\n * structured `ReadProjectResponse`.\n */\nexport function parseReadProjectToolResultOutput(output: ToolResultPart[\"output\"]): ReadProjectResponse | undefined {\n\tif (isJSONToolResultOutput(output)) {\n\t\tconst value = output.value\n\t\tif (!isReadProjectToolResponseValue(value)) return\n\t\treturn value\n\t}\n\n\tif (isContentToolResultOutput(output)) return parseReadProjectResponseContent(output)\n}\n\n/**\n * Writes a transformed `ReadProjectResponse` back into the original tool-output shape.\n *\n * This exists so transformers can update the structured response without\n * dropping the image parts that let the model use vision on tool-output images.\n */\nexport function rewriteReadProjectToolResultOutput(\n\toutput: ToolResultPart[\"output\"],\n\tresponse: ReadProjectResponse,\n): ToolResultPart[\"output\"] | undefined {\n\tif (isJSONToolResultOutput(output)) {\n\t\treturn {\n\t\t\t...output,\n\t\t\tvalue: response as unknown as JSONValue,\n\t\t}\n\t}\n\n\tif (!isContentToolResultOutput(output)) return\n\n\tconst rewrittenParts = rewriteReadProjectResponseContentParts(output.value, response)\n\tif (!rewrittenParts) return\n\n\treturn {\n\t\t...output,\n\t\tvalue: rewrittenParts,\n\t}\n}\n\n/**\n * Parses the `review_changes` tool result output into a `ReviewChangesResponse`.\n *\n * Unlike `read_project`, `review_changes` never returns images, so its output is always JSON.\n */\nexport function parseReviewChangesToolResultOutput(\n\toutput: ToolResultPart[\"output\"],\n): ReviewChangesResponse | undefined {\n\tif (!isJSONToolResultOutput(output)) return\n\tif (!isReviewChangesToolResponseValue(output.value)) return\n\treturn output.value\n}\n\n/** Writes a transformed `ReviewChangesResponse` back into the tool-output shape. */\nexport function rewriteReviewChangesToolResultOutput(\n\toutput: ToolResultPart[\"output\"],\n\tresponse: ReviewChangesResponse,\n): ToolResultPart[\"output\"] | undefined {\n\tif (!isJSONToolResultOutput(output)) return\n\treturn {\n\t\t...output,\n\t\tvalue: response as unknown as JSONValue,\n\t}\n}\n", "import type { JSONValue, ToolResultPart } from \"ai\"\nimport { tool } from \"ai\"\nimport { isArray, isObject, isString } from \"utils/typeChecks.ts\"\nimport { z } from \"zod/v4\"\nimport type { ToolTraceContext } from \"../../raindrop/agentStreamTrace.ts\"\nimport type { Files } from \"../context/files.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { VIEW_IMAGE_TOOL_NAME } from \"./toolNames.ts\"\nimport { createUIConnectedTool } from \"./transformers/createUIConnectedTool.ts\"\nimport { isContentToolResultOutput, isJSONToolResultOutput } from \"./transformers/utils.ts\"\n\nexport const VIEW_IMAGE_MAX_URLS = 10\n\nconst ViewImageInputSchema = z.object({\n\turls: z\n\t\t.array(z.string())\n\t\t.min(1)\n\t\t.max(VIEW_IMAGE_MAX_URLS)\n\t\t.describe(`Exact image URLs to inspect visually. Pass at most ${VIEW_IMAGE_MAX_URLS} URLs per call.`),\n})\n\ntype ViewImageInput = z.infer<typeof ViewImageInputSchema>\n\ninterface ViewImageSuccessResult {\n\turl: string\n\timage_url: string\n}\n\ninterface ViewImageErrorResult {\n\turl: string\n\terror: string\n}\n\ntype ViewImageResult = ViewImageSuccessResult | ViewImageErrorResult\n\nexport interface ViewImageResponse {\n\tresults: ViewImageResult[]\n}\n\ntype ContentToolResultPart = Extract<ToolResultPart[\"output\"], { type: \"content\" }>[\"value\"][number]\n\nfunction viewImageResponseToJSONValue(response: ViewImageResponse): JSONValue {\n\treturn {\n\t\tresults: response.results.map(result => {\n\t\t\tif (\"image_url\" in result) {\n\t\t\t\treturn {\n\t\t\t\t\turl: result.url,\n\t\t\t\t\timage_url: result.image_url,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\turl: result.url,\n\t\t\t\terror: result.error,\n\t\t\t}\n\t\t}),\n\t}\n}\n\nfunction isViewImageSuccessResult(value: unknown): value is ViewImageSuccessResult {\n\treturn isObject(value) && isString(value.url) && isString(value.image_url)\n}\n\nfunction isViewImageErrorResult(value: unknown): value is ViewImageErrorResult {\n\treturn isObject(value) && isString(value.url) && isString(value.error)\n}\n\nfunction isViewImageResponse(value: unknown): value is ViewImageResponse {\n\treturn (\n\t\tisObject(value) &&\n\t\tisArray(value.results) &&\n\t\tvalue.results.every(result => isViewImageSuccessResult(result) || isViewImageErrorResult(result))\n\t)\n}\n\nasync function executeViewImage(\n\tinput: ViewImageInput,\n\tfiles: Pick<Files, \"getVisionImageUrl\">,\n): Promise<ViewImageResponse> {\n\tconst results: ViewImageResult[] = []\n\tconst seenUrls = new Set<string>()\n\n\tfor (const url of input.urls) {\n\t\tif (seenUrls.has(url)) continue\n\t\tseenUrls.add(url)\n\n\t\tconst result = await files.getVisionImageUrl(url)\n\t\tif (\"error\" in result) {\n\t\t\tresults.push({ url, error: result.error })\n\t\t\tcontinue\n\t\t}\n\n\t\tresults.push({ url, image_url: result.imageUrl })\n\t}\n\n\treturn { results }\n}\n\nexport function getViewImageToolResultOutput(response: ViewImageResponse): ToolResultPart[\"output\"] {\n\tconst imageParts: ContentToolResultPart[] = []\n\tfor (const result of response.results) {\n\t\tif (\"image_url\" in result) imageParts.push({ type: \"image-url\", url: result.image_url })\n\t}\n\n\tif (imageParts.length === 0) {\n\t\treturn {\n\t\t\ttype: \"json\",\n\t\t\tvalue: viewImageResponseToJSONValue(response),\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"content\",\n\t\tvalue: [{ type: \"text\", text: JSON.stringify(response) }, ...imageParts],\n\t}\n}\n\nexport function parseViewImageToolResultOutput(output: ToolResultPart[\"output\"]): ViewImageResponse | undefined {\n\tif (isJSONToolResultOutput(output)) {\n\t\tif (!isViewImageResponse(output.value)) return\n\t\treturn output.value\n\t}\n\n\tif (!isContentToolResultOutput(output)) return\n\n\tfor (const part of output.value) {\n\t\tif (part.type !== \"text\") continue\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(part.text)\n\t\t\tif (isViewImageResponse(value)) return value\n\t\t} catch {\n\t\t\t// Content tool outputs can contain unrelated text parts; keep looking for the JSON response.\n\t\t}\n\t}\n}\n\nconst description =\n\t`View up to ${VIEW_IMAGE_MAX_URLS} image URLs when visual inspection is needed. Use this for classification, comparison, recreation, or choosing by appearance; do not use it when exact attachment URLs can be applied directly.` as const\n\nexport function createViewImageTool(\n\tsynchronize: () => Promise<void>,\n\tfiles: Pick<Files, \"getVisionImageUrl\">,\n\t{\n\t\ttraceContextProvider,\n\t\tonPart,\n\t}: {\n\t\ttraceContextProvider?: () => ToolTraceContext | undefined\n\t\tonPart?: EmitChatPart\n\t} = {},\n) {\n\treturn createUIConnectedTool(\n\t\t{\n\t\t\tdescription,\n\t\t\tinputSchema: ViewImageInputSchema,\n\t\t\texecute: input => executeViewImage(input, files),\n\t\t\ttoModelOutput: ({ output }) => getViewImageToolResultOutput(output),\n\t\t},\n\t\t{\n\t\t\ttoolName: VIEW_IMAGE_TOOL_NAME,\n\t\t\ttracing: {\n\t\t\t\tgetTraceContext: () => traceContextProvider?.(),\n\t\t\t},\n\t\t\tonPart,\n\t\t\tsynchronize,\n\t\t\tonStart: input => ({\n\t\t\t\ttype: \"blocking-task\",\n\t\t\t\ttask: \"analyze\",\n\t\t\t\tmessage: input.urls.length === 1 ? \"image\" : \"images\",\n\t\t\t\tmetadata: { imageUrls: input.urls },\n\t\t\t}),\n\t\t},\n\t)\n}\n\nexport function createViewImageToolDefinition() {\n\treturn tool({\n\t\tdescription,\n\t\tinputSchema: ViewImageInputSchema,\n\t})\n}\n\nexport const testing = {\n\texecuteViewImage,\n}\n", "import { assert, assertNever, emptyArray } from \"@framerjs/shared\"\nimport type { JSONValue, ToolResultPart, Tool, ToolSet, TypedToolCall, TypedToolResult } from \"ai\"\nimport type { AgentInteractionHandle } from \"app/ai/raindrop/AgentInteraction.ts\"\nimport type { ToolTraceContext } from \"app/ai/raindrop/agentStreamTrace.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"app/ai/tracing/openRouterTrace.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport type { AgentContext } from \"../context/AgentContext.ts\"\nimport type { Command } from \"../dsl.ts\"\nimport type { EmitChatPart } from \"../types.ts\"\nimport { createAskClarificationTool, type ClarificationAnswerProvider } from \"./askClarification.ts\"\nimport { createChecklistCompleteTaskTool, createChecklistCreateTool } from \"./checklist.ts\"\nimport { createCreateComponentFromFrameTool } from \"./createComponentFromFrame.ts\"\nimport { createFetchExternalUrlTool } from \"./fetchExternalUrl.ts\"\nimport { createFlattenComponentInstanceTool } from \"./flattenComponentInstance.ts\"\nimport { createMakeExternalComponentLocalTool } from \"./makeExternalComponentLocal.ts\"\nimport { createPublishTool } from \"./publish.ts\"\nimport { createQueryImagesTool, getQueryImagesToolResultOutput } from \"./queryImages.ts\"\nimport { createReadProjectTool } from \"./readProject.ts\"\nimport { getReadProjectToolResultOutput } from \"./readProjectToolResultOutput.ts\"\nimport {\n\tcreateRequestCodeFileChangesTool,\n\tgetRequestCodeFileChangesToolResultOutput,\n\ttype RequestCodeFileHistoryChange,\n\ttype RequestCodeFileChangesExecutor,\n} from \"./requestCodeFileChanges.ts\"\nimport { createReviewChangesTool } from \"./reviewChanges.ts\"\nimport type { AgentScriptInstrumentation } from \"./script/bridge.ts\"\nimport { createScriptTool } from \"./script/tool.ts\"\nimport {\n\tASK_CLARIFICATION_TOOL_NAME,\n\tCHECKLIST_COMPLETE_TASK_TOOL_NAME,\n\tCHECKLIST_CREATE_TOOL_NAME,\n\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n\tVIEW_IMAGE_TOOL_NAME,\n} from \"./toolNames.ts\"\nimport { createViewImageTool, getViewImageToolResultOutput } from \"./viewImage.ts\"\n\nexport function createToolSet({\n\tabortSignal,\n\tctx,\n\tonCodeFileHistoryChanges,\n\tonPart,\n\tcreateDSLCommandHandler,\n\tsynchronize,\n\ttraceConfig,\n\ttreeStore,\n\twaitForUserAnswers,\n\tgetToolTraceContext,\n\tagentInteraction,\n\tdisableRaindropTelemetry,\n\trequestCodeFileChangesExecutor,\n\tscriptEvalInstrumentation,\n}: {\n\tctx: AgentContext\n\ttreeStore: TreeStore\n\tabortSignal: AbortSignal | undefined\n\ttraceConfig: OpenRouterFeatureStepTraceConfig\n\tsynchronize: (fullSync?: boolean) => Promise<void>\n\tcreateDSLCommandHandler: (persistParts?: boolean) => (parsed: Command | Error, raw: string) => void\n\tonCodeFileHistoryChanges: ((changes: readonly RequestCodeFileHistoryChange[]) => void) | undefined\n\tonPart: EmitChatPart | undefined\n\twaitForUserAnswers: ClarificationAnswerProvider | undefined\n\tgetToolTraceContext: () => ToolTraceContext | undefined\n\tagentInteraction?: AgentInteractionHandle\n\tdisableRaindropTelemetry?: boolean\n\trequestCodeFileChangesExecutor?: RequestCodeFileChangesExecutor\n\tscriptEvalInstrumentation?: AgentScriptInstrumentation\n}) {\n\tconst options = {\n\t\ttraceContextProvider: getToolTraceContext,\n\t\tonPart,\n\t\tabortSignal,\n\t}\n\tconst tools = {\n\t\t[CHECKLIST_CREATE_TOOL_NAME]: createChecklistCreateTool(ctx, synchronize, options),\n\t\t[CHECKLIST_COMPLETE_TASK_TOOL_NAME]: createChecklistCompleteTaskTool(ctx, synchronize, options),\n\t\t[READ_PROJECT_TOOL_NAME]: createReadProjectTool(treeStore, ctx, traceConfig, synchronize, {\n\t\t\t...options,\n\t\t\tagentInteraction,\n\t\t\tdisableRaindropTelemetry,\n\t\t}),\n\t\t[ASK_CLARIFICATION_TOOL_NAME]: createAskClarificationTool(\n\t\t\tasync questions => waitForUserAnswers?.(questions) ?? emptyArray(),\n\t\t\tsynchronize,\n\t\t\toptions,\n\t\t),\n\t\t[FETCH_EXTERNAL_URL_TOOL_NAME]: createFetchExternalUrlTool(synchronize, ctx.files, options),\n\t\t[CREATE_COMPONENT_FROM_FRAME_TOOL_NAME]: createCreateComponentFromFrameTool(ctx, synchronize, options),\n\t\t[QUERY_IMAGES_TOOL_NAME]: createQueryImagesTool(synchronize, ctx.files, options),\n\t\t[VIEW_IMAGE_TOOL_NAME]: createViewImageTool(synchronize, ctx.files, options),\n\t\t[SCRIPT_TOOL_NAME]: createScriptTool(ctx, abortSignal, createDSLCommandHandler, synchronize, {\n\t\t\t...options,\n\t\t\tscriptEvalInstrumentation,\n\t\t}),\n\t\t[PUBLISH_TOOL_NAME]: createPublishTool(synchronize, ctx, options),\n\t\t[REVIEW_CHANGES_TOOL_NAME]: createReviewChangesTool(ctx, synchronize, onPart),\n\t\t[FLATTEN_COMPONENT_INSTANCE_TOOL_NAME]: createFlattenComponentInstanceTool(ctx, synchronize, options),\n\t\t[MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME]: createMakeExternalComponentLocalTool(ctx, synchronize, options),\n\t\t[REQUEST_CODE_FILE_CHANGES_TOOL_NAME]: createRequestCodeFileChangesTool(\n\t\t\tctx,\n\t\t\tsynchronize,\n\t\t\ttraceConfig.sessionId,\n\t\t\tonCodeFileHistoryChanges,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\texecute: requestCodeFileChangesExecutor,\n\t\t\t},\n\t\t),\n\t} as const satisfies ToolSet\n\n\treturn tools\n}\ntype ToolInputFor<TTool> = TTool extends Tool<infer TInput, any> ? TInput : never\nexport type AgentToolSet = ReturnType<typeof createToolSet>\ntype AgentToolName = keyof AgentToolSet\ntype AgentTypedToolCallBase = Omit<TypedToolCall<AgentToolSet>, \"toolName\" | \"input\">\ntype AgentDynamicToolCall = Extract<TypedToolCall<AgentToolSet>, { dynamic: true }>\nexport type AgentTypedToolResult = Exclude<TypedToolResult<AgentToolSet>, { dynamic: true }>\nexport type AgentTypedToolCall = {\n\t[TName in AgentToolName]: AgentTypedToolCallBase & {\n\t\ttoolName: TName\n\t\tinput: ToolInputFor<AgentToolSet[TName]>\n\t\tdynamic?: false | undefined\n\t}\n}[AgentToolName]\n\nexport type AgentInvalidToolCall = Omit<AgentDynamicToolCall, \"invalid\"> & {\n\tinvalid: true\n}\n\n/**\n * Framer does not support dynamic tool results, so we benefit from narrowing the type to the\n * non-dynamic variant.\n */\nexport function toAgentTypedToolResult(result: TypedToolResult<AgentToolSet>): AgentTypedToolResult {\n\tassert(isAgentTypedToolResult(result), \"Unexpected dynamic tool result\")\n\treturn result\n}\n\nexport function isAgentTypedToolResult(result: TypedToolResult<AgentToolSet>): result is AgentTypedToolResult {\n\treturn result.dynamic !== true\n}\n\nconst toolNames = [\n\tCHECKLIST_CREATE_TOOL_NAME,\n\tCHECKLIST_COMPLETE_TASK_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tASK_CLARIFICATION_TOOL_NAME,\n\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tVIEW_IMAGE_TOOL_NAME,\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n] as const satisfies readonly AgentToolName[]\n\nconst toolSet = new Set<string>(toolNames)\nexport function isAgentToolName(name: string): name is AgentToolName {\n\treturn toolSet.has(name)\n}\n\nexport function toAgentTypedToolCall(call: TypedToolCall<AgentToolSet>): AgentTypedToolCall {\n\tassert(isAgentToolName(call.toolName), `Unexpected tool name: ${call.toolName}`)\n\tassert(call.dynamic !== true, `Unexpected dynamic tool call: ${call.toolName}`)\n\treturn call\n}\n/**\n * Centralizes tool-result serialization so new tool names are exhaustively handled at compile time.\n * We must report the `toModelOutput` implementations here so that we can trivially rebuild the\n * untyped message payload from the typed output\n */\nexport function getModelOutputForToolResult(toolResult: AgentTypedToolResult): ToolResultPart[\"output\"] {\n\tswitch (toolResult.toolName) {\n\t\tcase READ_PROJECT_TOOL_NAME:\n\t\t\treturn getReadProjectToolResultOutput(toolResult.output)\n\t\tcase QUERY_IMAGES_TOOL_NAME:\n\t\t\treturn getQueryImagesToolResultOutput(toolResult.output)\n\t\tcase VIEW_IMAGE_TOOL_NAME:\n\t\t\treturn getViewImageToolResultOutput(toolResult.output)\n\t\tcase REQUEST_CODE_FILE_CHANGES_TOOL_NAME:\n\t\t\treturn getRequestCodeFileChangesToolResultOutput(toolResult.output)\n\t\tcase ASK_CLARIFICATION_TOOL_NAME:\n\t\tcase CHECKLIST_CREATE_TOOL_NAME:\n\t\tcase CHECKLIST_COMPLETE_TASK_TOOL_NAME:\n\t\tcase CREATE_COMPONENT_FROM_FRAME_TOOL_NAME:\n\t\tcase FETCH_EXTERNAL_URL_TOOL_NAME:\n\t\tcase FLATTEN_COMPONENT_INSTANCE_TOOL_NAME:\n\t\tcase MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME:\n\t\tcase PUBLISH_TOOL_NAME:\n\t\tcase REVIEW_CHANGES_TOOL_NAME:\n\t\tcase SCRIPT_TOOL_NAME:\n\t\t\treturn {\n\t\t\t\ttype: \"json\",\n\t\t\t\t// Unfortunately our types are more accurate than the flexible value that AI SDK wants. So we\n\t\t\t\t// cast. A better solution would be fantastic.\n\t\t\t\tvalue: toolResult.output as unknown as JSONValue,\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(toolResult, \"Unhandled tool result for model output\")\n\t}\n}\n\nexport function isToolResultForName<TName extends keyof AgentToolSet>(\n\tresult: AgentTypedToolResult,\n\ttoolName: TName,\n): result is Extract<AgentTypedToolResult, { toolName: TName }> {\n\treturn result.toolName === toolName\n}\n", "import { assertNever, emptyArray } from \"@framerjs/shared\"\nimport type {\n\tAssistantContent,\n\tLanguageModelUsage,\n\tModelMessage,\n\tProviderMetadata,\n\tToolCallPart,\n\tToolResultPart,\n\tTypedToolCall,\n\tUserModelMessage,\n} from \"ai\"\nimport type { AgentAttachmentFile, AgentAttachmentFileType } from \"app/agent/attachments.ts\"\nimport { segmentsToTextContent } from \"app/agent/editor/utils/input.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isArray, isObject, isString } from \"utils/typeChecks.ts\"\nimport { formatAnnotation, formatDesignPlanBlock, formatProjectUpdateBlock } from \"./DocumentParser.ts\"\nimport type { AgentContext, ContextRuntimeState } from \"./context/AgentContext.ts\"\nimport {\n\tcreateImageAttachmentsTag,\n\tregisterTrustedFileUrlsFromModelMessages,\n\tstripImageAttachmentMessages,\n} from \"./context/files.ts\"\nimport { CommandType, isCommand, type Command } from \"./dsl.ts\"\nimport { commandToDSL } from \"./nodeToDSLCommands.ts\"\nimport {\n\tgetModelOutputForToolResult,\n\ttype AgentInvalidToolCall,\n\ttype AgentToolSet,\n\ttype AgentTypedToolCall,\n\ttype AgentTypedToolResult,\n} from \"./tools/toolSet.ts\"\nimport type { AgentRequest, ChatPart } from \"./types.ts\"\n\ntype Prose = string\n\nexport interface CommandError {\n\ttype: \"command-error\"\n\traw: string\n}\n\nexport interface Annotation {\n\ttype: \"annotation\"\n\tcontent: string\n}\n\ntype ProjectUpdate = (Command | CommandError | Annotation)[]\n\nexport function isCommandError(line: unknown): line is CommandError {\n\treturn isObject(line) && line.type === \"command-error\"\n}\n\nfunction isAnnotation(line: unknown): line is Annotation {\n\treturn isObject(line) && line.type === \"annotation\"\n}\n\nexport interface DesignPlan {\n\ttype: \"design-plan\"\n\tcontent: string\n}\n\nexport interface AssistantReasoningPart {\n\ttype: \"reasoning\"\n\ttext: string\n}\n\nexport function isDesignPlan(line: unknown): line is DesignPlan {\n\treturn isObject(line) && line.type === \"design-plan\"\n}\n\nfunction isAssistantReasoningPart(part: unknown): part is AssistantReasoningPart {\n\treturn isObject(part) && part.type === \"reasoning\" && isString(part.text)\n}\n\nexport function isAssistantToolCallPart(\n\tpart: AssistantResponsePart,\n): part is Extract<AssistantResponsePart, { type: \"tool-call\" }> {\n\treturn isObject(part) && part.type === \"tool-call\"\n}\n\nfunction isAssistantInvalidToolCallPart(\n\tpart: AssistantResponsePart,\n): part is Extract<AssistantResponsePart, { type: \"invalid-tool-call\" }> {\n\treturn isObject(part) && part.type === \"invalid-tool-call\"\n}\n\ntype RawAgentInvalidToolCall = Omit<AgentInvalidToolCall, \"input\"> &\n\tPick<Extract<TypedToolCall<AgentToolSet>, { dynamic: true }>, \"input\">\n\nexport function isAgentInvalidToolCall(call: { invalid?: boolean }): call is RawAgentInvalidToolCall {\n\treturn call.invalid === true\n}\n\nexport function toAgentInvalidToolCall(call: RawAgentInvalidToolCall): AgentInvalidToolCall {\n\treturn {\n\t\ttype: call.type,\n\t\ttoolCallId: call.toolCallId,\n\t\ttoolName: call.toolName,\n\t\tinput: call.input,\n\t\tproviderExecuted: call.providerExecuted,\n\t\tproviderMetadata: call.providerMetadata,\n\t\tdynamic: call.dynamic,\n\t\tinvalid: true,\n\t\terror: call.error,\n\t\ttitle: call.title,\n\t}\n}\n\ntype InvalidToolCallContent = Extract<AssistantResponsePart, { type: \"invalid-tool-call\" }>[\"content\"]\n\nfunction toToolCallPart(toolCall: AgentTypedToolCall): ToolCallPart {\n\treturn {\n\t\ttype: \"tool-call\",\n\t\ttoolCallId: toolCall.toolCallId,\n\t\ttoolName: toolCall.toolName,\n\t\tinput: toolCall.input,\n\t\tproviderExecuted: toolCall.providerExecuted,\n\t\tproviderOptions: toolCall.providerMetadata,\n\t}\n}\n\nfunction toInvalidToolCallPart(toolCall: InvalidToolCallContent): ToolCallPart {\n\treturn {\n\t\ttype: \"tool-call\",\n\t\ttoolCallId: toolCall.toolCallId,\n\t\ttoolName: toolCall.toolName,\n\t\tinput: toolCall.input,\n\t\tproviderExecuted: toolCall.providerExecuted,\n\t\tproviderOptions: toolCall.providerMetadata,\n\t}\n}\n\nfunction toInvalidToolResultPart(toolCall: InvalidToolCallContent): ToolResultPart {\n\treturn {\n\t\ttype: \"tool-result\",\n\t\ttoolCallId: toolCall.toolCallId,\n\t\ttoolName: toolCall.toolName,\n\t\toutput: {\n\t\t\ttype: \"error-text\",\n\t\t\tvalue: formatInvalidToolCallError(toolCall.error),\n\t\t},\n\t\tproviderOptions: toolCall.providerMetadata,\n\t}\n}\n\nfunction toToolResultPart(toolResult: AgentTypedToolResult): ToolResultPart {\n\treturn {\n\t\ttype: \"tool-result\",\n\t\ttoolCallId: toolResult.toolCallId,\n\t\ttoolName: toolResult.toolName,\n\t\toutput: getModelOutputForToolResult(toolResult),\n\t\tproviderOptions: toolResult.providerMetadata,\n\t}\n}\n\nfunction formatInvalidToolCallError(error: unknown): string {\n\tif (error instanceof Error) return error.message\n\tif (isObject(error) && isString(error.message)) return error.message\n\tif (isString(error)) return error\n\treturn \"Tool call failed validation.\"\n}\n\ntype ExecutedCommandTypes = CommandType.Add | CommandType.Duplicate | CommandType.CreateVariant\n\nexport type ExecutedCommand<T extends Command = Command> = T extends Command\n\t? T[\"type\"] extends ExecutedCommandTypes\n\t\t? T & { nodeId?: NodeID }\n\t\t: T\n\t: never\n\nexport function isExecutedCommand(\n\tcommand: Command,\n): command is ExecutedCommand<Command & { type: ExecutedCommandTypes }> {\n\treturn (\n\t\tcommand.type === CommandType.Add ||\n\t\tcommand.type === CommandType.Duplicate ||\n\t\tcommand.type === CommandType.CreateVariant\n\t)\n}\n\nexport type FlatAssistantResponsePart =\n\t| ExecutedCommand\n\t| CommandError\n\t| Annotation\n\t| DesignPlan\n\t| AssistantReasoningPart\n\t| Prose\n\t| (Omit<Extract<ChatPart, { type: \"tool-call\" }>, \"type\"> & { type: \"tool-call\" })\n\t| (Omit<Extract<ChatPart, { type: \"invalid-tool-call\" }>, \"type\"> & { type: \"invalid-tool-call\" })\n\nexport type AssistantResponsePartUpdater<T extends FlatAssistantResponsePart> = (\n\tfn: (current: T, timestamp: number) => Partial<T>,\n) => void\n\nexport type AssistantResponsePart =\n\t| Prose\n\t| DesignPlan\n\t| AssistantReasoningPart\n\t| ProjectUpdate\n\t| (Omit<Extract<ChatPart, { type: \"tool-call\" }>, \"type\"> & { type: \"tool-call\" })\n\t| (Omit<Extract<ChatPart, { type: \"invalid-tool-call\" }>, \"type\"> & { type: \"invalid-tool-call\" })\n\n// In practice Openrouter can return partial usage, so we need to allow for that.\nexport type AnyLanguageModelUsage = Partial<\n\tOmit<LanguageModelUsage, \"inputTokenDetails\" | \"outputTokenDetails\"> & {\n\t\tinputTokenDetails: Partial<LanguageModelUsage[\"inputTokenDetails\"]>\n\t\toutputTokenDetails: Partial<LanguageModelUsage[\"outputTokenDetails\"]>\n\t}\n>\n\nexport interface ToolStep {\n\tcontent: AssistantResponsePart[]\n\ttoolResults: AgentTypedToolResult[]\n\t/**\n\t * Legacy fallback payload used by migrated snapshots.\n\t * New conversations should not record this.\n\t */\n\traw?: readonly ModelMessage[]\n\tretried?: boolean\n\tmetadata: {\n\t\tproviderMetadata?: ProviderMetadata\n\t\tusage?: AnyLanguageModelUsage\n\t\tcrdtSnapshot?: {\n\t\t\t/**\n\t\t\t * Absolute CRDT row index captured immediately before this tool step starts.\n\t\t\t * Replaying to this boundary restores the project to the state the tool saw before it ran.\n\t\t\t * `undefined` means we did not record a pre-step CRDT boundary, so this step cannot be used\n\t\t\t * as the first included-step-count boundary in the request.\n\t\t\t */\n\t\t\tbeforeRowIndex?: number\n\t\t\t/**\n\t\t\t * Absolute CRDT row index captured immediately after this tool step's effects are complete.\n\t\t\t * Replaying to this boundary restores the project with this step applied, but before later\n\t\t\t * steps in the same request. `undefined` means we did not record a post-step CRDT boundary,\n\t\t\t * so this step cannot be used as the final included step for replay.\n\t\t\t */\n\t\t\tafterRowIndex?: number\n\t\t\t/**\n\t\t\t * Runtime state captured immediately after this tool step's effects are complete.\n\t\t\t * Step-boundary replay must hydrate this alongside `afterRowIndex`, so follow-up turns see\n\t\t\t * the same side-channel runtime state that existed after this step.\n\t\t\t */\n\t\t\tafterRuntimeState?: ContextRuntimeState\n\t\t}\n\t\t/**\n\t\t * Number of transient turn messages that existed when this tool step started.\n\t\t * Eval step-boundary replay uses this to keep a best-effort visual chat prefix.\n\t\t */\n\t\tbeforeMessageCount?: number\n\t}\n}\n\nfunction convertToAssistantResponse(response: ToolStep): {\n\tcontent: AssistantContent\n\tinvalidToolResults: AgentInvalidToolCall[]\n} {\n\tconst toolResultIds = new Set(response.toolResults.map(result => result.toolCallId))\n\tconst content: Exclude<AssistantContent, string> = []\n\tconst invalidToolResults: AgentInvalidToolCall[] = []\n\tlet textBuffer = \"\"\n\n\tconst flushText = () => {\n\t\tif (!textBuffer) return\n\t\tcontent.push({ type: \"text\", text: textBuffer })\n\t\ttextBuffer = \"\"\n\t}\n\n\tfor (const part of response.content) {\n\t\tif (isAssistantToolCallPart(part)) {\n\t\t\t// The AI SDK requires every replayed tool call to have a matching tool-result message later in\n\t\t\t// the history. Interrupted steps can record a tool call before its result arrives, so only\n\t\t\t// replay calls whose `toolCallId` is present in the recorded tool results for this step.\n\t\t\tif (!toolResultIds.has(part.content.toolCallId)) continue\n\t\t\tflushText()\n\t\t\tcontent.push(toToolCallPart(part.content))\n\t\t} else if (isAssistantInvalidToolCallPart(part)) {\n\t\t\tflushText()\n\t\t\tcontent.push(toInvalidToolCallPart(part.content))\n\t\t\tinvalidToolResults.push(part.content)\n\t\t} else if (isAssistantReasoningPart(part)) {\n\t\t\tflushText()\n\t\t\tcontent.push(part)\n\t\t} else if (isString(part)) {\n\t\t\ttextBuffer += part\n\t\t} else if (isDesignPlan(part)) {\n\t\t\ttextBuffer += formatDesignPlanBlock(part.content)\n\t\t} else {\n\t\t\ttextBuffer += formatProjectUpdateBlock(\n\t\t\t\tpart\n\t\t\t\t\t.map(line => {\n\t\t\t\t\t\tif (isAnnotation(line)) return formatAnnotation(line.content)\n\t\t\t\t\t\tif (isCommandError(line)) return line.raw\n\t\t\t\t\t\treturn commandToDSL(line)\n\t\t\t\t\t})\n\t\t\t\t\t.join(\" \"),\n\t\t\t)\n\t\t}\n\t}\n\n\tflushText()\n\treturn { content, invalidToolResults }\n}\n\nfunction convertToolStepsToModelMessages(response: readonly ToolStep[]): readonly ModelMessage[] {\n\tconst messages: ModelMessage[] = []\n\tfor (const item of response) {\n\t\t// Legacy fallback payload used by migrated snapshots.\n\t\tif (item.raw?.length) {\n\t\t\tmessages.push(...item.raw)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (item.content.length === 0 && item.toolResults.length === 0) continue\n\n\t\tconst { content, invalidToolResults } = convertToAssistantResponse(item)\n\t\tif (content.length === 0 && item.toolResults.length === 0) continue\n\n\t\tmessages.push({\n\t\t\trole: \"assistant\",\n\t\t\tcontent,\n\t\t\tproviderOptions: item.metadata.providerMetadata,\n\t\t})\n\n\t\tif (item.toolResults.length === 0 && invalidToolResults.length === 0) {\n\t\t\tif (item.retried) messages.push(getContinuationMessage())\n\t\t\tcontinue\n\t\t}\n\n\t\t// Critically: Ensure that we convert the typed tool output to the raw `toModelOutput` format.\n\t\tmessages.push({\n\t\t\trole: \"tool\",\n\t\t\tcontent: [...invalidToolResults.map(toInvalidToolResultPart), ...item.toolResults.map(toToolResultPart)],\n\t\t})\n\t}\n\treturn messages\n}\n\nexport function getRequestModelMessages(request: Pick<AgentRequest, \"steps\">): readonly ModelMessage[] {\n\treturn convertToolStepsToModelMessages(request.steps ?? emptyArray<ToolStep>())\n}\n\nexport function getFlatAssistantResponsePart(part: ChatPart): FlatAssistantResponsePart | undefined {\n\tswitch (part.type) {\n\t\tcase \"tool-call\":\n\t\t\treturn { type: \"tool-call\", content: part.content }\n\t\tcase \"invalid-tool-call\":\n\t\t\treturn { type: \"invalid-tool-call\", content: part.content }\n\t\tcase \"thinking\":\n\t\t\treturn { ...part, type: \"reasoning\", text: part.text ?? \"\" }\n\t\tcase \"command\":\n\t\t\treturn part.command\n\t\tcase \"command-error\":\n\t\t\treturn { type: \"command-error\", raw: part.raw }\n\t\tcase \"annotation\":\n\t\t\treturn { type: \"annotation\", content: part.text }\n\t\tcase \"design-plan\":\n\t\t\treturn { type: \"design-plan\", content: part.text ?? \"\" }\n\t\tcase \"text\":\n\t\t\treturn part.text\n\t\tcase \"scripting\":\n\t\tcase \"script-read\":\n\t\tcase \"step\":\n\t\tcase \"create-component\":\n\t\tcase \"read\":\n\t\tcase \"code-patch\":\n\t\tcase \"clarification\":\n\t\tcase \"code-agent-status\":\n\t\tcase \"blocking-task\":\n\t\tcase \"tool-result\":\n\t\tcase \"changes\":\n\t\t\t// These types are not composable into the assistant response.\n\t\t\treturn\n\t\tdefault:\n\t\t\tassertNever(part, \"Unexpected part type\")\n\t}\n}\n\n/**\n * Each \"flat\" part may need to be combined with the last part, based on the part types.\n */\nexport function updateOrAppendPart(\n\tlastPart: AssistantResponsePart | undefined,\n\tpart: FlatAssistantResponsePart,\n): { value: AssistantResponsePart; op: \"update\" | \"append\" } {\n\t// Combine prose.\n\tif (isString(part)) {\n\t\treturn isString(lastPart) ? { op: \"update\", value: lastPart + part } : { op: \"append\", value: part }\n\t}\n\n\t// Combine project updates.\n\tif (isCommand(part) || isCommandError(part) || isAnnotation(part)) {\n\t\treturn isArray(lastPart) ? { op: \"update\", value: [...lastPart, part] } : { op: \"append\", value: [part] }\n\t}\n\n\t// Combine design plans tokens.\n\tif (isDesignPlan(part)) {\n\t\treturn isDesignPlan(lastPart)\n\t\t\t? { op: \"update\", value: { ...lastPart, content: lastPart.content + part.content } }\n\t\t\t: { op: \"append\", value: part }\n\t}\n\n\tif (isAssistantReasoningPart(part)) {\n\t\tif (isAssistantReasoningPart(lastPart)) {\n\t\t\treturn { op: \"update\", value: { ...lastPart, text: lastPart.text + part.text } }\n\t\t}\n\t\treturn { op: \"append\", value: part }\n\t}\n\n\t// Append tool calls.\n\tif (isAssistantToolCallPart(part)) return { op: \"append\", value: { type: \"tool-call\", content: part.content } }\n\tif (isAssistantInvalidToolCallPart(part)) {\n\t\treturn { op: \"append\", value: { type: \"invalid-tool-call\", content: part.content } }\n\t}\n\n\tassertNever(part, \"Unexpected part type\")\n}\n\nfunction createFileMessages(files: readonly AgentAttachmentFile[]): readonly string[] {\n\tif (!files?.length) return []\n\treturn files.map(createAgentAttachmentFileContextMessage)\n}\nexport const agentAttachmentSizeInBytesLimit = 32 * 1024\n\nconst inlineFileTypes = new Set<AgentAttachmentFileType>([\"markdown\", \"plain\"])\n\nfunction createAgentAttachmentFileContextMessage(file: AgentAttachmentFile): string {\n\tconst asset = file.uploadResult.asset\n\tconst attributes = [\n\t\t`id=\"${asset.key}\"`,\n\t\t`name=\"${asset.name}\"`,\n\t\t`mime=\"${asset.mimeType}\"`,\n\t\t`type=\"${file.fileType}\"`,\n\t\t`content=\"data\"`,\n\t\t`sizeBytes=\"${file.sizeBytes}\"`,\n\t].join(\" \")\n\tconst textContent = file.text ?? \"\"\n\tconst shouldRenderTextContentInline =\n\t\tfile.sizeBytes <= agentAttachmentSizeInBytesLimit && textContent.length > 0 && inlineFileTypes.has(file.fileType)\n\n\tif (shouldRenderTextContentInline) return `<file ${attributes}>\\n${textContent}\\n</file>`\n\n\treturn `<file ${attributes}></file>`\n}\n\nexport function convertToModelMessages(request: AgentRequest, ctx: AgentContext): readonly ModelMessage[] {\n\tconst attachmentUrls = ctx.files.referenceUrls(request.images)\n\tconst attachmentsTag = createImageAttachmentsTag(attachmentUrls)\n\tconst normalizedContextMessages =\n\t\tattachmentUrls.length > 0 ? stripImageAttachmentMessages(request.contextMessages) : request.contextMessages\n\tconst fileMessages = createFileMessages(request.files)\n\tconst messages: ModelMessage[] = [\n\t\t{\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t...normalizedContextMessages.map(message => ({ type: \"text\", text: message }) as const),\n\t\t\t\t...(attachmentsTag ? ([{ type: \"text\", text: attachmentsTag }] as const) : []),\n\t\t\t\t...fileMessages.map(message => ({ type: \"text\", text: message }) as const),\n\t\t\t\t{ type: \"text\", text: segmentsToTextContent(ctx.treeStore.tree, request.parts).trim() },\n\t\t\t],\n\t\t},\n\t\t...getRequestModelMessages(request),\n\t]\n\n\tregisterTrustedFileUrlsFromModelMessages(messages, ctx)\n\n\treturn messages\n}\n\nconst systemMessageTag = \"system-message\"\nfunction getContinuationMessage(): UserModelMessage {\n\treturn {\n\t\trole: \"user\",\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `<${systemMessageTag}>Stream was interrupted. Continue from where you left off.</${systemMessageTag}>`,\n\t\t\t},\n\t\t],\n\t}\n}\n", "export const FRAMER_SITE_PARAMETER_PREFIX = \"framer_\"\nexport const EDIT_SITE_KEY = \"editSite\"\nexport const FRAMER_VARIANT_KEY = `framer_variant` // Must match FramerDomainsServer\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { AnnotationKey } from \"@framerjs/framer-runtime/crossorigin\"\nimport { getLogger, isChrome, isElectron, isLocalHostname } from \"@framerjs/shared\"\nimport {\n\tAnalyticsScopeNode,\n\ttype CanvasTree,\n\ttype CollectionItemNode,\n\ttype CollectionNode,\n\ttype WebPageNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { FunnelStatus } from \"document/models/CanvasTree/nodes/FunnelNode.ts\"\nimport type { Locale, LocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport type { ChromeStore } from \"document/stores/ChromeStore.ts\"\nimport type { ContentManagementStore } from \"document/stores/ContentManagementStore.ts\"\nimport type { LocalizationStore } from \"document/stores/LocalizationStore.ts\"\nimport type { ProjectStore } from \"document/stores/ProjectStore.ts\"\nimport type { PublishStore } from \"document/stores/PublishStore.ts\"\nimport type { ScopeStore } from \"document/stores/ScopeStore.ts\"\nimport type { SelectionStore } from \"document/stores/SelectionStore.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { getCollectionItemSlug } from \"utils/collectionUtils.ts\"\nimport { isDefined, isNull, isUndefined } from \"utils/typeChecks.ts\"\nimport {\n\tgetCollectionNodeFromStackElement,\n\tgetItemNodeFromStackElement,\n} from \"../../utils/contentManagementOverlayStack.ts\"\nimport { getActiveCollectionNode, getSelectedCollectionItem } from \"./collectionItemUtils.ts\"\nimport { getWebPagePath } from \"./getWebPagePath.ts\"\nimport { isProductionSite } from \"./isProductionSite.ts\"\nimport { EDIT_SITE_KEY, FRAMER_VARIANT_KEY } from \"./siteParameters.ts\"\n\nconst log = getLogger(\"getActiveWebPageURL\")\n\nfunction getActiveNonDefaultLocale({\n\tchromeStore,\n\ttreeStore,\n\tlocalizationStore,\n}: {\n\tchromeStore: ChromeStore\n\ttreeStore: TreeStore\n\tlocalizationStore: LocalizationStore\n}): Locale | undefined {\n\tif (chromeStore.isPreviewingLocaleOnCanvas) {\n\t\treturn treeStore.tree.root.getNonDefaultLocale(chromeStore.canvasLocaleId)\n\t}\n\tif (chromeStore.mainView === ActiveMainView.Localizations) {\n\t\treturn treeStore.tree.root.getNonDefaultLocale(localizationStore.selectedLocaleId)\n\t}\n}\n\nfunction combineIntoPath({\n\tbaseUrl,\n\tlocaleSlug,\n\tpath,\n}: {\n\tbaseUrl: string\n\tlocaleSlug: string | undefined\n\tpath: string\n}): string {\n\treturn baseUrl + (localeSlug ? \"/\" + localeSlug : \"\") + path\n}\n\n/**\n * @returns localeSlug: slug segment to construct the path\n * @returns activeLocaleId: id of the current active locale\n * @returns pagePathLocaleId: id of the locale to use ONLY for page path (because if related experiment is disabled, it fallbacks to default)\n * It might look weird that we are using different locale ids for, for instance, extracting variables and for constructing path,\n * but it will go away once we get rid of experiment. Till then, on practice they should give the same results\n * (i.e. even if path is localized, it will accept the same variables as default locale path)\n */\nfunction getLocaleSlugAndPagePathLocaleId({\n\tchromeStore,\n\ttreeStore,\n\tlocalizationStore,\n}: {\n\tchromeStore: ChromeStore\n\ttreeStore: TreeStore\n\tlocalizationStore: LocalizationStore\n}): {\n\tlocaleSlug: string | undefined\n\tactiveLocaleId: LocaleId\n\tpagePathLocaleId: LocaleId\n} {\n\tconst activeNonDefaultLocale = getActiveNonDefaultLocale({ chromeStore, treeStore, localizationStore })\n\tconst nonDefaultLocaleToUse =\n\t\tactiveNonDefaultLocale && !activeNonDefaultLocale.draft ? activeNonDefaultLocale : undefined\n\n\tconst localeSlug = nonDefaultLocaleToUse?.slug ?? undefined\n\n\tconst shouldLocalizePath = treeStore.tree.root.translatePagePaths === \"yes\" && !!nonDefaultLocaleToUse\n\tconst pagePathLocaleId: LocaleId = shouldLocalizePath ? nonDefaultLocaleToUse.id : defaultLocaleId\n\n\treturn {\n\t\tlocaleSlug,\n\t\tactiveLocaleId: nonDefaultLocaleToUse?.id ?? defaultLocaleId,\n\t\tpagePathLocaleId,\n\t}\n}\n\n/**\n * @params hostname The hostname to use for the URL\n * @params useCanonicalUrl Whether to use canonical URL when available\n */\nexport function getActiveWebPageURL(\n\tcomponentLoader: ComponentLoader,\n\t{\n\t\tpublishStore,\n\t\tscopeStore,\n\t\ttreeStore,\n\t\tchromeStore,\n\t\tlocalizationStore,\n\t\tcontentManagementStore,\n\t\tprojectStore,\n\t\tselectionStore,\n\t}: {\n\t\tchromeStore: ChromeStore\n\t\ttreeStore: TreeStore\n\t\tlocalizationStore: LocalizationStore\n\t\tcontentManagementStore: ContentManagementStore\n\t\tscopeStore: ScopeStore\n\t\tselectionStore: SelectionStore\n\t\tprojectStore: ProjectStore\n\t\tpublishStore: PublishStore\n\t},\n\thostname: string,\n\tuseCanonicalUrl: boolean = false,\n): string {\n\tlet protocol = \"https://\"\n\tif (isLocalHostname(hostname)) {\n\t\tprotocol = \"http://\"\n\t}\n\tconst canonicalURL = publishStore.canonicalURL\n\tconst baseUrl = useCanonicalUrl && canonicalURL.type === \"custom\" ? canonicalURL.url : `${protocol}${hostname}`\n\n\tconst { localeSlug, pagePathLocaleId, activeLocaleId } = getLocaleSlugAndPagePathLocaleId({\n\t\tchromeStore,\n\t\ttreeStore,\n\t\tlocalizationStore,\n\t})\n\n\tconst pathForActiveCollectionItem = getWebPagePathForActiveCollection(\n\t\t{ chromeStore, treeStore, contentManagementStore, scopeStore, selectionStore },\n\t\tpagePathLocaleId,\n\t)\n\tif (isDefined(pathForActiveCollectionItem)) {\n\t\treturn combineIntoPath({ baseUrl, localeSlug, path: pathForActiveCollectionItem })\n\t}\n\n\t// Find closest web page in breadcrumbs (if any).\n\tconst webPageNode = scopeStore.getTopMostWebPageNode()\n\tif (!webPageNode || !webPageNode.isLoaded()) return baseUrl\n\n\ttry {\n\t\tconst pathVariables = getWebPagePathVariables(\n\t\t\ttreeStore.tree,\n\t\t\tcomponentLoader,\n\t\t\twebPageNode,\n\t\t\tscopeStore,\n\t\t\tactiveLocaleId,\n\t\t)\n\n\t\tconst path = getWebPagePath(treeStore.tree, webPageNode, pagePathLocaleId, pathVariables) ?? \"\"\n\n\t\tconst url = new URL(combineIntoPath({ baseUrl, localeSlug, path }))\n\n\t\tconst abTest = webPageNode.getAbTestingFunnel(AnalyticsScopeNode.get(treeStore.tree)?.loaded)\n\t\tif (abTest?.status === FunnelStatus.Started && webPageNode.hasAbTestingChildren(treeStore.tree)) {\n\t\t\turl.searchParams.set(FRAMER_VARIANT_KEY, webPageNode.id)\n\t\t}\n\n\t\tconst editorBarDisabled = projectStore.featureFlags?.blockEditorBar === \"on\"\n\t\tconst shouldAddEditSiteParam = !isChrome() || isElectron()\n\n\t\tif (isProductionSite(hostname) && !editorBarDisabled && shouldAddEditSiteParam) {\n\t\t\t// Manually add the editSite parameter without a value to avoid the equals sign\n\t\t\t// that url.searchParams.set() would automatically add\n\t\t\tconst separator = url.searchParams.size > 0 ? \"&\" : \"?\"\n\t\t\turl.search += separator + EDIT_SITE_KEY\n\t\t}\n\n\t\treturn url.toString()\n\t} catch (e) {\n\t\tlog.warn(\"Couldn't compute path\", e, webPageNode.id, webPageNode.pagePath)\n\t\treturn baseUrl\n\t}\n}\n\nfunction getWebPagePathForActiveCollection(\n\t{\n\t\tchromeStore,\n\t\ttreeStore,\n\t\tcontentManagementStore,\n\t\tscopeStore,\n\t\tselectionStore,\n\t}: {\n\t\tchromeStore: ChromeStore\n\t\ttreeStore: TreeStore\n\t\tcontentManagementStore: ContentManagementStore\n\t\tscopeStore: ScopeStore\n\t\tselectionStore: SelectionStore\n\t},\n\tpagePathLocaleId: LocaleId,\n): string | undefined {\n\tconst activeCollection = getActiveCollection({\n\t\tchromeStore,\n\t\ttreeStore,\n\t\tcontentManagementStore,\n\t\tscopeStore,\n\t\tselectionStore,\n\t})\n\tif (isUndefined(activeCollection)) return undefined\n\n\tconst { collection, collectionItem } = activeCollection\n\n\tconst webPage = scopeStore.getWebPageNodes().find(node => node.dataIdentifier === collection.instanceIdentifier)\n\tif (isUndefined(webPage)) return undefined\n\n\tconst variable = collection.getSlugVariable()\n\tif (!variable) return undefined\n\n\tconst slug = getCollectionItemSlug(collectionItem, variable)\n\tif (isUndefined(slug)) return undefined\n\n\treturn getWebPagePath(treeStore.tree, webPage, pagePathLocaleId, { [variable.id]: slug })\n}\n\n// tries to get active collection and collection item from active overlay stack element or from selection\nfunction getActiveCollection({\n\tchromeStore,\n\ttreeStore,\n\tcontentManagementStore,\n\tscopeStore,\n\tselectionStore,\n}: {\n\tchromeStore: ChromeStore\n\ttreeStore: TreeStore\n\tcontentManagementStore: ContentManagementStore\n\tscopeStore: ScopeStore\n\tselectionStore: SelectionStore\n}): { collection: CollectionNode; collectionItem: CollectionItemNode } | undefined {\n\tconst activeOverlayStackElement = chromeStore.contentManagementOverlayStack.at(-1)\n\n\t// an active collection item is in the overlay\n\tif (isDefined(activeOverlayStackElement)) {\n\t\tconst collection = getCollectionNodeFromStackElement({\n\t\t\tstackElement: activeOverlayStackElement,\n\t\t\ttree: treeStore.tree,\n\t\t})\n\t\tif (isNull(collection)) return undefined\n\n\t\tconst collectionItem = getItemNodeFromStackElement({\n\t\t\ttreeStore,\n\t\t\tcontentManagementStore,\n\t\t\tstackElement: activeOverlayStackElement,\n\t\t})\n\t\tif (isNull(collectionItem)) return undefined\n\n\t\treturn { collection, collectionItem }\n\t}\n\n\tconst collection = getActiveCollectionNode({\n\t\tscopeStore,\n\t\tselectionStore,\n\t\ttreeStore,\n\t})\n\tif (isNull(collection)) return undefined\n\n\t// we use the first non-draft collection item if no items are active\n\tconst collectionItem = collection.getUnsortedChildren().find(({ isDraft }) => !isDraft)\n\tif (isUndefined(collectionItem)) return undefined\n\n\treturn { collection, collectionItem }\n}\n\nfunction getWebPagePathVariables(\n\ttree: CanvasTree,\n\tcomponentLoader: ComponentLoader,\n\twebPageNode: WebPageNode,\n\tscopeStore: ScopeStore,\n\tlocaleId?: LocaleId,\n): Record<string, string> | undefined {\n\tconst dataDefinition = componentLoader.dataForIdentifier(webPageNode.dataIdentifier)\n\tconst slugKey = dataDefinition?.annotations?.[AnnotationKey.FramerSlug]\n\tif (!slugKey) return\n\n\tconst selectedItem = getSelectedCollectionItem(\n\t\ttree,\n\t\tcomponentLoader,\n\t\twebPageNode.dataIdentifier,\n\t\tscopeStore.getSelectedCollectionItemForWebPage(webPageNode),\n\t\tlocaleId,\n\t)\n\tif (!selectedItem) return\n\n\treturn { id: selectedItem.id, [slugKey]: selectedItem.slug }\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { convertReadablePathVariablesToIds } from \"document/components/utils/getUniquePagePath.ts\"\nimport type { CanvasTree, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { CanvasNode, MaybeCanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { RouteSegmentNode } from \"document/models/CanvasTree/nodes/RouteSegmentNode.ts\"\nimport { getRouteSegmentRootNode } from \"document/models/CanvasTree/nodes/RouteSegmentRootNode.utils.ts\"\nimport {\n\tisRouteSegmentNode,\n\tisRouteSegmentRootNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { customNotFoundPageSegments } from \"library/router/customNotFoundPagePaths.ts\"\nimport { pathVariablesRegExpGlobal } from \"library/router/pathVariables.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { formatPath, isTrailingSlashSegmentNode, removeEmptySegmentsRecursive } from \"./commons.ts\"\nimport { createRouteSegment } from \"./createRouteSegment.ts\"\nimport { getRawRouteSegmentFullPath } from \"./getRouteSegmentFullPath.ts\"\n\nfunction normalizePathAndVariables(path: string) {\n\treturn formatPath(path.replace(pathVariablesRegExpGlobal, \":variable\"))\n}\n\nexport function doesPathExist(tree: CanvasTree, newPath: string, ignoreWebPageId?: NodeID): boolean {\n\tconst newPathNormalized = normalizePathAndVariables(newPath)\n\tconst routeSegmentRoot = getRouteSegmentRootNode(tree)\n\n\tconst existingPaths = routeSegmentRoot.getAllRawWebPagePaths(tree)\n\tif (ignoreWebPageId) {\n\t\t// Skip checking the current web page path if it is already set to avoid unnecessary warnings to the user while editing the page.\n\t\tconst currentWebPagePath = routeSegmentRoot.getRawWebPagePathByWebPageId(tree, ignoreWebPageId)\n\t\tif (currentWebPagePath) existingPaths.delete(currentWebPagePath)\n\t}\n\n\tfor (const existingPath of existingPaths) {\n\t\tconst existingPathNormalized = normalizePathAndVariables(existingPath)\n\t\tif (existingPathNormalized === newPathNormalized) return true\n\t}\n\n\treturn false\n}\n\nfunction isNodeOriginalAncestor(originalParent: MaybeCanvasNode) {\n\treturn (ancestor: CanvasNode): ancestor is CanvasNode => {\n\t\treturn ancestor.id === originalParent?.id\n\t}\n}\n\nfunction isOriginalParentAncestorOfNewSegment(\n\ttree: CanvasTree,\n\ttip: RouteSegmentNode,\n\toriginalParent: MaybeCanvasNode,\n) {\n\treturn !isNull(tree.getAncestorThatMatches(tip, isNodeOriginalAncestor(originalParent)))\n}\n\nexport function updateRouteSegmentPath(\n\tsegmentId: NodeID,\n\tnewPath: string,\n\ttree: CanvasTree,\n\tcomponentLoader: ComponentLoader,\n\t/**\n\t * When we are displaying `/{folder}/`, when editing, we want to rename the\n\t * parent too.\n\t */\n\trenameParent?: boolean,\n\tnextDataIdentifier?: ModuleExportIdentifierString,\n) {\n\tconst routeSegmentNode = tree.get(segmentId)\n\tif (!isRouteSegmentNode(routeSegmentNode)) return\n\n\tconst originalIndex = tree.getIndex(routeSegmentNode)\n\tconst originalParent = tree.getNodeParent(routeSegmentNode)\n\n\t// Translate the path variables to ids if the segment has a dataIdentifier.\n\tconst routeSegmentRoot = getRouteSegmentRootNode(tree)\n\tconst dataIdentifier = nextDataIdentifier ?? routeSegmentRoot.getDataIdentifierByRouteSegmentId(tree, segmentId)\n\n\tif (dataIdentifier) {\n\t\tnewPath = convertReadablePathVariablesToIds(dataIdentifier, newPath, tree, componentLoader)\n\t}\n\n\t// 1. Remove the web page from the existing segment. This will allow us to\n\t// optionally remove this segment later if it's no longer required (for\n\t// instance if renamed).\n\tconst webPage = tree.get(routeSegmentNode.webPageId)\n\n\tif (routeSegmentNode.webPageId) {\n\t\trouteSegmentNode.set({ webPageId: undefined })\n\t\t// Always update the pagePath of the webPage underneath. When copy pasting a web page node, this is the only\n\t\t// information we have to determine the path of the paste page.\n\t\tif (isWebPageNode(webPage)) webPage.set({ pagePath: newPath })\n\t}\n\n\t// 2. Create RouteSegmentNodes for the new path, reusing any existing segments that match the new path.\n\t// tip will be the leaf node of the new path\n\tconst tip: MaybeCanvasNode = createRouteSegment(\n\t\ttree,\n\t\tcomponentLoader,\n\t\tisWebPageNode(webPage) ? webPage : undefined,\n\t\tdataIdentifier,\n\t\tnewPath,\n\t)\n\tif (!isRouteSegmentNode(tip)) return\n\n\tconst tipParent = tree.get(tip.parentid) ?? getRouteSegmentRootNode(tree)\n\tif (!isRouteSegmentNode(tipParent) && !isRouteSegmentRootNode(tipParent)) return\n\n\t// 3. If we \"just\" renamed a segment in it's parent, move it back to it's\n\t// original position (instead of moving it to the end).\n\tif (tip.parentid === routeSegmentNode?.parentid) {\n\t\ttree.moveNodeIndex(tip, originalIndex)\n\t} else if (renameParent && originalParent && tipParent.parentid === originalParent?.parentid) {\n\t\ttree.moveNodeIndex(tipParent, tree.getIndex(originalParent))\n\t}\n\n\t// 4. Move children of the original segment into the new segment if the base path\n\t// changed. This will be a noop if it is a trailing slash segment.\n\tconst newParent = isTrailingSlashSegmentNode(tip) ? tipParent : tip\n\trouteSegmentNode.children.forEach(child => {\n\t\tif (child.id === segmentId) return\n\n\t\tconst childFullPath = getRawRouteSegmentFullPath(tree, componentLoader, child.id)\n\t\tif (!newPath.startsWith(childFullPath)) {\n\t\t\ttree.moveNode(child, newParent.id)\n\t\t}\n\t})\n\n\t// 5. And if we are renaming the parent, move the siblings of the original\n\t// segment too, but only if the original parent has been renamed. For\n\t// example, when renaming /a/ to /a/b/c, we don't want to move any\n\t// siblings of \"/\", they should stay in the /a folder.\n\tif (originalParent?.children && renameParent && !isOriginalParentAncestorOfNewSegment(tree, tip, originalParent)) {\n\t\toriginalParent.children.forEach(child => {\n\t\t\tif (child.id === segmentId) return\n\t\t\ttree.moveNode(child, newParent.id)\n\t\t})\n\t}\n\n\t// 6. Preserve localization on the renamed segment. If the segment has been renamed to a\n\t// trailing slash or to a 404 page then don't persist as we don't allow those to be translated.\n\tconst originalSegmentLocalized = routeSegmentNode.segmentLocalized\n\tif (originalSegmentLocalized && !isTrailingSlashSegmentNode(tip) && !customNotFoundPageSegments.has(tip.segment)) {\n\t\ttip.set({ segmentLocalized: originalSegmentLocalized })\n\t}\n\n\t// 7. Remove all empty segments left over from the original segment except if whole segment reused.\n\tif (segmentId !== tip.id) {\n\t\tremoveEmptySegmentsRecursive(segmentId, tree)\n\t}\n\n\t// 8. TODO: Update any web page paths that are descendants of renamed folders...\n\n\treturn tip\n}\n", "import { triggerCanvasPageDeleteEvent } from \"@framerjs/framer-events\"\nimport { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { LoadedWebPageNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { RouteSegmentNode } from \"document/models/CanvasTree/nodes/RouteSegmentNode.ts\"\nimport { getRouteSegmentRootNode } from \"document/models/CanvasTree/nodes/RouteSegmentRootNode.utils.ts\"\nimport { isRouteSegmentNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport type React from \"react\"\nimport { isNull, isUndefined } from \"utils/typeChecks.ts\"\nimport { isEmptyCanvasPage, isEmptyWebPage, isTrailingSlashSegmentNode } from \"./commons.ts\"\n\nfunction getModalDescription(hasChildren: boolean) {\n\tconst instance = hasChildren ? \"folder\" : \"page\"\n\treturn `Deleting this ${instance} will remove all of its content for all project collaborators.`\n}\n\n/** Deletes a route segment and all of its children, collects and returns orphaned web page IDs. */\nfunction deleteRouteSegment(engine: VekterEngine, segmentId: NodeID, orphanedWebPageIds: Set<NodeID>) {\n\tconst routeSegmentNode = engine.tree.getNode<RouteSegmentNode>(segmentId)\n\tif (!routeSegmentNode) return\n\n\tconst webPageId = routeSegmentNode.webPageId\n\n\tif (webPageId) {\n\t\torphanedWebPageIds.add(webPageId)\n\t}\n\n\tfor (const child of routeSegmentNode.children) {\n\t\tdeleteRouteSegment(engine, child.id, orphanedWebPageIds)\n\t}\n\n\tengine.deleteNode(segmentId)\n}\n\n/**\n * Deletes the route segment and all of its children, then deletes orphaned\n * web pages that are not referenced by any route segment.\n *\n * It may happen that the same page is referenced from multiple route segments,\n * so we need to handle that.\n *\n * If the delete route segment was a trailing slash segment node, then it must also\n * delete its parent segment node. Otherwise, it will turn into a folder.\n */\nexport function deleteRouteSegmentAndOrphanedWebPages(engine: VekterEngine, segmentId: NodeID) {\n\tconst node = engine.tree.getNodeWithTrait(segmentId, isRouteSegmentNode)\n\tif (!node) return\n\n\tconst trailingSlashParentId = isTrailingSlashSegmentNode(node) ? node?.parentid : null\n\n\tconst orphanedWebPageIds = new Set<NodeID>()\n\tdeleteRouteSegment(engine, segmentId, orphanedWebPageIds)\n\n\tconst routeSegmentRootNode = getRouteSegmentRootNode(engine.tree)\n\tfor (const segment of routeSegmentRootNode.walk()) {\n\t\tif (!isRouteSegmentNode(segment)) continue\n\t\tif (segment.webPageId) orphanedWebPageIds.delete(segment.webPageId)\n\t}\n\n\t// Delete orphaned A/B testing variant pages\n\tfor (const node of engine.tree.root.children) {\n\t\tif (isWebPageNode(node) && node.abTestingParentId && orphanedWebPageIds.has(node.abTestingParentId)) {\n\t\t\tengine.deleteNode(node.id)\n\t\t\ttriggerCanvasPageDeleteEvent({ pageId: node.id })\n\t\t}\n\t}\n\n\tfor (const webPageId of orphanedWebPageIds) {\n\t\tengine.deleteNode(webPageId)\n\t\ttriggerCanvasPageDeleteEvent({ pageId: webPageId })\n\t}\n\n\t// If this page had a trailing slash segment, the parent segment node must also\n\t// be deleted. Otherwise, an empty folder will show up in its place after deletion.\n\tif (trailingSlashParentId) {\n\t\tconst trailingSlashParent = engine.tree.getNodeWithTrait(trailingSlashParentId, isRouteSegmentNode)\n\t\tif (trailingSlashParent && isUndefined(trailingSlashParent.webPageId)) {\n\t\t\tengine.deleteNode(trailingSlashParent.id)\n\t\t}\n\t}\n}\n\ninterface PromptAndDeleteOptions {\n\tdescription: React.ReactNode | string\n\thasLinks?: boolean\n}\n\nexport function promptAndDeleteSegment(engine: VekterEngine, segmentId: NodeID, options?: PromptAndDeleteOptions) {\n\tconst routeSegmentNode = engine.tree.getNode(segmentId)\n\tif (!isRouteSegmentNode(routeSegmentNode)) return\n\n\tconst webPageId = routeSegmentNode.webPageId\n\tconst maybeWebPageNode = engine.tree.getNode(webPageId)\n\n\tassert(isWebPageNode(maybeWebPageNode) || maybeWebPageNode === null, \"If node exists, it should be a web page node\")\n\n\treturn engine.loadScopesThenProcess([maybeWebPageNode], ([webPageNode]) => {\n\t\tif (canSafelyDeleteRouteSegmentNode(webPageNode, routeSegmentNode, options?.hasLinks)) {\n\t\t\tdeleteRouteSegmentAndOrphanedWebPages(engine, segmentId)\n\t\t\treturn\n\t\t}\n\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.Confirmation,\n\t\t\tvariant: \"destructive\",\n\t\t\ttitle: \"Delete Page\",\n\t\t\tdescription: options?.description ?? getModalDescription(routeSegmentNode.children.length > 0),\n\t\t\tonConfirm: () => deleteRouteSegmentAndOrphanedWebPages(engine, segmentId),\n\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\tsource: \"delete_page\",\n\t\t\tkeyboardConfirmMode: \"Enter\",\n\t\t})\n\t})\n}\n\nexport function canSafelyDeleteRouteSegmentNode(\n\twebPageNode: LoadedWebPageNode | null | undefined,\n\trouteSegmentNode: RouteSegmentNode,\n\thasLinks?: boolean,\n): boolean {\n\tif (isNull(webPageNode) || isUndefined(webPageNode)) return false\n\tif (routeSegmentNode.children.length > 0) return false\n\n\tconst doesRouteSegmentHaveWebPage = Boolean(routeSegmentNode.webPageId)\n\tconst isWebPageEmpty = isEmptyCanvasPage(webPageNode) || isEmptyWebPage(webPageNode)\n\treturn !doesRouteSegmentHaveWebPage || (isWebPageEmpty && !hasLinks)\n}\n", "import { AnnotationKey } from \"@framerjs/framer-runtime/crossorigin\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { ModuleType } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type {\n\tAnyScopeNode,\n\tCanvasNode,\n\tCanvasTree,\n\tFrameNode,\n\tLoadedScopeNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { isLayoutTemplateNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport {\n\ttype WithBreakpointVariants,\n\tisBreakpoints,\n\twithBreakpointVariants,\n} from \"document/models/CanvasTree/traits/WithBreakpointVariants.ts\"\nimport { hasLayoutTemplate } from \"document/models/CanvasTree/traits/WithLayoutTemplate.ts\"\nimport type { IsBreakpoint, IsVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { DimensionType } from \"library/render/types/Constraints.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { breakpointVariantDefaults, desktopBreakpointVariantDefault } from \"./breakpointVariantDefaults.ts\"\n\nexport interface BreakpointSuggestion {\n\tname: string\n\twidth: number\n\tviewportHeight?: number\n}\n\nfunction scopesForBreakpointSuggestions(\n\ttree: CanvasTree,\n\tscope: LoadedScopeNode & WithBreakpointVariants,\n): AnyScopeNode[] {\n\tif (isWebPageNode(scope) && hasLayoutTemplate(scope)) {\n\t\tconst templateNode = scope.getLayoutTemplateNode(tree)\n\t\tif (!templateNode) return []\n\t\treturn [templateNode]\n\t}\n\n\treturn tree.root.children.filter(node => isWebPageNode(node))\n}\n\nfunction getBreakpointSuggestion(\n\tcurrentBreakpoints: (FrameNode & IsBreakpoint)[],\n\tsuggestions: BreakpointSuggestion[],\n\twidth: number | undefined,\n\tname: string | undefined = Dictionary.Breakpoint,\n\tviewportHeight: number | undefined = desktopBreakpointVariantDefault.viewportHeight,\n) {\n\tif (!width) return\n\n\tconst existsInCurrentPage = currentBreakpoints.some(\n\t\tbreakpoint => breakpoint.name === name && breakpoint.width === width,\n\t)\n\tif (existsInCurrentPage) return\n\n\tconst existsInSuggestions = suggestions.some(v => v.name === name && v.width === width)\n\tif (existsInSuggestions) return\n\treturn {\n\t\tname,\n\t\twidth,\n\t\tviewportHeight,\n\t}\n}\n/**\n * Collect existing breakpoints in other web pages, merge with our preset,\n * and order them by width\n * */\nexport function suggestBreakpoints(\n\tengine: VekterEngine,\n\tscope: LoadedScopeNode & WithBreakpointVariants,\n): BreakpointSuggestion[] {\n\tengine.tree.beginAllowPartialScopeAccess()\n\tconst currentBreakpoints = scope.getTopLevelVariants()\n\n\tconst suggestions: BreakpointSuggestion[] = []\n\tscopesForBreakpointSuggestions(engine.tree, scope).forEach(suggestedScope => {\n\t\tif (suggestedScope.id === scope.id) return\n\n\t\t// If it is a layout template, we could try to read the breakpoints from the local module annotations.\n\t\tif (isLayoutTemplateNode(suggestedScope)) {\n\t\t\tconst breakpoints = engine.stores.modulesStore\n\t\t\t\t.forType(ModuleType.LayoutTemplate)\n\t\t\t\t.getByStableName(suggestedScope.id)\n\t\t\t\t.annotations(null, \"default\")?.[AnnotationKey.FramerBreakpoints]\n\n\t\t\tif (!isBreakpoints(breakpoints)) return\n\n\t\t\tfor (const breakpointId in breakpoints) {\n\t\t\t\tconst layoutBreakpoint = breakpoints[breakpointId]\n\t\t\t\tif (!layoutBreakpoint) continue\n\t\t\t\tconst suggestion = getBreakpointSuggestion(\n\t\t\t\t\tcurrentBreakpoints,\n\t\t\t\t\tsuggestions,\n\t\t\t\t\tlayoutBreakpoint.width ?? layoutBreakpoint.min,\n\t\t\t\t\tlayoutBreakpoint.name,\n\t\t\t\t\tlayoutBreakpoint.viewportHeight,\n\t\t\t\t)\n\t\t\t\tif (suggestion) suggestions.push(suggestion)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// TODO Check and handle shallow/fully loaded scope state\n\t\tif (!suggestedScope.isLoaded() || !withBreakpointVariants(suggestedScope)) return\n\t\tconst variants = suggestedScope.getTopLevelVariants()\n\t\tvariants.forEach(variant => {\n\t\t\tconst name = variant.resolveValue(\"name\")\n\t\t\tif (!name) return\n\t\t\tif (variant.widthType !== DimensionType.FixedNumber) return\n\t\t\tconst suggestion = getBreakpointSuggestion(\n\t\t\t\tcurrentBreakpoints,\n\t\t\t\tsuggestions,\n\t\t\t\tvariant.width,\n\t\t\t\tname,\n\t\t\t\tvariant.viewportHeight,\n\t\t\t)\n\t\t\tif (suggestion) suggestions.push(suggestion)\n\t\t})\n\t})\n\n\t// Presets\n\tbreakpointVariantDefaults.forEach(preset => {\n\t\t// If there's already a custom one with the same name, we don't show\n\t\t// the preset at all\n\t\tif (suggestions.find(suggestion => suggestion.name === preset.name)) return\n\t\tif (currentBreakpoints.find(breakpoint => breakpoint.name === preset.name)) return\n\t\tsuggestions.push({ name: preset.name, width: preset.width, viewportHeight: preset.viewportHeight })\n\t})\n\n\t// Sort in a descending order\n\tsuggestions.sort((a, b) => b.width - a.width)\n\n\tengine.tree.endAllowPartialScopeAccess()\n\treturn suggestions\n}\n\nexport const getBreakpointMenu = (\n\tengine: VekterEngine,\n\tnode: CanvasNode & FrameNode & IsVariant & IsBreakpoint,\n\tonSelectBreakpoint: (breakpoint: BreakpointSuggestion) => void,\n\tonSelectCustom: () => void,\n\tonMakeResponsive?: (suggestedBreakpoints: readonly BreakpointSuggestion[]) => void,\n): MenuItemOptions[] | null => {\n\tconst scope = engine.tree.getScopeNodeFor(node)\n\tif (!withBreakpointVariants(scope) || scope.id !== engine.stores.scopeStore.active.id) {\n\t\treturn null\n\t}\n\n\tconst menuTemplate: MenuItemOptions[] = []\n\n\tconst breakpointSuggestions = suggestBreakpoints(engine, scope)\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tbreakpointSuggestions.forEach(suggestion => {\n\t\tmenuTemplate.push({\n\t\t\tlabel: suggestion.name,\n\t\t\tenabled: !isViewOnly,\n\t\t\tacceleratorLabel: suggestion.width.toString(),\n\t\t\tclick: () => onSelectBreakpoint(suggestion),\n\t\t})\n\t})\n\n\tif (breakpointSuggestions.length > 0) {\n\t\tmenuTemplate.push({ type: \"separator\" })\n\t}\n\n\t// Custom Breakpoint\n\tmenuTemplate.push({\n\t\tlabel: Dictionary.Custom,\n\t\tellipsis: true,\n\t\tenabled: !isViewOnly,\n\t\tclick: () => onSelectCustom(),\n\t})\n\n\tif (onMakeResponsive && breakpointSuggestions.length > 0 && experiments.isOn(\"agent\")) {\n\t\tmenuTemplate.unshift({ type: \"separator\" })\n\t\tmenuTemplate.unshift({\n\t\t\tlabel: \"Generate\",\n\t\t\tellipsis: true,\n\t\t\tenabled: !isViewOnly,\n\t\t\tclick: () => onMakeResponsive(breakpointSuggestions),\n\t\t})\n\t}\n\n\treturn menuTemplate\n}\n\nexport function showBreakpointMenu(\n\tengine: VekterEngine,\n\t{\n\t\tnode,\n\t\tbutton,\n\t\tonSelectBreakpoint,\n\t\tonSelectCustom,\n\t\tonMakeResponsive,\n\t}: {\n\t\tnode: CanvasNode & FrameNode & IsVariant & IsBreakpoint\n\t\tbutton: HTMLDivElement\n\t\tonSelectBreakpoint: (breakpoint: BreakpointSuggestion) => void\n\t\tonSelectCustom: () => void\n\t\tonMakeResponsive?: (suggestedBreakpoints: readonly BreakpointSuggestion[]) => void\n\t},\n) {\n\tconst menuTemplate = getBreakpointMenu(engine, node, onSelectBreakpoint, onSelectCustom, onMakeResponsive)\n\tif (!menuTemplate) return\n\n\tconst rect = button.getBoundingClientRect()\n\n\tengine.stores.contextMenuStore.show(menuTemplate, {\n\t\tlocation: {\n\t\t\tx: rect.right - rect.height + dimensions.values.contextMenuOffsetX,\n\t\t\ty: rect.bottom + 10,\n\t\t},\n\t\tplacement: \"bottom-start\",\n\t})\n}\n", "import { isNull, isString, isUndefined } from \"utils/typeChecks.ts\"\n\n/**\n * A PluginLoadError is used for surfacing specific error messages when a plugin fails to load.\n */\nexport class PluginConfigurationError extends Error {}\n\n/**\n * A manifest configuration error represents an error where the manifest is found but some of its\n * configuration is incorrect.\n */\nexport class ManifestConfigurationError extends Error {}\n\n/**\n * Errors are caught and re-thrown by the `ActivePlugin`. This way the plugin will receive the error\n * message, while Vekter will do its regular error handling. Throw a `PluginOnlyError` to prevent\n * the error from being re-thrown. So the plugin will receive the error message but the red error bar\n * won't appear unnecessarily.\n *\n * When an error can be fixed by the plugin creator, it's best to throw a `PluginOnlyError`. But if\n * it's something we caused in Vekter or if the tree is in an invalid state, throw a regular error.\n */\nexport class PluginOnlyError extends Error {}\n\n// Copied from `@framerjs/shared` assert\nexport function verifyForPlugin(condition: unknown, ...msg: unknown[]): asserts condition {\n\tif (condition) return\n\n\tconst e = new PluginOnlyError(msg.length > 0 ? msg.join(\" \") : \"Plugin Error\")\n\t// Hack the stack so the assert call itself disappears. Works in jest and in chrome.\n\tif (e.stack) {\n\t\ttry {\n\t\t\tconst lines = e.stack.split(\"\\n\")\n\t\t\tif (lines[1]?.includes(\"assert\")) {\n\t\t\t\tlines.splice(1, 1)\n\t\t\t\te.stack = lines.join(\"\\n\")\n\t\t\t} else if (lines[0]?.includes(\"assert\")) {\n\t\t\t\tlines.splice(0, 1)\n\t\t\t\te.stack = lines.join(\"\\n\")\n\t\t\t}\n\t\t} catch {\n\t\t\t// nothing\n\t\t}\n\t}\n\tthrow e\n}\n\n/**\n * For `data` like this:\n *\n * ```\n * { str: \"foo\", udf: undefined, num: 42, nll: null }\n * ```\n *\n * Returns this:\n *\n * ```plain\n * \"{ str: \"foo\", num: 42 }\"\n * ```\n */\nexport function serializeForError(data: Record<string, unknown>): string {\n\tconst entries: string[] = []\n\tfor (const key of Object.keys(data)) {\n\t\tconst value = data[key]\n\t\tif (isUndefined(value) || isNull(value)) continue\n\t\tentries.push(`${key}: ${isString(value) ? `\"${value}\"` : value}`)\n\t}\n\n\treturn `{ ${entries.join(\", \")} }`\n}\n", "export function isDefined<T>(value: T | undefined): value is T {\n\treturn value !== undefined\n}\n\nexport function isUndefined(value: unknown): value is undefined {\n\treturn value === undefined\n}\n\nexport function isNull(value: unknown): value is null {\n\treturn value === null\n}\n\nexport function isNotNull<T>(value: T | null): value is T {\n\treturn value !== null\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n\treturn value === true || value === false\n}\n\nexport function isString(value: unknown): value is string {\n\treturn typeof value === \"string\"\n}\n\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value)\n}\n\nexport function isFunction(value: unknown): value is (...parameters: unknown[]) => unknown {\n\treturn typeof value === \"function\"\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false\n\tconst prototype = Object.getPrototypeOf(value)\n\treturn prototype === null || prototype === Object.prototype\n}\n\nexport function isArray(value: unknown): value is unknown[] {\n\treturn Array.isArray(value)\n}\n\nexport function shouldBeNever(_: never) {}\n\nexport function assertNever(x: never, error?: unknown): never {\n\tif (error instanceof Error) {\n\t\tthrow error\n\t}\n\tif (error !== undefined) {\n\t\tthrow new Error(String(error))\n\t}\n\tthrow new Error((x as unknown) ? `Unexpected value: ${x}` : \"Application entered invalid state\")\n}\n\nexport function assert(condition: unknown, ...msg: unknown[]): asserts condition {\n\tif (condition) return\n\n\tconst e = Error(\"Assertion Error\" + (msg.length > 0 ? \": \" + msg.join(\" \") : \"\"))\n\t// Hack the stack so the assert call itself disappears. Works in jest and in chrome.\n\tif (e.stack) {\n\t\ttry {\n\t\t\tconst lines = e.stack.split(\"\\n\")\n\t\t\tif (lines[1]?.includes(\"assert\")) {\n\t\t\t\tlines.splice(1, 1)\n\t\t\t\te.stack = lines.join(\"\\n\")\n\t\t\t} else if (lines[0]?.includes(\"assert\")) {\n\t\t\t\tlines.splice(0, 1)\n\t\t\t\te.stack = lines.join(\"\\n\")\n\t\t\t}\n\t\t} catch {\n\t\t\t// nothing\n\t\t}\n\t}\n\tthrow e\n}\n\n/** Recursively freeze objects, arrays and functions. */\nexport function deepFreeze<T extends object>(object: T): T {\n\tfor (const key of Reflect.ownKeys(object)) {\n\t\tconst value = object[key as keyof typeof object]\n\t\tif (!value || (typeof value !== \"object\" && !isFunction(value))) continue\n\t\tdeepFreeze(value)\n\t}\n\n\treturn Object.freeze(object)\n}\n\nexport function isShallowArrayEqual(a: readonly unknown[], b: readonly unknown[]): boolean {\n\tif (a === b) return true\n\tif (a.length !== b.length) return false\n\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) return false\n\t}\n\n\treturn true\n}\n\nexport function splitRestAndLast<\n\tArray extends unknown[],\n\tResult extends Array extends [...infer Rest, infer Last] ? [Rest, Last] : never,\n>(array: Array): Result {\n\treturn [array.slice(0, -1), array.at(-1)] as Result\n}\n\n/**\n * The opposite of Partial, can't omit it. Useful for making sure that you don't forget to handle a\n * new property in all cases where objects are built.\n */\nexport type ExplicitPartial<T> = {\n\t[P in keyof T]: T[P] | undefined\n}\n\n/** Type helper to transform a interface so that each value can be null. */\ntype NullableRecord<T> = { [P in keyof T]-?: T[P] | null }\n\n/** Type helper to transform a interface so that each value can be null or undefined. */\nexport type NullablePartialRecord<T> = Partial<NullableRecord<T>>\n\nexport const classKey = \"__class\" as const\nexport type ClassKey = typeof classKey\n", "import type { ImageAssetData } from \"./assets.ts\"\nimport type { CodeFileData } from \"./codeFile.ts\"\nimport type { CustomCode } from \"./customCode.ts\"\nimport type { PluginMessageAPI } from \"./framerAPI.ts\"\nimport type { InitialState } from \"./initialState.ts\"\nimport type { SomeNodeData } from \"./nodes.ts\"\nimport type { PermissionMap } from \"./permissions.ts\"\nimport type { PublishInfo } from \"./publishInfo.ts\"\nimport type { RedirectData } from \"./redirects.ts\"\nimport type { ColorStyleData, TextStyleData } from \"./styles.ts\"\nimport type { Theme } from \"./theme.ts\"\nimport { isObject, isString } from \"./utils.ts\"\n\nexport type PluginMessageId = number\n\nconst allModesRecord = {\n\tcanvas: true,\n\timage: true,\n\teditImage: true,\n\tconfigureManagedCollection: true,\n\tsyncManagedCollection: true,\n\tcollection: true,\n\tlocalization: true,\n\tcode: true,\n\tapi: true,\n} as const\n\nexport type Mode = keyof typeof allModesRecord\n\nexport const allModes: readonly Mode[] = Object.keys(allModesRecord) as Mode[]\n\nexport function isMode(value: unknown): value is Mode {\n\treturn isString(value) && Object.hasOwn(allModesRecord, value)\n}\n\nconst typeKey = \"type\"\ntype TypeKey = typeof typeKey\n\nexport interface PluginMethodResponse {\n\t[typeKey]: \"methodResponse\"\n\tid: PluginMessageId\n\tresult: unknown\n\terror: string | null\n}\n\nexport interface PluginMethodInvocation {\n\t[typeKey]: \"methodInvocation\"\n\tmethodName: keyof PluginMessageAPI\n\tid: PluginMessageId\n\targs: unknown[]\n}\n\nexport interface PluginSubscribe {\n\t[typeKey]: \"subscribe\"\n\ttopic: PluginSubscriptionTopic\n}\n\nexport interface PluginUnsubscribe {\n\t[typeKey]: \"unsubscribe\"\n\ttopic: PluginSubscriptionTopic\n}\n\nexport interface PluginSubscription {\n\t[typeKey]: PluginSubscribe[TypeKey] | PluginUnsubscribe[TypeKey]\n\ttopic: PluginSubscriptionTopic\n}\n\nexport const readySignal = { [typeKey]: \"pluginReadySignal\" } as const\n\ntype PluginReadySignal = typeof readySignal\n\nconst pluginReadyResponseType = \"pluginReadyResponse\"\n\nexport type ReleaseChannel = \"alpha\" | \"beta\" | \"stable\"\n\nexport interface EnvironmentInfo {\n\treleaseChannel: ReleaseChannel | null\n\tisEmployee: boolean\n}\n\nexport interface PluginReadyResponse {\n\t[typeKey]: typeof pluginReadyResponseType\n\tmode: Mode\n\ttheme?: Theme\n\tpermissionMap: PermissionMap\n\t// Environment info is only available in allowlisted first party plugin at the moment.\n\tenvironmentInfo: EnvironmentInfo | null\n\t/** @internal - Initial state data for first-party plugins. */\n\tinitialState: InitialState | null\n}\n\nexport interface PluginMenuAction {\n\t[typeKey]: \"menuAction\"\n\tactionId: number\n\tactionType: \"pluginMenu\" | \"contextMenu\"\n}\n\nexport interface PluginPermissionUpdate {\n\t[typeKey]: \"permissionUpdate\"\n\tpermissionMap: PermissionMap\n}\n\ninterface PluginSubscriptionBase {\n\t[typeKey]: \"subscriptionMessage\"\n\tpayload: unknown\n}\n\ninterface PluginSubscriptionPublishInfo extends PluginSubscriptionBase {\n\ttopic: \"publishInfo\"\n\tpayload: PublishInfo\n}\n\ninterface PluginSubscriptionSelection extends PluginSubscriptionBase {\n\ttopic: \"selection\"\n\tpayload: SomeNodeData[]\n}\n\ninterface PluginSubscriptionCanvasRoot extends PluginSubscriptionBase {\n\ttopic: \"canvasRoot\"\n\tpayload: SomeNodeData\n}\n\ninterface PluginSubscriptionImage extends PluginSubscriptionBase {\n\ttopic: \"image\"\n\tpayload: ImageAssetData | null\n}\n\ninterface PluginSubscriptionText extends PluginSubscriptionBase {\n\ttopic: \"text\"\n\tpayload: string | null\n}\n\ninterface PluginSubscriptionCustomHTML extends PluginSubscriptionBase {\n\ttopic: \"customCode\"\n\tpayload: CustomCode\n}\n\ninterface PluginSubscriptionTheme extends PluginSubscriptionBase {\n\ttopic: \"theme\"\n\tpayload: Theme\n}\n\ninterface PluginSubscriptionColorStyle extends PluginSubscriptionBase {\n\ttopic: \"colorStyles\"\n\tpayload: ColorStyleData[]\n}\n\ninterface PluginSubscriptionTextStyle extends PluginSubscriptionBase {\n\ttopic: \"textStyles\"\n\tpayload: TextStyleData[]\n}\n\n/** @alpha */\ninterface PluginSubscriptionRedirects extends PluginSubscriptionBase {\n\ttopic: \"redirects\"\n\tpayload: RedirectData[]\n}\n\ninterface PluginSubscriptionCodeFiles extends PluginSubscriptionBase {\n\ttopic: \"codeFiles\"\n\tpayload: readonly CodeFileData[]\n}\n\n/** @alpha */\ninterface PluginSubscriptionOpenCodeFile extends PluginSubscriptionBase {\n\ttopic: \"openCodeFile\"\n\tpayload: CodeFileData | null\n}\n\n// TODO: Do we need to split PublishInfo into:\n// - data that changes when published (e.g., status, timestamp)\n// - data that changes when updating domains (e.g., url)\n// - data that changes when switching between pages (e.g., currentPageUrl)\n// We probably want separate events for all of these.\n// We might also want an \"optimization finished\" event.\n// https://github.com/framer/company/issues/29312\nexport type PluginSubscriptionEvent =\n\t| PluginSubscriptionPublishInfo\n\t| PluginSubscriptionSelection\n\t| PluginSubscriptionCanvasRoot\n\t| PluginSubscriptionImage\n\t| PluginSubscriptionTheme\n\t| PluginSubscriptionText\n\t| PluginSubscriptionCustomHTML\n\t| PluginSubscriptionColorStyle\n\t| PluginSubscriptionTextStyle\n\t| /** @alpha */ PluginSubscriptionRedirects\n\t| PluginSubscriptionCodeFiles\n\t| /** @alpha */ PluginSubscriptionOpenCodeFile\nexport type PluginSubscriptionTopic = PluginSubscriptionEvent[\"topic\"]\n\nexport const allSubscriptionTopics: Readonly<Record<PluginSubscriptionTopic, true>> = {\n\tcanvasRoot: true,\n\tpublishInfo: true,\n\tselection: true,\n\timage: true,\n\ttheme: true,\n\ttext: true,\n\tcustomCode: true,\n\tcolorStyles: true,\n\ttextStyles: true,\n\tredirects: true,\n\tcodeFiles: true,\n\topenCodeFile: true,\n}\n\nexport function isSubscriptionTopic(value: unknown): value is PluginSubscriptionTopic {\n\treturn isString(value) && value in allSubscriptionTopics\n}\n\nexport type PluginToVekterMessage = PluginMethodInvocation | PluginSubscription | PluginReadySignal\n\ntype VekterToPluginNonHandshakeMessage =\n\t| PluginMethodResponse\n\t| PluginSubscriptionEvent\n\t| PluginPermissionUpdate\n\t| PluginMenuAction\n\nexport type VekterToPluginMessage = VekterToPluginNonHandshakeMessage | PluginReadyResponse\n\nconst pluginToVekterTypes: Record<PluginToVekterMessage[TypeKey], true> = {\n\tmethodInvocation: true,\n\tsubscribe: true,\n\tunsubscribe: true,\n\tpluginReadySignal: true,\n}\n\nexport function isPluginToVekterMessage(data: unknown): data is PluginToVekterMessage {\n\treturn isObject(data) && isString(data[typeKey]) && data[typeKey] in pluginToVekterTypes\n}\n\nconst vekterToPluginMessageTypes: Record<VekterToPluginNonHandshakeMessage[TypeKey], true> = {\n\tmethodResponse: true,\n\tsubscriptionMessage: true,\n\tpermissionUpdate: true,\n\tmenuAction: true,\n}\n\nexport function isVekterToPluginNonHandshakeMessage(data: unknown): data is VekterToPluginNonHandshakeMessage {\n\treturn isObject(data) && isString(data[typeKey]) && data[typeKey] in vekterToPluginMessageTypes\n}\n\nexport function isPluginReadyResponse(data: unknown): data is PluginReadyResponse {\n\treturn isObject(data) && data[typeKey] === pluginReadyResponseType\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { countAndNoun } from \"utils/countAndNoun.ts\"\nimport { isObject, isString } from \"utils/typeChecks.ts\"\nimport type { Mode } from \"#framer-plugin/framerAPI.ts\"\nimport { allModes, isMode } from \"#framer-plugin/messages.ts\"\nimport { ManifestConfigurationError } from \"./pluginErrors.ts\"\nimport type { PluginManifestId, VekterPluginManifest } from \"./plugins.ts\"\n\nexport const developmentManifestIdPrefix = \"dev_\"\nexport const externalManifestPrefix = \"external_\"\n\nconst pluginManifestIdLength = 6\n\n/**\n * When a Plugin is loaded from localhost we consider it a development Plugin\n * and the Plugin ID will be prefixed with \"dev\" to indicate its a development Plugin.\n */\nexport function isLocalDevelopmentPluginManifestId(id: PluginManifestId): boolean {\n\treturn id.startsWith(developmentManifestIdPrefix)\n}\n\n/**\n * When a Plugin is loaded from a URL we consider it \"external\" and the plugin\n * ID will be prefixed with \"external_\" to detect such an external Plugin.\n */\nexport function isExternalPluginManifestId(id: PluginManifestId): boolean {\n\treturn id.startsWith(externalManifestPrefix)\n}\n\n// The PluginManifest describes the manifest as described in framer.json\nexport interface PluginManifest {\n\tname: string\n\tid: PluginManifestId\n\tmodes: readonly Mode[]\n\ticon?: string\n\t// Opt-in to Agents redesign before release\n\tprereleaseStyles?: boolean\n}\n\nexport function isModeSupported(supportedModes: readonly Mode[], mode: Mode) {\n\treturn supportedModes.includes(mode)\n}\n\ntype PluginManifestSource = \"framer.json\" | \"plugin-service\" | \"local-storage\"\n\nfunction assertIsVekterPluginManifest(\n\tvalue: unknown,\n\tsource: PluginManifestSource,\n): asserts value is VekterPluginManifest {\n\tassert(isObject(value))\n\n\tassertIsValidPluginManifest(value, source)\n\n\tconst typeKey: keyof VekterPluginManifest = \"type\"\n\tconst typeValue = value[typeKey]\n\tconst typeCastedManifestType = typeValue as VekterPluginManifest[typeof typeKey]\n\n\tswitch (typeCastedManifestType) {\n\t\tcase \"api\":\n\t\t\treturn\n\t\tcase \"hosted\":\n\t\t\tif (!isString(value[\"entrypointUrl\"])) {\n\t\t\t\tthrowConfigurationError(source, 'is missing an \"entrypointUrl\" property')\n\t\t\t}\n\t\t\treturn\n\t\tdefault:\n\t\t\tif (process.env[\"NODE_ENV\"] === \"development\") {\n\t\t\t\tconst _exhaustiveCheck: never = typeCastedManifestType\n\t\t\t}\n\t\t\tthrowConfigurationError(source, `Unknown manifest type: ${typeValue}`)\n\t}\n}\n\nconst collectionMode: Mode = \"collection\"\nconst configureCollectionMode: Mode = \"configureManagedCollection\"\nconst syncCollectionMode: Mode = \"syncManagedCollection\"\n\nfunction includesCollectionMode(modes: readonly Mode[]): boolean {\n\treturn modes.includes(collectionMode)\n}\n\nfunction includesManagedCollectionMode(modes: readonly Mode[]): boolean {\n\treturn modes.includes(configureCollectionMode) || modes.includes(syncCollectionMode)\n}\n\nconst idKey: keyof PluginManifest = \"id\"\nconst nameKey: keyof PluginManifest = \"name\"\nconst iconKey: keyof PluginManifest = \"icon\"\nconst modesKey: keyof PluginManifest = \"modes\"\n\nfunction throwConfigurationError(source: PluginManifestSource, message: string): never {\n\tthrow new ManifestConfigurationError(`${source} ${message}`)\n}\n\nexport function trimPluginIdPrefix(id: string): string {\n\treturn id.replace(developmentManifestIdPrefix, \"\").replace(externalManifestPrefix, \"\")\n}\n\nexport function assertIsValidPluginManifestId(\n\tid: unknown,\n\tsource: PluginManifestSource,\n): asserts id is PluginManifestId {\n\tif (!isString(id)) {\n\t\tthrowConfigurationError(source, 'is missing an \"id\" property')\n\t}\n\n\tconst idWithoutPrefix = trimPluginIdPrefix(id)\n\tif (idWithoutPrefix.length !== pluginManifestIdLength) {\n\t\tthrowConfigurationError(source, '\"id\" property must be 6 characters long')\n\t}\n}\n\nexport function assertIsValidPluginModes(\n\tmodes: unknown,\n\tsource: PluginManifestSource,\n): asserts modes is readonly Mode[] {\n\tif (!Array.isArray(modes)) {\n\t\tthrowConfigurationError(source, `\"modes\" property must be an array`)\n\t}\n\n\tif (modes.length === 0) {\n\t\tthrowConfigurationError(source, `\"modes\" property must not be empty`)\n\t}\n\n\tconst invalidModes = modes.filter(mode => !isMode(mode))\n\tconst invalidModeLength = invalidModes.length\n\n\tif (invalidModeLength > 0) {\n\t\tconst invalidModesJoined = invalidModes.join(\", \")\n\t\tconst validModesJoined = allModes.join(\", \")\n\t\tconst pluralValue = countAndNoun(invalidModeLength, \"value\", \"values\")\n\n\t\tthrowConfigurationError(\n\t\t\tsource,\n\t\t\t`\"modes\" property contains invalid ${pluralValue}: ${invalidModesJoined}. Should be one of: ${validModesJoined}`,\n\t\t)\n\t}\n\n\tif (includesManagedCollectionMode(modes) && includesCollectionMode(modes)) {\n\t\tthrowConfigurationError(\n\t\t\tsource,\n\t\t\t`\"modes\" property cannot support both \"${collectionMode}\" and \"${configureCollectionMode}\" / \"${syncCollectionMode}\"`,\n\t\t)\n\t}\n}\n\nexport function assertIsValidPluginManifest(\n\tvalue: unknown,\n\tsource: PluginManifestSource,\n): asserts value is PluginManifest {\n\tif (!isObject(value)) {\n\t\tthrowConfigurationError(source, \"is not an object\")\n\t}\n\n\tif (!isString(value[nameKey])) {\n\t\tthrowConfigurationError(source, 'is missing a \"name\" property')\n\t}\n\n\tconst id = value[idKey]\n\tassertIsValidPluginManifestId(id, source)\n\n\tconst modes = value[modesKey]\n\tassertIsValidPluginModes(modes, source)\n\n\tif (!isString(value[iconKey])) {\n\t\tthrowConfigurationError(source, 'is missing an \"icon\" property')\n\t}\n\n\tconst prereleaseStylesKey = \"prereleaseStyles\" as const\n\tif (prereleaseStylesKey in value) {\n\t\tconst prereleaseStyles = value[prereleaseStylesKey]\n\t\tif (prereleaseStyles !== undefined && typeof prereleaseStyles !== \"boolean\") {\n\t\t\tthrowConfigurationError(source, '\"prereleaseStyles\" must be a boolean if present')\n\t\t}\n\t}\n}\n\nexport function assertIsValidPluginManifestList(\n\tvalue: unknown,\n\tsource: PluginManifestSource,\n): asserts value is VekterPluginManifest[] {\n\tassert(Array.isArray(value))\n\n\tfor (const manifest of value) {\n\t\tassertIsVekterPluginManifest(manifest, source)\n\t}\n}\n\n/**\n * Checks if a the given Plugin ID matches is a Plugin that was loaded from an\n * external URL And if the ID of that external Plugin matches one of the\n * published Plugins.\n *\n * This is used for some special casing to avoid showing the same Plugins twice\n * in the Plugins Menu while still supporting displaying external Plugins that\n * are not on the marketplace\n */\nexport function isExternalPluginIdOfPublishedPlugin(\n\tid: PluginManifestId,\n\tpublishedPluginManifests: ReadonlyMap<PluginManifestId, VekterPluginManifest>,\n): boolean {\n\tif (!isExternalPluginManifestId(id)) return false\n\n\tconst idWithoutPrefix = trimPluginIdPrefix(id)\n\tif (publishedPluginManifests.has(idWithoutPrefix)) return true\n\n\treturn false\n}\n", "export function joinPaths(...paths: string[]): string {\n\treturn paths\n\t\t.map((path, index) => {\n\t\t\tif (index > 0 && path.startsWith(\"/\")) {\n\t\t\t\tpath = path.substring(1)\n\t\t\t}\n\n\t\t\tif (index < paths.length - 1 && path.endsWith(\"/\")) {\n\t\t\t\tpath = path.slice(0, -1)\n\t\t\t}\n\n\t\t\treturn path\n\t\t})\n\t\t.join(\"/\")\n}\n", "import { isRelativeUrl } from \"@framerjs/shared\"\nimport { experiments } from \"app/experiments.ts\"\nimport { joinPaths } from \"utils/joinPaths.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { assert } from \"#framer-plugin/utils.ts\"\nimport fallbackIconSrc from \"./icons/FallbackPlugin.png\"\nimport { PluginConfigurationError } from \"./pluginErrors.ts\"\nimport type { PluginManifest } from \"./pluginManifestValidation.ts\"\nimport {\n\tassertIsValidPluginManifest,\n\tassertIsValidPluginManifestList,\n\tdevelopmentManifestIdPrefix,\n\texternalManifestPrefix,\n\tisExternalPluginManifestId,\n\tisLocalDevelopmentPluginManifestId,\n} from \"./pluginManifestValidation.ts\"\n\nexport type PluginManifestId = string\n\nexport interface HostedPluginManifest extends PluginManifest {\n\ttype: \"hosted\"\n\tentrypointUrl: string\n\taliases?: readonly string[]\n\tversionId?: string\n\tpluginId?: string\n\tstatus?: string\n\townerId?: string\n\tversionOverride?: boolean\n\texternal?: boolean\n}\n\nexport interface ApiPluginManifest extends PluginManifest {\n\ttype: \"api\"\n}\n\nexport const apiPluginManifest: ApiPluginManifest = {\n\ttype: \"api\",\n\tid: \"api\",\n\tname: \"API Plugin\",\n\tmodes: [\"api\", \"configureManagedCollection\", \"syncManagedCollection\"],\n}\n\nexport const isHostedPluginManifest = (\n\tmanifest: VekterPluginManifest | undefined,\n): manifest is HostedPluginManifest => {\n\treturn manifest !== undefined && manifest.type === \"hosted\"\n}\n\nexport const isApiPluginManifest = (manifest: VekterPluginManifest | undefined): manifest is ApiPluginManifest => {\n\treturn manifest !== undefined && manifest.type === \"api\"\n}\n\nexport function isApiManagedCollection(\n\tcollectionNode: { managedByPlugin?: string | undefined } | null | undefined,\n): boolean {\n\treturn collectionNode?.managedByPlugin === apiPluginManifest.id\n}\n\nexport type VekterPluginManifest = HostedPluginManifest | ApiPluginManifest\n\nexport const airtableManifestId: PluginManifestId = \"aa78c0\"\nexport const ashbyManifestId: PluginManifestId = \"a3b33y\"\nconst renamerManifestId: PluginManifestId = \"X90AKZ\"\nconst asciiManifestId: PluginManifestId = \"TS2xwk\"\nconst phosphorManifestId: PluginManifestId = \"XJovOL\"\nexport const notionManifestId: PluginManifestId = \"e00c8d\"\nconst googleSearchConsoleManifestId: PluginManifestId = \"53ebdd\"\nexport const googleSheetsManifestId: PluginManifestId = \"fa488a\"\nexport const cmsExportManifestId: PluginManifestId = \"9bbb18\"\nexport const hubspotManifestId: PluginManifestId = \"33d9eb\"\nconst ditherManifestId: PluginManifestId = \"TQeWOY\"\nexport const localeSyncManifestId: PluginManifestId = \"fc872a\"\nexport const csvImportManifestId: PluginManifestId = \"cbaf26\"\nconst redirectSyncManifestId: PluginManifestId = \"oD1a02\"\nexport const workshopManifestId: PluginManifestId = \"84d4c1\"\nconst codeVersionsManifestId: PluginManifestId = \"8f5ec6\"\nexport const codeLinkManifestId: PluginManifestId = \"40c32f\"\nexport const textSearchManifestId: PluginManifestId = \"73ea97\"\nexport const temporaryWorkshopManifestId: PluginManifestId = \"workspace:283cfef3-5a91-4b19-bf7d-8840d3c7bae5/84d4c1\"\n\nexport function isWorkshopPluginManifest(pluginManifest: VekterPluginManifest) {\n\treturn pluginManifest.id === temporaryWorkshopManifestId || pluginManifest.id === workshopManifestId\n}\n\n/**\n * This is the list of plugins that are featured in the quick launch menu.\n * In order to show up in the quick launch menu, the plugin must be in this list.\n * FYI: You might want to verify it with `make dev-on-production` with all the plugins around on production, or\n * with the preview link in shippy's PR comment.\n */\nexport const featuredPluginManifestIds: ReadonlySet<PluginManifestId> = new Set([\n\tworkshopManifestId,\n\ttemporaryWorkshopManifestId,\n\tgoogleSheetsManifestId,\n\tditherManifestId,\n\tcmsExportManifestId,\n\trenamerManifestId,\n\tasciiManifestId,\n\tnotionManifestId,\n\tgoogleSearchConsoleManifestId,\n\tphosphorManifestId,\n\thubspotManifestId,\n\tcsvImportManifestId,\n\tlocaleSyncManifestId,\n\tredirectSyncManifestId,\n\tcodeVersionsManifestId,\n])\n\n/**\n * These plugins will be visible in the quick launch menu, but can't be opened.\n * It will show a \"coming soon\" message next to them.\n *\n * What you need to do:\n * 1) Upload the plugin to https://www.framer.com/dashboard/plugins/, do not approve it in Retool yet.\n * 2) Hide the plugin from the creators listing for what the amazing @triozer prepared there for you:\n *    - Go to https://github.com/framer/creators/blob/main/src/server/utils/coming-soon-plugins.ts\n *    - Adding the plugin to `UNAVAILABLE_PLUGIN_IDS` hides it from the public listings, you need\n * 3) Add the plugin to the `comingSoonPluginIds` set below\n * 4) Once everything is merged and deployed, you can approve the plugin in Retool.\n */\nconst comingSoonPluginIds: ReadonlySet<PluginManifestId> = new Set([redirectSyncManifestId, codeLinkManifestId])\n\n// Without this manifest ID in the allowedToUseInternalMethodsPluginIds set, the Project Andes\n// Plugin won't have access to the internal methods needed.\nconst projectAndesManifestId: PluginManifestId = \"workspace:850d1262-1075-4b41-89f6-b154b0da2ba8/84d4c1\"\nexport const allowedToUseInternalMethodsPluginIds = new Set([\n\tworkshopManifestId,\n\ttemporaryWorkshopManifestId,\n\tprojectAndesManifestId,\n\ttextSearchManifestId,\n])\n\nexport function isComingSoonPlugin(pluginManifest: VekterPluginManifest): boolean {\n\tif (pluginManifest.id === redirectSyncManifestId) {\n\t\treturn false\n\t}\n\tif (pluginManifest.id === codeLinkManifestId && experiments.isOn(\"codeLinkPlugin\")) {\n\t\treturn false\n\t}\n\treturn comingSoonPluginIds.has(pluginManifest.id)\n}\n\nexport function getPluginIcon(manifest: VekterPluginManifest): string {\n\treturn manifest.icon ?? fallbackIconSrc\n}\n\nexport function sortAlphabetically(input: readonly VekterPluginManifest[]) {\n\treturn Array.from(input).sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport function isPluginDevelopmentUrl(url: string): boolean {\n\tconst urlObject = new URL(url)\n\n\treturn urlObject.hostname === \"localhost\" || urlObject.hostname === \"127.0.0.1\"\n}\n\nconst corsProxyBaseURl = \"https://cors.farpace.workers.dev\"\n\nexport async function loadPluginManifestFromUrl(url: string): Promise<VekterPluginManifest> {\n\tconst urlObject = new URL(url)\n\n\tconst pluginBaseUrl = new URL(urlObject.pathname, urlObject.origin).toString()\n\tconst manifestUrl = joinPaths(pluginBaseUrl, \"/framer.json\")\n\n\tconst response = isPluginDevelopmentUrl(url)\n\t\t? await fetch(manifestUrl)\n\t\t: // Plugins hosted externally will have CORS enabled so we cannot read their manifest data\n\t\t\t// As a \"temporary\" measure we use this CORS proxy to load that data.\n\t\t\tawait fetch(joinPaths(corsProxyBaseURl, manifestUrl))\n\n\tconst isDevelopmentUrl = isPluginDevelopmentUrl(url)\n\n\tconst pluginName = isDevelopmentUrl ? \"Development Plugin\" : \"Plugin\"\n\tconst manifestLoadError = new PluginConfigurationError(`${pluginName} framer.json is missing`)\n\tif (!response.ok) {\n\t\tthrow manifestLoadError\n\t}\n\n\tconst configManifest = await response.json().catch(() => {\n\t\tthrow manifestLoadError\n\t})\n\n\t// The CORS proxy endpoint returns a 200 OK with a JSON error object if not found.\n\tif (\"error\" in configManifest) {\n\t\tthrow manifestLoadError\n\t}\n\n\tassertIsValidPluginManifest(configManifest, \"framer.json\")\n\n\tconst fullIconUrl =\n\t\tconfigManifest.icon && isRelativeUrl(configManifest.icon)\n\t\t\t? joinPaths(pluginBaseUrl, configManifest.icon)\n\t\t\t: configManifest.icon\n\n\tconst fullName = isDevelopmentUrl ? `${configManifest.name}${developmentSuffix}` : configManifest.name\n\tconst idPrefix = isDevelopmentUrl ? developmentManifestIdPrefix : externalManifestPrefix\n\tconst id = `${idPrefix}${configManifest.id}`\n\n\treturn {\n\t\ttype: \"hosted\",\n\t\tid,\n\t\tentrypointUrl: url,\n\t\tname: fullName,\n\t\ticon: fullIconUrl,\n\t\tmodes: configManifest.modes,\n\t\tprereleaseStyles: configManifest.prereleaseStyles,\n\t}\n}\n\nconst developmentSuffix = ` (Development)`\nexport function stripDevelopmentSuffix(name: string) {\n\treturn name.replace(developmentSuffix, \"\")\n}\n\nconst externalManifestsLocalStorageKey = \"framerExternalPluginManifests\"\nexport function persistExternalManifests(manifests: ReadonlyMap<PluginManifestId, VekterPluginManifest>) {\n\tconst externalManifests = Array.from(manifests.values())\n\tlocalStorage.setItem(externalManifestsLocalStorageKey, JSON.stringify(externalManifests))\n}\n\nexport function loadPersistedExternalManifests(): VekterPluginManifest[] {\n\tconst value = localStorage.getItem(externalManifestsLocalStorageKey)\n\tif (!value) return []\n\n\ttry {\n\t\tconst parsed = JSON.parse(value)\n\t\tassertIsValidPluginManifestList(parsed, \"local-storage\")\n\n\t\t// We clean up deprecated external manifests saved in localStorage that\n\t\t// were not prefixed with \"external_\". These are old and shouldn't be in\n\t\t// localStorage.\n\t\tconst filtered = parsed.filter(\n\t\t\tmanifest => isExternalPluginManifestId(manifest.id) || isLocalDevelopmentPluginManifestId(manifest.id),\n\t\t)\n\n\t\tif (filtered.length !== parsed.length) {\n\t\t\tlocalStorage.setItem(externalManifestsLocalStorageKey, JSON.stringify(filtered))\n\t\t}\n\n\t\treturn filtered\n\t} catch (error) {\n\t\t// Contains invalid data - clear storage\n\t\tlocalStorage.removeItem(externalManifestsLocalStorageKey)\n\n\t\t// biome-ignore lint/suspicious/noConsole: <explanation>\n\t\tconsole.error(\"Failed to load persisted Plugin Manifests\", error)\n\n\t\treturn []\n\t}\n}\n\nconst recentlyUsedPluginManifestIdsStorageKey = \"framerRecentlyUsedPlugin\"\nexport function persistRecentlyUsedPluginManifestIds(ids: ReadonlySet<PluginManifestId>) {\n\tlocalStorage.setItem(recentlyUsedPluginManifestIdsStorageKey, JSON.stringify(Array.from(ids)))\n}\n\nexport function loadPersistedRecentlyUsedIds(): Set<PluginManifestId> {\n\tconst value = localStorage.getItem(recentlyUsedPluginManifestIdsStorageKey)\n\tconst ids = new Set<PluginManifestId>()\n\n\tif (!value) return ids\n\n\ttry {\n\t\tconst parsed = JSON.parse(value)\n\t\tassert(Array.isArray(parsed))\n\n\t\tfor (const id of parsed) {\n\t\t\tassert(isString(id))\n\n\t\t\tids.add(id)\n\t\t}\n\n\t\treturn ids\n\t} catch {\n\t\t// Contains invalid data - clear storage\n\t\tlocalStorage.removeItem(recentlyUsedPluginManifestIdsStorageKey)\n\t\treturn ids\n\t}\n}\n", "export function truncateString(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) {\n\t\treturn value\n\t}\n\treturn value.slice(0, maxLength)\n}\n\nexport function truncateStringWithEllipsis(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) {\n\t\treturn value\n\t}\n\n\treturn value.slice(0, maxLength - 1) + \"\u2026\"\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport type { ToastAction, ToastVariant } from \"@framerjs/fresco/src/components/Toaster\"\nimport { unhandledError } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { SiteSettingsTabNames } from \"document/stores/SiteSettingsStore.ts\"\nimport { truncateStringWithEllipsis } from \"utils/truncateString.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport type { Mode } from \"#framer-plugin/messages.ts\"\nimport type { ActivePlugin } from \"./ActivePlugin.ts\"\nimport { ManifestConfigurationError, PluginConfigurationError } from \"./pluginErrors.ts\"\nimport { isExternalPluginManifestId } from \"./pluginManifestValidation.ts\"\nimport type { VekterPluginManifest } from \"./plugins.ts\"\nimport { isPluginDevelopmentUrl, stripDevelopmentSuffix } from \"./plugins.ts\"\n\nfunction openCustomCodeSettings(engine: VekterEngine) {\n\tconst { siteSettingsStore } = engine.stores\n\tengine.scheduler.processWhenReady(() => {\n\t\tsiteSettingsStore.open()\n\t\tsiteSettingsStore.setActiveTab({ tab: SiteSettingsTabNames.customCode }).catch(unhandledError)\n\t})\n}\n\ntype ToastTextVariant = \"new\" | \"updated\" | \"deleted\"\nexport function showCustomCodeDisplayedToast(\n\tisDisabled: boolean,\n\ttextVariant: ToastTextVariant,\n\tactivePlugin: ActivePlugin,\n) {\n\tconst toastVariant: ToastVariant = isDisabled ? \"warning\" : \"info\"\n\tlet primaryText: string\n\tswitch (textVariant) {\n\t\tcase \"new\":\n\t\t\tprimaryText = isDisabled ? \"Disabled code snippet added\" : \"Code snippet added\"\n\t\t\tbreak\n\t\tcase \"updated\":\n\t\t\tprimaryText = isDisabled ? \"Disabled code snippet updated\" : \"Code snippet updated\"\n\t\t\tbreak\n\t\tcase \"deleted\":\n\t\t\tprimaryText = \"Code snippet removed\"\n\t\t\tbreak\n\t}\n\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: toastVariant,\n\t\tprimaryText,\n\t\tsecondaryText: `by \u201C${activePlugin.name}\u201D.`,\n\t\tduration: 7500,\n\t\tshowCloseButton: \"never\",\n\t\taction:\n\t\t\ttextVariant === \"deleted\"\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\ttitle: Dictionary.View,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\treturn openCustomCodeSettings(activePlugin.context.engine)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t})\n}\n\nexport function showPluginLoadFailedToast(engine: VekterEngine, manifest: VekterPluginManifest, error?: unknown) {\n\tconst toastAction: ToastAction = isExternalPluginManifestId(manifest.id)\n\t\t? {\n\t\t\t\ttitle: Dictionary.Remove,\n\t\t\t\tonClick: () => {\n\t\t\t\t\tengine.stores.pluginStore.uninstallPlugin(manifest.id)\n\t\t\t\t},\n\t\t\t}\n\t\t: {\n\t\t\t\ttitle: \"Learn more\",\n\t\t\t\tonClick: () => {\n\t\t\t\t\topenNewTab(\"https://framer.com/developers/plugins/quick-start#troubleshooting\", { referrer: true })\n\t\t\t\t},\n\t\t\t}\n\n\tconst pluginLoadErrorMessage =\n\t\terror instanceof PluginConfigurationError || error instanceof ManifestConfigurationError ? error.message : undefined\n\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"warning\",\n\t\tprimaryText: \"Failed to load\",\n\t\tsecondaryText: pluginLoadErrorMessage ?? `${manifest.name}.`,\n\t\taction: toastAction,\n\t\tduration: 5000,\n\t})\n}\n\nexport function showUnsupportedModeToast(mode: Mode) {\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tprimaryText: \"Unsupported mode\",\n\t\tsecondaryText: `\"${mode}\".`,\n\t\tduration: 5000,\n\t\taction: {\n\t\t\ttitle: Dictionary.LearnMore,\n\t\t\tonClick: () => {\n\t\t\t\topenNewTab(\"https://framer.com/developers/plugins/modes#unsupported-mode\", { referrer: true })\n\t\t\t},\n\t\t},\n\t})\n}\n\nexport function showUnsupportedModesToast(modes: readonly Mode[]) {\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tprimaryText: \"No support for\",\n\t\tsecondaryText: `${modes.join(\" or \")}.`,\n\t\tduration: 5000,\n\t\taction: {\n\t\t\ttitle: Dictionary.LearnMore,\n\t\t\tonClick: () => {\n\t\t\t\topenNewTab(\"https://framer.com/developers/plugins/modes#unsupported-mode\", { referrer: true })\n\t\t\t},\n\t\t},\n\t})\n}\n\nexport function showPluginUrlFailedToast(url: string, error: unknown) {\n\tconst isDev = isPluginDevelopmentUrl(url)\n\tlet primaryText = isDev ? \"Unable to connect to\" : \"Failed to load\"\n\tlet secondaryText = isDev ? \"Development Plugin.\" : \"plugin.\"\n\n\tconst isManifestConfigurationError = error instanceof ManifestConfigurationError\n\n\tif (error instanceof PluginConfigurationError || isManifestConfigurationError) {\n\t\tprimaryText = \"Failed to load\"\n\t\tsecondaryText = error.message\n\t}\n\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: isManifestConfigurationError || !isDev ? \"error\" : \"warning\",\n\t\tprimaryText,\n\t\tsecondaryText,\n\t\tduration: 5000,\n\t\taction: {\n\t\t\ttitle: Dictionary.LearnMore,\n\t\t\tonClick: () => {\n\t\t\t\topenNewTab(\"https://framer.com/developers/plugins/quick-start#troubleshooting\", { referrer: true })\n\t\t\t},\n\t\t},\n\t})\n}\n\nexport function getPluginToastParts(\n\tpluginName: string,\n\tmessage: string,\n): { primaryText: string; secondaryText: string } {\n\treturn {\n\t\tprimaryText: stripDevelopmentSuffix(pluginName),\n\t\tsecondaryText: truncateStringWithEllipsis(message, 120),\n\t}\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { asSchema, type LanguageModelUsage, type ModelMessage, type ToolSet } from \"ai\"\n\nexport interface AgentTrainingToolDef {\n\tname: string\n\tdescription?: string\n\tinputSchema: unknown\n}\n\nexport interface AgentTrainingStep {\n\tstepIndex: number\n\tmodel: string\n\ttimestamp: string\n\tsystem: string\n\ttools: readonly AgentTrainingToolDef[]\n\tmessages: readonly ModelMessage[]\n\tresponseMessages: readonly ModelMessage[]\n\tfinishReason?: string\n\tusage?: LanguageModelUsage\n}\n\nexport class AgentTrainingDataCollector {\n\tprivate readonly steps: AgentTrainingStep[] = []\n\n\tadd(step: AgentTrainingStep): void {\n\t\tthis.steps.push(step)\n\t}\n\n\tget count(): number {\n\t\treturn this.steps.length\n\t}\n\n\ttoJsonl(): string {\n\t\tif (this.steps.length === 0) return \"\"\n\t\treturn this.steps.map(step => JSON.stringify(step)).join(\"\\n\") + \"\\n\"\n\t}\n\n\tstatic serializeTools(tools: ToolSet, serialize: boolean = true): readonly AgentTrainingToolDef[] {\n\t\tif (!serialize) return emptyArray<AgentTrainingToolDef>()\n\n\t\tconst defs: AgentTrainingToolDef[] = []\n\t\tfor (const [name, tool] of Object.entries(tools)) {\n\t\t\tdefs.push({\n\t\t\t\tname,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tinputSchema: asSchema(tool.inputSchema).jsonSchema,\n\t\t\t})\n\t\t}\n\t\treturn defs\n\t}\n}\n", "import type { ModalOpenSource } from \"@framerjs/events\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\n\nexport function showPasswordUpsellModal(engine: VekterEngine, source: ModalOpenSource) {\n\treturn engine.stores.modalStore.set({\n\t\tsource,\n\t\ttype: ModalType.UpsellFeature,\n\t\tupsellFeature: UpsellFeature.canUsePasswordProtection,\n\t\ttitle: \"Password Protection\",\n\t\tdescription: \"Upgrade your site to protect it with a password and unlock other features.\",\n\t})\n}\n\nexport function showStagingUpsellModal(engine: VekterEngine, source: ModalOpenSource) {\n\treturn engine.stores.modalStore.set({\n\t\tsource,\n\t\ttype: ModalType.UpsellFeature,\n\t\tupsellFeature: UpsellFeature.canUseStagingEnvironment,\n\t\ttitle: \"Staging\",\n\t\tdescription: \"Upgrade your site to gain access to Staging and other powerful features.\",\n\t})\n}\n\nexport function showWellKnownUpsellModal(engine: VekterEngine, source: ModalOpenSource) {\n\treturn engine.stores.modalStore.set({\n\t\tsource,\n\t\ttype: ModalType.UpsellFeature,\n\t\tupsellFeature: UpsellFeature.canUseWellKnown,\n\t\ttitle: \"Well-Known Files\",\n\t\tdescription: \"Upgrade your site to add Well-Known Files and gain access to other features.\",\n\t})\n}\n\nexport function showRedirectsUpsellModal(engine: VekterEngine, source: ModalOpenSource) {\n\treturn engine.stores.modalStore.set({\n\t\tsource,\n\t\ttype: ModalType.UpsellFeature,\n\t\tupsellFeature: UpsellFeature.canUseRedirects,\n\t\ttitle: \"Redirects\",\n\t\tdescription: \"Upgrade your site to add redirects and gain access to other powerful features.\",\n\t})\n}\n", "import type { ModalOpenSource } from \"@framerjs/framer-events\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { showRedirectsUpsellModal } from \"document/components/chrome/shared/UpsellModal/utils/siteSettingsUpsellModals.tsx\"\nimport { LimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\n\n/** This is a hard limit, to avoid hitting DynamoDB limits. */\nexport const maxAllowedRedirects = 2500\n\nexport function ensureRedirectLimits(engine: VekterEngine, action: \"add\" | \"edit\") {\n\t// If a project cannot use redirects, upsell the feature\n\tconst canUseRedirects = engine.stores.projectStore.project?.settings.featureFlags.canUseRedirects === \"on\"\n\tif (!canUseRedirects) {\n\t\tif (engine.stores.pluginStore.activePlugin) {\n\t\t\tshowRedirectsUpsellModal(engine, \"plugins\" as ModalOpenSource)\n\t\t}\n\t\tthrow new LimitError(\"Current plan does not include Redirects\", \"upsell\")\n\t}\n\n\t// If redirects are allowed for the user and the project plan\n\tif (action === \"edit\") {\n\t\t// Always allow edits to existing redirects\n\t\treturn\n\t}\n\n\t// But block adding new redirects if the user will hit the DynamoDB limit\n\tconst currentRedirectCount = RoutesNode.get(engine.tree)?.loaded?.getRedirects().length ?? 0\n\tif (currentRedirectCount >= maxAllowedRedirects) {\n\t\tthrow new LimitError(\"Maximum number of Redirects reached\", \"max-allowed-reached\")\n\t}\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { remapOverrides } from \"document/components/tools/utils/remapOverrides.ts\"\nimport { RenamedIds, updateNodeConnections } from \"document/components/tools/utils/updateNodeConnections.ts\"\nimport { cloneWithRenamedIdMap } from \"document/components/unlinking/utils.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { CanvasChildList } from \"document/models/CanvasTree/nodes/ChildList.ts\"\nimport type { LoadedLayoutTemplateNode } from \"document/models/CanvasTree/nodes/LayoutTemplateNode.ts\"\nimport { TemplateHelper } from \"document/models/CanvasTree/nodes/TemplateHelper.ts\"\nimport { duplicateEntityReferenceNode } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isLayoutTemplateNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isReplica } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { isReplicaVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { uniqueName } from \"document/utils/uniqueName.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\n\nexport function duplicateLayoutTemplateNode(\n\ttree: CanvasTree,\n\tcomponentLoader: ComponentLoader,\n\ttemplate: LoadedLayoutTemplateNode,\n\toptions?: { renamedIds?: RenamedIds },\n) {\n\tconst renamedIds = options?.renamedIds ?? new RenamedIds()\n\tconst nextTemplate = template.clone({ children: new CanvasChildList() })\n\trenamedIds.set(template.id, nextTemplate.id)\n\n\tconst names = new Set<string>()\n\n\tfor (const scope of tree.root.children) {\n\t\tif (!isLayoutTemplateNode(scope)) continue\n\t\tif (!isString(scope.name)) continue\n\t\tnames.add(scope.name)\n\t}\n\n\tconst primary = template.getPrimaryVariant()\n\tconst nextPrimary = cloneWithRenamedIdMap(primary, new Map(), new Map(), renamedIds, false)\n\trenamedIds.set(primary.id, nextPrimary.id)\n\n\tnextTemplate.set({\n\t\tbaseVariantId: nextPrimary.id,\n\t\tname: uniqueName(template.resolveValue(\"name\") ?? Dictionary.Template, names),\n\t})\n\n\tnextTemplate.addChild(nextPrimary)\n\n\tfor (const child of template.children) {\n\t\tif (child.id === template.baseVariantId) continue\n\t\tif (isReplica(child)) {\n\t\t\tconst overrides = remapOverrides(child.replicaInfo.overrides, renamedIds, true)\n\t\t\tconst nextNode = TemplateHelper.create(tree, nextPrimary, { overrides })\n\t\t\trenamedIds.set(child.id, nextNode.id)\n\t\t\tnextTemplate.addChild(nextNode)\n\t\t} else {\n\t\t\tconst newChild = cloneWithRenamedIdMap(child, new Map(), new Map(), renamedIds, false)\n\t\t\trenamedIds.set(child.id, newChild.id)\n\t\t\tnextTemplate.addChild(newChild)\n\t\t}\n\t}\n\n\ttree.insertNode(nextTemplate, undefined, tree.getIndex(template) + 1)\n\n\tfor (const child of nextTemplate.children) {\n\t\tupdateNodeConnections(tree, componentLoader, child, renamedIds, false)\n\t\tif (isReplicaVariant(child) && child.replicaInfo.master === nextPrimary.id) {\n\t\t\tTemplateHelper.registerInInheritedNode(nextPrimary, child)\n\t\t}\n\t}\n\n\tduplicateEntityReferenceNode(tree, template.id, nextTemplate.id)\n\n\treturn nextTemplate\n}\n", "import { isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { RejectedCommandError, RejectedCommandKind } from \"../../RejectedCommandError.ts\"\nimport {\n\tTextBlockClass,\n\tTextBlockquoteClass,\n\tTextBulletListClass,\n\tTextComponentInstanceClass,\n\tTextLineBreakClass,\n\tTextListItemClass,\n\tTextMediaBlockClass,\n\tTextNumberedListClass,\n\tTextRunClass,\n\tTextTableCellClass,\n\tTextTableClass,\n\tTextTableRowClass,\n\tTextUnsupportedBlockClass,\n\ttype InsertableVirtualNodeClass,\n\ttype VirtualNodeClass,\n} from \"../../dsl.ts\"\nimport type { AgentContext } from \"../AgentContext.ts\"\nimport {\n\ttype RichTextReaderHandle,\n\ttype RichTextTarget,\n\ttype VirtualRichTextNode,\n\ttype VirtualTextCapabilities,\n\ttype VirtualTextDestination,\n\tgetVirtualRichTextDSLNodeClass,\n\tisVirtualRichTextNode,\n\tisVirtualRichTextUnsupported,\n} from \"./document.ts\"\nimport { parseRichTextTarget, resolveRichTextTargetHandle } from \"./targets.ts\"\nimport { walkVirtualRichTextNode } from \"./traversal.ts\"\n\nconst richTextTargetDestinationKind = \"RichTextTarget\" as const\n\ntype RichTextDestinationKind = typeof richTextTargetDestinationKind | VirtualNodeClass\n\nconst rootDestinationKinds = new Set<RichTextDestinationKind>([\n\trichTextTargetDestinationKind,\n\tTextListItemClass,\n\tTextBlockquoteClass,\n\tTextTableCellClass,\n])\nconst listDestinationKinds = new Set<RichTextDestinationKind>([TextBulletListClass, TextNumberedListClass])\nconst inlineDestinationKinds = new Set<RichTextDestinationKind>([TextBlockClass])\nconst tableRowDestinationKinds = new Set<RichTextDestinationKind>([TextTableClass])\nconst tableCellDestinationKinds = new Set<RichTextDestinationKind>([TextTableRowClass])\n\nconst validDestinationKindsByNodeClass = {\n\t[TextBlockClass]: rootDestinationKinds,\n\t[TextBulletListClass]: rootDestinationKinds,\n\t[TextNumberedListClass]: rootDestinationKinds,\n\t[TextTableClass]: rootDestinationKinds,\n\t[TextMediaBlockClass]: rootDestinationKinds,\n\t[TextComponentInstanceClass]: rootDestinationKinds,\n\t[TextUnsupportedBlockClass]: rootDestinationKinds,\n\t[TextBlockquoteClass]: rootDestinationKinds,\n\t[TextListItemClass]: listDestinationKinds,\n\t[TextRunClass]: inlineDestinationKinds,\n\t[TextLineBreakClass]: inlineDestinationKinds,\n\t[TextTableRowClass]: tableRowDestinationKinds,\n\t[TextTableCellClass]: tableCellDestinationKinds,\n} satisfies Record<VirtualNodeClass, ReadonlySet<RichTextDestinationKind>>\n\nfunction getRichTextDestination(parent: string, ctx: AgentContext): VirtualTextDestination | undefined {\n\tconst handle = resolveRichTextTargetHandle(parent, ctx)\n\tif (handle) return handle.target\n\n\tconst resolvedParentId = ctx.treeResolver.resolveVirtualId(parent)\n\tconst virtualParent = ctx.virtualText.resolve(resolvedParentId)\n\n\tif (virtualParent) return virtualParent\n}\n\nfunction supportsCapability(\n\tdestination: VirtualTextDestination,\n\tcapability: keyof VirtualTextCapabilities,\n\tctx: AgentContext,\n) {\n\tconst target = ctx.virtualText.getTarget(destination)\n\tconst handle = resolveRichTextTargetHandle(target, ctx)\n\n\treturn handle?.capabilities[capability] ?? false\n}\n\nfunction getNodeClass(nodeClassOrNode: InsertableVirtualNodeClass | VirtualRichTextNode): VirtualNodeClass {\n\tif (isVirtualRichTextNode(nodeClassOrNode)) {\n\t\treturn getVirtualRichTextDSLNodeClass(nodeClassOrNode.type)\n\t}\n\n\treturn nodeClassOrNode\n}\n\nfunction getRichTextDestinationKind(destination: VirtualTextDestination): RichTextDestinationKind {\n\tif (!isVirtualRichTextNode(destination)) return richTextTargetDestinationKind\n\n\treturn getVirtualRichTextDSLNodeClass(destination.type)\n}\n\nexport function resolveRichTextDestination(\n\tnodeClassOrNode: InsertableVirtualNodeClass | VirtualRichTextNode,\n\tparent: string,\n\tctx: AgentContext,\n): VirtualTextDestination {\n\tconst nodeClass = getNodeClass(nodeClassOrNode)\n\tconst destination = getRichTextDestination(parent, ctx)\n\n\tif (!destination || !isValidRichTextDestination(nodeClass, destination)) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.VirtualTextInvalidParent,\n\t\t\tgetInvalidParentMessage(nodeClass, parent),\n\t\t)\n\t}\n\n\tassertEditableRichTextTarget(nodeClass, parent, destination, ctx)\n\n\tif (nodeClass === TextMediaBlockClass && !supportsCapability(destination, \"media\", ctx)) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.VirtualTextCMSOnlyCapability,\n\t\t\t\"Media blocks are only supported on CMS Rich Text Targets.\",\n\t\t)\n\t}\n\n\tif (nodeClass === TextBlockquoteClass && !supportsCapability(destination, \"blockquotes\", ctx)) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.VirtualTextCMSOnlyCapability,\n\t\t\t\"Blockquotes are only supported on CMS Rich Text Targets.\",\n\t\t)\n\t}\n\n\tif (nodeClass === TextTableClass && !supportsCapability(destination, \"tables\", ctx)) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.VirtualTextCMSOnlyCapability,\n\t\t\t\"Tables are only supported on CMS Rich Text Targets.\",\n\t\t)\n\t}\n\n\tif (nodeClass === TextComponentInstanceClass && !supportsCapability(destination, \"embeds\", ctx)) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.VirtualTextCMSOnlyCapability,\n\t\t\t\"Embedded component instances are only supported on CMS Rich Text Targets.\",\n\t\t)\n\t}\n\n\treturn destination\n}\n\nfunction isValidRichTextDestination(nodeClass: VirtualNodeClass, destination: VirtualTextDestination): boolean {\n\tconst destinationKind = getRichTextDestinationKind(destination)\n\treturn validDestinationKindsByNodeClass[nodeClass].has(destinationKind)\n}\n\nfunction assertEditableRichTextTarget(\n\tnodeClass: VirtualNodeClass,\n\tparent: string,\n\tdestination: VirtualTextDestination,\n\tctx: AgentContext,\n): void {\n\tconst target = ctx.virtualText.getTarget(destination)\n\tconst { nodeId, targetKey } = parseRichTextTarget(target)\n\tif (targetKey) return\n\n\tconst targetNode = ctx.treeResolver.get(nodeId)\n\n\tif (!isRichTextNode(targetNode)) return\n\tif (!isVariableReference(targetNode.htmlContent) && !isVariableReference(targetNode.textContent)) return\n\n\tthrow new RejectedCommandError(\n\t\tRejectedCommandKind.VirtualTextInvalidParent,\n\t\t[\n\t\t\t`Cannot use parent \"${parent}\" for ${nodeClass} because it resolves to RichTextNode \"${targetNode.id}\",`,\n\t\t\t`whose text is bound to a variable. Edit the source rich text value instead,`,\n\t\t\t`for example use parent=\"<CollectionItemNodeId>/<RichTextVariableId>\" for CMS rich text fields.`,\n\t\t].join(\" \"),\n\t)\n}\n\nfunction getInvalidParentMessage(nodeClass: VirtualNodeClass, parent: string): string {\n\tconst destinationKinds = validDestinationKindsByNodeClass[nodeClass]\n\treturn `Virtual rich text parent \"${parent}\" must be ${formatDestinationKinds(destinationKinds)} for ${nodeClass}.`\n}\n\nfunction formatDestinationKinds(destinationKinds: ReadonlySet<RichTextDestinationKind>): string {\n\treturn [...destinationKinds].join(\", \")\n}\n\nfunction assertSubtreeAcceptedAtDestination(\n\troot: VirtualRichTextNode,\n\tdestinationCapabilities: VirtualTextCapabilities,\n\tdestinationTargetLabel: string,\n): void {\n\tfor (const node of walkVirtualRichTextNode(root)) {\n\t\tif (isVirtualRichTextUnsupported(node)) {\n\t\t\tthrow new RejectedCommandError(\n\t\t\t\tRejectedCommandKind.VirtualTextCrossDocumentUnsupportedDescendant,\n\t\t\t\t`Cannot transfer subtree to \"${destinationTargetLabel}\": contains an unsupported block.`,\n\t\t\t)\n\t\t}\n\n\t\tconst requiredCapability = nodeToCapability[node.type]\n\t\tif (requiredCapability && !destinationCapabilities[requiredCapability]) {\n\t\t\tthrow new RejectedCommandError(\n\t\t\t\tRejectedCommandKind.VirtualTextCrossDocumentUnsupportedDescendant,\n\t\t\t\t`Cannot transfer subtree to \"${destinationTargetLabel}\": contains a \"${node.type}\" node, which requires \"${requiredCapability}\" capability that this target does not support.`,\n\t\t\t)\n\t\t}\n\t}\n}\n\nconst nodeToCapability: Record<VirtualRichTextNode[\"type\"], keyof VirtualTextCapabilities | undefined> = {\n\tmediaBlock: \"media\",\n\tblockquote: \"blockquotes\",\n\ttable: \"tables\",\n\tcomponentInstance: \"embeds\",\n\tunsupported: undefined,\n\tbulletList: undefined,\n\tlineBreak: undefined,\n\tlistItem: undefined,\n\tnumberedList: undefined,\n\ttableCell: undefined,\n\ttableRow: undefined,\n\ttextBlock: undefined,\n\ttextRun: undefined,\n}\n\nexport function resolveSubtreeTransferHandle(\n\tctx: AgentContext,\n\troot: VirtualRichTextNode,\n\tdestinationTarget: RichTextTarget,\n): RichTextReaderHandle {\n\tconst handle = resolveRichTextTargetHandle(destinationTarget, ctx)\n\tif (!handle) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.RichTextTargetNotFound,\n\t\t\t`Rich text target \"${destinationTarget}\" not found.`,\n\t\t)\n\t}\n\n\tassertSubtreeAcceptedAtDestination(root, handle.capabilities, destinationTarget)\n\treturn handle\n}\n\nexport const testing = {\n\tassertEditableRichTextTarget,\n\tassertSubtreeAcceptedAtDestination,\n\tgetInvalidParentMessage,\n\tisValidRichTextDestination,\n}\n", "import { assert, assertNever } from \"@framerjs/shared\"\nimport { LimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { ensureRedirectLimits } from \"document/components/chrome/siteSettings/Redirects/ensureRedirectLimits.ts\"\nimport {\n\tCodeComponentNode,\n\tCollectionItemNode,\n\tCollectionNode,\n\tDesignPageNode,\n\tFrameNode,\n\tLayoutTemplateNode,\n\tRichTextNode,\n\tSmartComponentNode,\n\tWebPageNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { ComponentPresetNode } from \"document/models/CanvasTree/nodes/ComponentPresetNode.ts\"\nimport { ImageStylePresetNode } from \"document/models/CanvasTree/nodes/ImageStylePresetNode.ts\"\nimport { InlineCodeStylePresetNode } from \"document/models/CanvasTree/nodes/InlineCodeStylePresetNode.ts\"\nimport { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport { OverlayNode } from \"document/models/CanvasTree/nodes/OverlayNode.ts\"\nimport { RedirectRouteNode } from \"document/models/CanvasTree/nodes/RedirectRouteNode.ts\"\nimport ShaderNode from \"document/models/CanvasTree/nodes/ShaderNode.ts\"\nimport { TableStylePresetNode } from \"document/models/CanvasTree/nodes/TableStylePresetNode.ts\"\nimport { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { FormBooleanInputNode } from \"document/models/CanvasTree/nodes/forms/FormBooleanInputNode.ts\"\nimport { FormPlainTextInputNode } from \"document/models/CanvasTree/nodes/forms/FormPlainTextInputNode.ts\"\nimport { FormSelectNode } from \"document/models/CanvasTree/nodes/forms/FormSelectNode.ts\"\nimport { relativeOverlayDefaults } from \"document/models/CanvasTree/nodes/utils/relativeOverlayDefaults.ts\"\nimport { createVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithPins } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport type { WithSizeDimensionType } from \"document/models/CanvasTree/traits/WithSizeDimensionType.ts\"\nimport { formCheckboxCheckedEffectDefaults } from \"document/models/CanvasTree/traits/forms/WithFormBooleanInputType.ts\"\nimport {\n\tformBooleanInputStyleCreateDefaults,\n\tformInputStyleCreateDefaults,\n\tformSelectStyleCreateDefaults,\n} from \"document/models/CanvasTree/traits/forms/utils.ts\"\nimport { ControlType, DimensionType } from \"library/index.ts\"\nimport { shouldEnableDraftStatusForNewEntity } from \"utils/shouldEnableDraftStatusForNewEntity.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { isShaderName, type ShadersJsonDefinition } from \"./context/shaders.ts\"\nimport { type AgentSupportedStylePresetNode, StylePresetType } from \"./context/stylePresetType.ts\"\nimport {\n\ttype AddCommandAttributes,\n\tCollectionReferenceVariableAliasNodeClass,\n\tComponentInstanceNodeClass,\n\tComponentNodeClass,\n\tDateVariableAliasNodeClass,\n\tEventHandlerVariableAliasNodeClass,\n\tFixedOverlayNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tIconNodeClass,\n\tisInsertableVirtualNodeClass,\n\tIconVariableAliasNodeClass,\n\tLinkVariableAliasNodeClass,\n\tRelativeOverlayNodeClass,\n\tRedirectNodeClass,\n\tVariableNodeClass,\n\ttype InsertableVirtualNodeClass,\n\tOptionVariableAliasNodeClass,\n\tFileVariableAliasNodeClass,\n} from \"./dsl.ts\"\nimport { uniqueNameForNewColorToken, uniqueNameForNewStylePreset } from \"./presetNaming.ts\"\nimport { escapeValue } from \"./prompt/utils.ts\"\nimport { SHADER_DEFINITION_QUERY } from \"./tools/readProjectQueryTypes.ts\"\n\ntype CreateNodeResult =\n\t| FrameNode\n\t| RichTextNode\n\t| CodeComponentNode\n\t| ColorStyleTokenNode\n\t| SmartComponentNode\n\t| CollectionNode\n\t| CollectionItemNode\n\t| DesignPageNode\n\t| WebPageNode\n\t| LayoutTemplateNode\n\t| TextStylePresetNode\n\t| LinkStylePresetNode\n\t| InlineCodeStylePresetNode\n\t| BlockquoteStylePresetNode\n\t| TableStylePresetNode\n\t| ImageStylePresetNode\n\t| ComponentPresetNode\n\t| FormPlainTextInputNode\n\t| FormBooleanInputNode\n\t| FormSelectNode\n\t| ShaderNode\n\t| OverlayNode\n\t| RedirectRouteNode\n\nconst autoSizeDefaults: WithSizeDimensionType = {\n\twidthType: DimensionType.Auto,\n\theightType: DimensionType.Auto,\n}\n\n// Explicitly reset all pin values to null to ensure predictable positioning when LLM inserts pinned nodes.\nconst pinDefaults: Partial<WithPins> = {\n\tleft: null,\n\ttop: null,\n\tright: null,\n\tbottom: null,\n}\n\nconst frameCreateDefaults: Partial<FrameNode> = {\n\t// Frames start without fill by default; follow-up styling can opt in.\n\tfillEnabled: false,\n}\n\n// Picks a unique name and registers it on the context so the next ADD in the same batch sees it.\nfunction createStylePreset<T extends AgentSupportedStylePresetNode>(\n\ttype: StylePresetType,\n\tdesiredName: string,\n\tctx: AgentContext,\n\tcreate: (uniqueName: string) => T,\n\tcomponentId?: string,\n\tcomponentIdentifier?: ComponentPresetNode[\"componentIdentifier\"],\n): T {\n\tconst uniqueName = uniqueNameForNewStylePreset(type, desiredName, ctx)\n\tconst node = create(uniqueName)\n\tctx.stylePresets.registerNewPreset(type, node.id, uniqueName, componentId, componentIdentifier)\n\treturn node\n}\n\ntype ExcludedNodeClasses =\n\t| { node: typeof VariableNodeClass }\n\t| { node: InsertableVirtualNodeClass }\n\t| { node: typeof CollectionReferenceVariableAliasNodeClass }\n\t| { node: typeof DateVariableAliasNodeClass }\n\t| { node: typeof EventHandlerVariableAliasNodeClass }\n\t| { node: typeof IconVariableAliasNodeClass }\n\t| { node: typeof GalleryVariableAliasNodeClass }\n\t| { node: typeof LinkVariableAliasNodeClass }\n\t| { node: typeof OptionVariableAliasNodeClass }\n\t| { node: typeof FileVariableAliasNodeClass }\ntype AllowedNodeClasses = Exclude<AddCommandAttributes, ExcludedNodeClasses>\n\nexport function isAllowedNodeClass(attrs: AddCommandAttributes): attrs is AllowedNodeClasses {\n\treturn (\n\t\t!isInsertableVirtualNodeClass(attrs.node) &&\n\t\tattrs.node !== VariableNodeClass &&\n\t\tattrs.node !== CollectionReferenceVariableAliasNodeClass &&\n\t\tattrs.node !== DateVariableAliasNodeClass &&\n\t\tattrs.node !== EventHandlerVariableAliasNodeClass &&\n\t\tattrs.node !== IconVariableAliasNodeClass &&\n\t\tattrs.node !== GalleryVariableAliasNodeClass &&\n\t\tattrs.node !== LinkVariableAliasNodeClass &&\n\t\tattrs.node !== OptionVariableAliasNodeClass &&\n\t\tattrs.node !== FileVariableAliasNodeClass\n\t)\n}\n\nexport async function createNode(attributes: AllowedNodeClasses, ctx: AgentContext): Promise<CreateNodeResult> {\n\tconst { id, name } = attributes\n\tconst nullableName = name ?? null\n\n\tswitch (attributes.node) {\n\t\tcase ClassDiscriminator.FrameNode:\n\t\t\treturn new FrameNode({ name: nullableName, ...frameCreateDefaults, ...pinDefaults })\n\t\tcase ClassDiscriminator.RichTextNode:\n\t\t\treturn new RichTextNode({ name: nullableName, ...autoSizeDefaults, ...pinDefaults })\n\t\tcase ClassDiscriminator.FormPlainTextInputNode: {\n\t\t\treturn new FormPlainTextInputNode({ name: nullableName, ...formInputStyleCreateDefaults, ...pinDefaults })\n\t\t}\n\t\tcase ClassDiscriminator.FormBooleanInputNode: {\n\t\t\treturn new FormBooleanInputNode({\n\t\t\t\tname: nullableName,\n\t\t\t\t...formBooleanInputStyleCreateDefaults,\n\t\t\t\t...formCheckboxCheckedEffectDefaults,\n\t\t\t\t...pinDefaults,\n\t\t\t})\n\t\t}\n\t\tcase ClassDiscriminator.FormSelectNode: {\n\t\t\treturn new FormSelectNode({ name: nullableName, ...formSelectStyleCreateDefaults, ...pinDefaults })\n\t\t}\n\t\tcase ComponentInstanceNodeClass: {\n\t\t\tconst { component } = attributes\n\t\t\tassert(!isUndefined(component), \"Component is required for component instance nodes\")\n\n\t\t\tconst codeComponentIdentifier = await ctx.components.insert(component)\n\t\t\tassert(codeComponentIdentifier, `Component \"${component}\" not found`)\n\n\t\t\treturn new CodeComponentNode({ name: nullableName, codeComponentIdentifier, ...autoSizeDefaults, ...pinDefaults })\n\t\t}\n\t\tcase ClassDiscriminator.ComponentPresetNode: {\n\t\t\tconst { component } = attributes\n\t\t\tassert(!isUndefined(component), \"Component is required for component preset nodes\")\n\n\t\t\tconst componentIdentifier = await ctx.components.insert(component)\n\t\t\tassert(componentIdentifier, `Component \"${component}\" not found`)\n\n\t\t\tconst componentId = ctx.components.getIdForModuleIdentifier(componentIdentifier)\n\t\t\tassert(componentId, `Component \"${component}\" not found`)\n\n\t\t\treturn createStylePreset(\n\t\t\t\tStylePresetType.Component,\n\t\t\t\tname ?? component,\n\t\t\t\tctx,\n\t\t\t\tuniqueName => new ComponentPresetNode({ name: uniqueName, componentIdentifier }),\n\t\t\t\tcomponentId,\n\t\t\t\tcomponentIdentifier,\n\t\t\t)\n\t\t}\n\t\tcase IconNodeClass: {\n\t\t\tconst { set, $control__icon } = attributes\n\t\t\tassert(!isUndefined(set), \"Set is required for icon nodes\")\n\t\t\tif (isUndefined($control__icon)) {\n\t\t\t\tawait ctx.vectorSets.ensureSetDefinition(set)\n\t\t\t\treturn new CodeComponentNode({ name: nullableName, ...autoSizeDefaults, ...pinDefaults })\n\t\t\t}\n\n\t\t\tconst variableReferenceHandle = ctx.dynamicValues.getVariableReferenceHandleByVariableId($control__icon)\n\t\t\tif (variableReferenceHandle?.variable.type === ControlType.VectorSetItem) {\n\t\t\t\treturn new CodeComponentNode({\n\t\t\t\t\tname: nullableName,\n\t\t\t\t\tcodeComponentIdentifier: variableReferenceHandle.variable.initialValue.identifier,\n\t\t\t\t\tdynamicVectorSetIdentifier: createVariableReference(\n\t\t\t\t\t\tvariableReferenceHandle.variable.id,\n\t\t\t\t\t\tvariableReferenceHandle.scopeId,\n\t\t\t\t\t),\n\t\t\t\t\t...autoSizeDefaults,\n\t\t\t\t\t...pinDefaults,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// We may not have added the set yet. We must await the insert to ensure the entire set is also added.\n\t\t\tconst identifier = await ctx.vectorSets.insert(set, $control__icon)\n\t\t\tassert(identifier, `Icon \"${$control__icon}\" not found in set \"${set}\"`)\n\n\t\t\treturn new CodeComponentNode({\n\t\t\t\tname: nullableName,\n\t\t\t\tcodeComponentIdentifier: identifier,\n\t\t\t\t...autoSizeDefaults,\n\t\t\t\t...pinDefaults,\n\t\t\t})\n\t\t}\n\t\tcase ClassDiscriminator.ColorStyleTokenNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for color token nodes\")\n\t\t\tconst uniqueName = uniqueNameForNewColorToken(name, ctx)\n\t\t\tconst colorStyleToken = new ColorStyleTokenNode({ name: uniqueName })\n\t\t\tctx.tokens.add(id, colorStyleToken.id, uniqueName)\n\t\t\treturn colorStyleToken\n\t\t}\n\t\tcase ComponentNodeClass: {\n\t\t\tassert(!isUndefined(name), \"Name is required for component nodes\")\n\t\t\treturn new SmartComponentNode({ name })\n\t\t}\n\t\tcase ClassDiscriminator.CollectionNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for collection nodes\")\n\t\t\treturn new CollectionNode({ name })\n\t\t}\n\t\tcase ClassDiscriminator.CollectionItemNode: {\n\t\t\tconst engine = ctx.hooks.getEngine()\n\t\t\tassert(engine, \"Collection items require an active project engine.\")\n\t\t\tconst item = CollectionItemNode.create()\n\n\t\t\tif (shouldEnableDraftStatusForNewEntity(engine)) {\n\t\t\t\titem.set({ isDraft: true })\n\t\t\t}\n\n\t\t\treturn item\n\t\t}\n\t\tcase ClassDiscriminator.DesignPageNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for design page nodes\")\n\t\t\treturn new DesignPageNode({ name })\n\t\t}\n\t\tcase ClassDiscriminator.WebPageNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for web page nodes\")\n\t\t\treturn new WebPageNode({ name })\n\t\t}\n\t\tcase ClassDiscriminator.LayoutTemplateNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for layout template nodes\")\n\t\t\treturn new LayoutTemplateNode({ name })\n\t\t}\n\t\tcase RedirectNodeClass: {\n\t\t\tconst engine = ctx.hooks.getEngine()\n\t\t\tassert(engine, \"Redirects require an active project engine.\")\n\t\t\ttry {\n\t\t\t\tensureRedirectLimits(engine, \"add\")\n\t\t\t} catch (error) {\n\t\t\t\tassert(error instanceof LimitError)\n\t\t\t\tthrow new Error(`Failed to create Redirect: ${error.message}. Inform the user and ask them how to proceed.`, {\n\t\t\t\t\tcause: error,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn new RedirectRouteNode({ name: nullableName })\n\t\t}\n\t\tcase ClassDiscriminator.TextStylePresetNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for text style preset nodes\")\n\t\t\tconst { tag } = attributes\n\t\t\tassert(!isUndefined(tag), \"Tag is required for text style preset nodes\")\n\t\t\treturn createStylePreset(StylePresetType.Text, name, ctx, uniqueName =>\n\t\t\t\tTextStylePresetNode.createDefault(tag, { name: uniqueName }),\n\t\t\t)\n\t\t}\n\t\tcase ClassDiscriminator.LinkStylePresetNode: {\n\t\t\tassert(!isUndefined(name), \"Name is required for link style preset nodes\")\n\t\t\treturn createStylePreset(StylePresetType.Link, name, ctx, uniqueName =>\n\t\t\t\tLinkStylePresetNode.createDefault({ name: uniqueName }),\n\t\t\t)\n\t\t}\n\t\tcase ClassDiscriminator.InlineCodeStylePresetNode:\n\t\t\tassert(!isUndefined(name), \"Name is required for inline code style preset nodes\")\n\t\t\treturn createStylePreset(\n\t\t\t\tStylePresetType.InlineCode,\n\t\t\t\tname,\n\t\t\t\tctx,\n\t\t\t\tuniqueName => new InlineCodeStylePresetNode({ name: uniqueName }),\n\t\t\t)\n\t\tcase ClassDiscriminator.BlockquoteStylePresetNode:\n\t\t\tassert(!isUndefined(name), \"Name is required for blockquote style preset nodes\")\n\t\t\treturn createStylePreset(StylePresetType.Blockquote, name, ctx, uniqueName =>\n\t\t\t\tBlockquoteStylePresetNode.createDefault({ name: uniqueName }),\n\t\t\t)\n\t\tcase ClassDiscriminator.TableStylePresetNode:\n\t\t\tassert(!isUndefined(name), \"Name is required for table style preset nodes\")\n\t\t\treturn createStylePreset(StylePresetType.Table, name, ctx, uniqueName =>\n\t\t\t\tTableStylePresetNode.createDefault({ name: uniqueName }),\n\t\t\t)\n\t\tcase FixedOverlayNodeClass:\n\t\t\treturn new OverlayNode({ name: nullableName })\n\t\tcase RelativeOverlayNodeClass:\n\t\t\treturn new FrameNode({\n\t\t\t\tname: nullableName,\n\t\t\t\t...frameCreateDefaults,\n\t\t\t\t...relativeOverlayDefaults,\n\t\t\t\t...pinDefaults,\n\t\t\t})\n\t\tcase ClassDiscriminator.ImageStylePresetNode:\n\t\t\tassert(!isUndefined(name), \"Name is required for image style preset nodes\")\n\t\t\treturn createStylePreset(\n\t\t\t\tStylePresetType.Image,\n\t\t\t\tname,\n\t\t\t\tctx,\n\t\t\t\tuniqueName => new ImageStylePresetNode({ name: uniqueName }),\n\t\t\t)\n\t\tcase ClassDiscriminator.ShaderNode: {\n\t\t\tconst { shader } = attributes\n\t\t\tassert(!isUndefined(shader), `Shader ${escapeValue<ShadersJsonDefinition>(\"name\")} is required for shader nodes`)\n\t\t\tassert(\n\t\t\t\tisShaderName(shader),\n\t\t\t\t`Shader ${escapeValue<ShadersJsonDefinition>(\"name\")} ${shader} is not from ${escapeValue(SHADER_DEFINITION_QUERY)}`,\n\t\t\t)\n\n\t\t\tconst identifier = await ctx.shaders.insert(shader)\n\n\t\t\treturn new ShaderNode({\n\t\t\t\tname: nullableName,\n\t\t\t\tshaderModuleIdentifier: identifier,\n\t\t\t\t...pinDefaults,\n\t\t\t})\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(attributes)\n\t}\n}\n", "import {\n\tassert,\n\tassertNever,\n\tlocalModuleIdentifierForStableName,\n\ttype ModuleExportIdentifierString,\n\tModuleType,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { getScopeTypeForScope } from \"document/base-engine/BaseScopeStore.ts\"\nimport { collectionHasItemWithId } from \"document/components/chrome/contentManagement/utils/validateControlPropReference.ts\"\nimport { isCompatibleFileType } from \"document/components/chrome/properties/utils/allowedFileTypes.ts\"\nimport { getFallbackNameForCreateVariableOptions } from \"document/components/chrome/properties/utils/createVariableInScope.ts\"\nimport { convertHTMLToCanvasRichText } from \"document/components/chrome/shared/utils/convertHTMLToRichText.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tisCollectionNode,\n\tisSmartComponentNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport {\n\ttype ArrayVariableDefinition,\n\ttype BooleanVariableDefinition,\n\ttype CollectionReferenceVariableDefinition,\n\ttype ColorVariableDefinition,\n\ttype DateVariableDefinition,\n\ttype EnumVariableCase,\n\ttype EnumVariableDefinition,\n\ttype EventHandlerVariableDefinition,\n\ttype FileVariableDefinition,\n\ttype FileVariableExtension,\n\ttype ImageVariableDefinition,\n\tisSlugVariableDefinition,\n\ttype LinkVariableDefinition,\n\ttype MultiCollectionReferenceVariableDefinition,\n\ttype NumberVariableDefinition,\n\ttype RichTextVariableDefinition,\n\ttype SlugVariableDefinition,\n\ttype StringVariableDefinition,\n\ttype VariableID,\n\ttype VariableOrDivider,\n\ttype VectorSetItemVariableDefinition,\n\twithOptional,\n\twithQueryParam,\n\twithRequired,\n\ttype WithVariables,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport { isValidURL } from \"document/utils/domainValidation.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { randomID } from \"library/render/types/randomID.ts\"\nimport { getCollectionForIdentifier } from \"utils/getCollectionForIdentifier.ts\"\nimport { isArray, isDefined, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { getMediaTypeFromURL } from \"utils/url.ts\"\nimport { extensions as imageAllowedFileTypes } from \"web/lib/images/supportedFormats.ts\"\nimport type { TreeResolver } from \"./TreeResolver.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { type AddVariableAttributes, ComponentNodeClass, IconVariableType } from \"./dsl.ts\"\nimport { applyArrayAttributePatch, isNullString } from \"./traits/helpers.ts\"\nimport { disallowedFileTypeMessage, untrustedUrlMessage } from \"./traits/invalidValues.ts\"\n\ntype CreateVariableResult =\n\t| StringVariableDefinition\n\t| ColorVariableDefinition\n\t| NumberVariableDefinition\n\t| BooleanVariableDefinition\n\t| RichTextVariableDefinition\n\t| ImageVariableDefinition\n\t| EnumVariableDefinition\n\t| LinkVariableDefinition\n\t| DateVariableDefinition\n\t| EventHandlerVariableDefinition\n\t| FileVariableDefinition\n\t| CollectionReferenceVariableDefinition\n\t| MultiCollectionReferenceVariableDefinition\n\t| VectorSetItemVariableDefinition\n\t| ArrayVariableDefinition\n\nconst variableTypesNotNeedingInitialValue = new Set<CreateVariableResult[\"type\"]>([\n\t// Image variables don't need an initial value because when missing the canvas shows a placeholder\n\t// (which isn't true for other data types)\n\tControlType.Image,\n\t// Link variable initialValue is deprecated in WithVariables.ts LinkVariableDefinition and intentionally omitted.\n\tControlType.Link,\n\tControlType.EventHandler,\n\t// Gallery variables use an empty array initial value.\n\tControlType.Array,\n\t// File variables do not support initial value.\n\tControlType.File,\n])\n\ninterface CreateVariableInScopeResult {\n\tslugVariable?: SlugVariableDefinition\n\tvariable: CreateVariableResult\n}\n\ntype NormalizedAddVariableBaseAttributes = Pick<AddVariableAttributes, \"id\" | \"node\" | \"scope\" | \"name\" | \"description\">\n\ntype NormalizedAddVariableAttributes = (\n\t| Exclude<AddVariableAttributes, { type: typeof IconVariableType }>\n\t| (NormalizedAddVariableBaseAttributes & {\n\t\t\ttype: ControlType.VectorSetItem\n\t\t\tinitialValue: VectorSetItemVariableDefinition[\"initialValue\"]\n\t\t\tsetModuleId: VectorSetItemVariableDefinition[\"setModuleId\"]\n\t  })\n) & { queryParam?: string }\n\ninterface CreateVariableInScopeOptions {\n\tllmId: string\n\tscopeNode: CanvasNode & WithVariables\n\tonWarning: (message: string) => void\n}\n\ninterface BaseVariableAttributes {\n\tid: VariableID\n\tname: string\n\tdescription?: string\n}\n\ntype UpdateVariableVectorSets = Pick<AgentContext[\"vectorSets\"], \"insertForVariable\"> & {\n\tasync: Pick<AgentContext[\"vectorSets\"][\"async\"], \"forModuleId\">\n}\n\ntype VariableUpdates<T extends VariableOrDivider> = Omit<\n\tPartial<T>,\n\t\"initialValue\" | \"set\" | \"setModuleId\" | \"type\" | \"displayTime\" | \"cases\" | \"allowedFileTypes\"\n> & {\n\tinitialValue?: unknown\n\tcases?: unknown\n\tallowedFileTypes?: unknown\n\tset?: string\n\tsetModuleId?: unknown\n\ttype?: unknown\n\tqueryParam?: string\n\tdisplayTime?: string | boolean\n\tdisplayTextArea?: string | boolean\n}\n\ntype FileVariableContext = Pick<AgentContext[\"files\"], \"forUrl\" | \"isTrustedUrl\">\n\ninterface StructuredUpdateVariableContext {\n\tfiles?: FileVariableContext\n\tvectorSets?: UpdateVariableVectorSets\n\ttreeStore?: AgentContext[\"treeStore\"]\n\ttreeResolver?: Pick<TreeResolver, \"get\">\n}\n\ntype UpdateVariableContext = FileVariableContext | StructuredUpdateVariableContext\n\nfunction getUpdateVariableFilesContext(ctx?: UpdateVariableContext): FileVariableContext | undefined {\n\tif (!ctx) return undefined\n\tif (\"forUrl\" in ctx && \"isTrustedUrl\" in ctx) return ctx\n\treturn ctx.files\n}\n\nfunction hasCollectionUpdateContext(\n\tctx: UpdateVariableContext | undefined,\n): ctx is StructuredUpdateVariableContext &\n\tRequired<Pick<StructuredUpdateVariableContext, \"treeStore\" | \"treeResolver\">> {\n\treturn !!ctx && \"files\" in ctx && !!ctx.treeStore && !!ctx.treeResolver\n}\n\nfunction hasVectorSetsUpdateContext(\n\tctx: UpdateVariableContext | undefined,\n): ctx is StructuredUpdateVariableContext & Required<Pick<StructuredUpdateVariableContext, \"vectorSets\">> {\n\treturn !!ctx && \"vectorSets\" in ctx && !!ctx.vectorSets\n}\n\nexport async function updateVariable<T extends VariableOrDivider>(\n\tvariable: T,\n\tupdates: VariableUpdates<T>,\n\tnodeWithVariables: CanvasNode & WithVariables,\n\tonWarning: (message: string) => void,\n\tctx?: UpdateVariableContext,\n): Promise<T> {\n\tassert(isUndefined(updates.type), `Cannot update the type of variable \"${variable.name}\".`)\n\tconst files = getUpdateVariableFilesContext(ctx)\n\n\tif (\n\t\tfiles &&\n\t\tvariable.type === ControlType.Image &&\n\t\tisString(updates.initialValue) &&\n\t\tisValidURL(updates.initialValue)\n\t) {\n\t\tif (!files.isTrustedUrl(updates.initialValue)) {\n\t\t\tthrow new Error(untrustedUrlMessage(updates.initialValue))\n\t\t}\n\t\tconst assetReference = await files.forUrl(updates.initialValue, { linkToProject: true })\n\t\tif (assetReference) {\n\t\t\tupdates = { ...updates, initialValue: assetReference }\n\t\t}\n\t}\n\n\tconst {\n\t\tid: _id,\n\t\tinitialValue: rawInitialValue,\n\t\tset: _set,\n\t\tsetModuleId: _setModuleId,\n\t\ttype: _type,\n\t\tqueryParam,\n\t\tdisplayTime,\n\t\tcases: rawCases,\n\t\tallowedFileTypes: rawAllowedFileTypes,\n\t\tdisplayTextArea,\n\t\t...rest\n\t} = updates\n\t// The nullString sentinel means \"clear/unset\" \u2014 treat it as no initialValue for type conversion.\n\tconst initialValue = isNullString(rawInitialValue) ? undefined : rawInitialValue\n\n\tlet result: T = variable\n\n\tswitch (variable.type) {\n\t\tcase ControlType.String: {\n\t\t\tconst stringResult: StringVariableDefinition = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t}\n\t\t\tif (!isUndefined(initialValue)) {\n\t\t\t\tstringResult.initialValue = String(initialValue)\n\t\t\t}\n\t\t\tif (displayTextArea !== undefined) {\n\t\t\t\tstringResult.options = {\n\t\t\t\t\t...stringResult.options,\n\t\t\t\t\tdisplayTextArea: displayTextArea === \"true\" || displayTextArea === true,\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult = stringResult as T\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.Color:\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: String(initialValue) }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.RichText:\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: convertHTMLToCanvasRichText(String(initialValue)) }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Number:\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: Number(initialValue) }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Boolean:\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: initialValue === \"true\" }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Image:\n\t\tcase ControlType.Link:\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: String(initialValue) }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Date: {\n\t\t\tconst existingOptions = \"options\" in variable ? variable.options : undefined\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\t...(!isUndefined(initialValue) && { initialValue: String(initialValue) }),\n\t\t\t\t...(displayTime !== undefined && {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\t...existingOptions,\n\t\t\t\t\t\tdisplayTime: displayTime === \"true\" || displayTime === true,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.Enum: {\n\t\t\tconst cases = isUndefined(rawCases) ? variable.cases : updateEnumCases(rawCases, variable.cases, variable.name)\n\t\t\tconst nextInitialValue = isNullString(rawInitialValue)\n\t\t\t\t? undefined\n\t\t\t\t: getEnumInitialValue(initialValue ?? variable.initialValue, cases, variable.name)\n\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\tcases,\n\t\t\t\tinitialValue: nextInitialValue,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.File: {\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\tallowedFileTypes: isUndefined(rawAllowedFileTypes)\n\t\t\t\t\t? variable.allowedFileTypes\n\t\t\t\t\t: updateAllowedFileTypes(rawAllowedFileTypes, variable.allowedFileTypes, variable.name),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.CollectionReference: {\n\t\t\tassert(hasCollectionUpdateContext(ctx), \"Tree context is required for collection reference variable updates\")\n\t\t\tif (isUndefined(initialValue)) {\n\t\t\t\tresult = { ...variable, ...rest }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tassert(ctx?.treeStore && ctx.treeResolver, \"Tree store is required to update collection reference variables.\")\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\tinitialValue: getCollectionReferenceInitialValue(\n\t\t\t\t\tinitialValue,\n\t\t\t\t\tvariable.dataIdentifier,\n\t\t\t\t\tctx.treeStore,\n\t\t\t\t\tctx.treeResolver,\n\t\t\t\t),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tassert(\n\t\t\t\thasCollectionUpdateContext(ctx),\n\t\t\t\t\"Tree context is required for multi collection reference variable updates\",\n\t\t\t)\n\t\t\tif (isUndefined(initialValue)) {\n\t\t\t\tresult = { ...variable, ...rest }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tassert(\n\t\t\t\tctx?.treeStore && ctx.treeResolver,\n\t\t\t\t\"Tree store is required to update multi collection reference variables.\",\n\t\t\t)\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t\tinitialValue: getMultiCollectionReferenceInitialValue(\n\t\t\t\t\tinitialValue,\n\t\t\t\t\tvariable.dataIdentifier,\n\t\t\t\t\tctx.treeStore,\n\t\t\t\t\tctx.treeResolver,\n\t\t\t\t),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.VectorSetItem: {\n\t\t\tassert(\n\t\t\t\tisUndefined(updates.set),\n\t\t\t\t`Cannot update the set of icon variable \"${variable.name}\". Create a new icon variable instead.`,\n\t\t\t)\n\t\t\tassert(\n\t\t\t\tisUndefined(updates.setModuleId),\n\t\t\t\t`Cannot update the set of icon variable \"${variable.name}\". Create a new icon variable instead.`,\n\t\t\t)\n\n\t\t\tif (!isUndefined(updates.initialValue)) {\n\t\t\t\tassert(isString(updates.initialValue), `Icon variable \"${variable.name}\" requires an icon name string.`)\n\t\t\t\tassert(hasVectorSetsUpdateContext(ctx), \"Vector sets context is required to update icon variables.\")\n\n\t\t\t\tconst setHandle = await ctx.vectorSets.async.forModuleId(variable.setModuleId)\n\t\t\t\tassert(setHandle, `Could not resolve the icon set for variable \"${variable.name}\".`)\n\n\t\t\t\tconst variableInfo = await ctx.vectorSets.insertForVariable(setHandle.name, updates.initialValue)\n\t\t\t\tassert(variableInfo, `Icon \"${updates.initialValue}\" not found in set \"${setHandle.name}\".`)\n\n\t\t\t\tresult = {\n\t\t\t\t\t...variable,\n\t\t\t\t\t...rest,\n\t\t\t\t\tinitialValue: variableInfo.initialValue,\n\t\t\t\t\tsetModuleId: variableInfo.setModuleId,\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tresult = {\n\t\t\t\t...variable,\n\t\t\t\t...rest,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tresult = { ...variable, ...rest }\n\t}\n\n\tif (!isUndefined(queryParam)) {\n\t\taddQueryParam(nodeWithVariables, result, queryParam, onWarning)\n\t}\n\n\tif (!isUndefined(updates.initialValue)) {\n\t\tconst hasInitialValue = !isNullString(updates.initialValue)\n\t\tmaybeSetOptional(nodeWithVariables, result, hasInitialValue)\n\t}\n\n\treturn result\n}\n\nfunction createBaseVariable(\n\tattributes: NormalizedAddVariableAttributes,\n\tctx: AgentContext,\n\tonWarning: (message: string) => void,\n\tnodeWithVariables?: CanvasNode & WithVariables,\n): CreateVariableResult {\n\tconst { type, name, initialValue } = attributes\n\tconst hasInitialValue = !isUndefined(initialValue)\n\n\tconst base: BaseVariableAttributes = {\n\t\tid: randomID(),\n\t\tname: name ?? getFallbackNameForCreateVariableOptions({ type, expectedType: undefined }),\n\t\tdescription: attributes.description,\n\t}\n\n\tlet variable: CreateVariableResult | undefined\n\tswitch (type) {\n\t\tcase ControlType.String: {\n\t\t\tconst stringVariable: StringVariableDefinition = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: hasInitialValue ? String(initialValue) : \"\",\n\t\t\t}\n\t\t\tif (\"displayTextArea\" in attributes && attributes.displayTextArea === true) {\n\t\t\t\tstringVariable.options = { displayTextArea: true }\n\t\t\t}\n\t\t\tvariable = stringVariable\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.Color:\n\t\t\tvariable = { ...base, type, initialValue: String(initialValue) }\n\t\t\tbreak\n\t\tcase ControlType.RichText:\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: convertHTMLToCanvasRichText(hasInitialValue ? String(initialValue) : \"\"),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Number:\n\t\t\tvariable = { ...base, type, initialValue: hasInitialValue ? Number(initialValue) : 0 }\n\t\t\tbreak\n\t\tcase ControlType.Boolean:\n\t\t\tvariable = { ...base, type, initialValue: hasInitialValue ? initialValue === \"true\" : false }\n\t\t\tbreak\n\t\tcase ControlType.Image:\n\t\t\tvariable = { ...base, type, initialValue: hasInitialValue ? String(initialValue) : undefined }\n\t\t\tbreak\n\t\tcase ControlType.Link:\n\t\t\tvariable = { ...base, type, initialValue: hasInitialValue ? String(initialValue) : undefined }\n\t\t\tbreak\n\t\tcase ControlType.Date:\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: isUndefined(initialValue) ? undefined : String(initialValue),\n\t\t\t\t...(\"displayTime\" in attributes &&\n\t\t\t\t\tattributes.displayTime === true && {\n\t\t\t\t\t\toptions: { displayTime: true },\n\t\t\t\t\t}),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Enum: {\n\t\t\tassert(\"cases\" in attributes, `Enum variable \"${base.name}\" requires cases.`)\n\t\t\tconst cases = createEnumCases(attributes.cases, base.name)\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tcases,\n\t\t\t\tinitialValue: hasInitialValue ? getEnumInitialValue(initialValue, cases, base.name) : undefined,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.File: {\n\t\t\tassert(\"allowedFileTypes\" in attributes, `File variable \"${base.name}\" requires allowedFileTypes.`)\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: undefined,\n\t\t\t\tallowedFileTypes: createAllowedFileTypes(attributes.allowedFileTypes, base.name),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.EventHandler:\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: undefined,\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.Array:\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue: [],\n\t\t\t\titemVariables: [{ id: randomID(), type: ControlType.Image, name: Dictionary.Image, initialValue: undefined }],\n\t\t\t\t...(\"minCount\" in attributes && { minCount: attributes.minCount }),\n\t\t\t\t...(\"maxCount\" in attributes && { maxCount: attributes.maxCount }),\n\t\t\t}\n\t\t\tbreak\n\t\tcase ControlType.CollectionReference:\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tassert(\"collection\" in attributes && attributes.collection, `Unknown collection \"${attributes.collection}\"`)\n\n\t\t\tconst collectionId = ctx.collections.collectionIdFromName(attributes.collection)\n\t\t\tassert(collectionId, `Unknown collection \"${attributes.collection}\"`)\n\n\t\t\tconst dataIdentifier = localModuleIdentifierForStableName(ModuleType.Collection, collectionId, \"default\").value\n\n\t\t\tif (type === ControlType.CollectionReference) {\n\t\t\t\tvariable = {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype,\n\t\t\t\t\tdataIdentifier,\n\t\t\t\t\tinitialValue: getCollectionReferenceInitialValue(\n\t\t\t\t\t\tinitialValue,\n\t\t\t\t\t\tdataIdentifier,\n\t\t\t\t\t\tctx.treeStore,\n\t\t\t\t\t\tctx.treeResolver,\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvariable = {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype,\n\t\t\t\t\tdataIdentifier,\n\t\t\t\t\tinitialValue: getMultiCollectionReferenceInitialValue(\n\t\t\t\t\t\tinitialValue,\n\t\t\t\t\t\tdataIdentifier,\n\t\t\t\t\t\tctx.treeStore,\n\t\t\t\t\t\tctx.treeResolver,\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.VectorSetItem:\n\t\t\tvariable = {\n\t\t\t\t...base,\n\t\t\t\ttype,\n\t\t\t\tinitialValue,\n\t\t\t\tsetModuleId: attributes.setModuleId,\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n\tassert(variable, \"Variable must be defined\")\n\n\tconst supportsOptional = maybeSetOptional(nodeWithVariables, variable, hasInitialValue)\n\tconst supportsRequired = maybeSetRequiredOnCollections(nodeWithVariables, variable, hasInitialValue)\n\n\tassert(\n\t\tsupportsOptional || supportsRequired || hasInitialValue || variableTypesNotNeedingInitialValue.has(variable.type),\n\t\t`Initial value is required for variable of type \"${variable.type}\"`,\n\t)\n\n\tif (!isUndefined(attributes.queryParam)) {\n\t\taddQueryParam(nodeWithVariables, variable, attributes.queryParam, onWarning)\n\t}\n\n\treturn variable\n}\n\nfunction createEnumCases(rawCases: unknown, variableName: string): readonly EnumVariableCase[] {\n\treturn updateEnumCases(rawCases, [], variableName)\n}\n\nfunction createAllowedFileTypes(rawAllowedFileTypes: unknown, variableName: string): FileVariableExtension[] {\n\treturn updateAllowedFileTypes(rawAllowedFileTypes, [], variableName)\n}\n\nfunction updateEnumCases(\n\trawCases: unknown,\n\texistingCases: readonly EnumVariableCase[],\n\tvariableName: string,\n): readonly EnumVariableCase[] {\n\tassert(\n\t\tisArray(rawCases) && rawCases.every(item => isString(item) || isUndefined(item)),\n\t\t`Option variable \"${variableName}\" requires an array of string cases.`,\n\t)\n\n\tconst cases = applyArrayAttributePatch({\n\t\tcurrentItems: existingCases,\n\t\tpatch: rawCases,\n\t\tparsePatchItem: (value, index): EnumVariableCase[] | undefined => {\n\t\t\tconst current = existingCases[index]\n\n\t\t\tif (current && current.name === value) return [current]\n\n\t\t\tif (isString(value)) {\n\t\t\t\treturn [{ id: existingCases.find(enumCase => enumCase.name === value)?.id ?? randomID(), name: value }]\n\t\t\t}\n\n\t\t\treturn undefined\n\t\t},\n\t})\n\treturn cases?.filter(isDefined) ?? existingCases\n}\n\nfunction getEnumInitialValue(\n\trawInitialValue: unknown,\n\tcases: readonly EnumVariableCase[],\n\tvariableName: string,\n): string {\n\tassert(isString(rawInitialValue), `Option variable \"${variableName}\" requires a string initialValue.`)\n\tconst enumCase = getEnumCaseForValue(rawInitialValue, cases)\n\tassertEnumCaseForValue(rawInitialValue, enumCase, cases, variableName)\n\treturn enumCase.id\n}\n\nfunction updateAllowedFileTypes(\n\trawAllowedFileTypes: unknown,\n\texistingFileTypes: readonly FileVariableExtension[],\n\tvariableName: string,\n): FileVariableExtension[] {\n\tassert(\n\t\tisArray(rawAllowedFileTypes) && rawAllowedFileTypes.every(item => isString(item) || isUndefined(item)),\n\t\t`File variable \"${variableName}\" requires an array of string allowedFileTypes.`,\n\t)\n\n\tconst allowedFileTypes = applyArrayAttributePatch({\n\t\tcurrentItems: existingFileTypes,\n\t\tpatch: rawAllowedFileTypes,\n\t\tparsePatchItem: (extension, index): FileVariableExtension[] | undefined => {\n\t\t\tconst current = existingFileTypes[index]\n\n\t\t\tif (current && current.extension === extension) return [current]\n\n\t\t\tif (isString(extension)) {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: existingFileTypes.find(fileType => fileType.extension === extension)?.id ?? randomID(),\n\t\t\t\t\t\textension,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t}\n\n\t\t\treturn undefined\n\t\t},\n\t})\n\treturn allowedFileTypes?.filter(isDefined) ?? [...existingFileTypes]\n}\n\nfunction getEnumCaseForValue(value: string, cases: readonly EnumVariableCase[]): EnumVariableCase | undefined {\n\treturn cases.find(enumCase => enumCase.id === value || enumCase.name === value)\n}\n\nfunction assertEnumCaseForValue(\n\tvalue: string,\n\tenumCase: EnumVariableCase | undefined,\n\tcases: readonly EnumVariableCase[],\n\tvariableName: string,\n): asserts enumCase is EnumVariableCase {\n\tassert(\n\t\tenumCase,\n\t\t`Initial value \"${value}\" is not a case of enum variable \"${variableName}\". Expected one of: ${cases.map(enumCase => `\"${enumCase.name}\"`).join(\", \")}.`,\n\t)\n}\n\nfunction maybeSetOptional(\n\tnodeWithVariables: (CanvasNode & WithVariables) | undefined,\n\tvariable: VariableOrDivider,\n\thasInitialValue: boolean,\n): boolean {\n\tif (!nodeWithVariables) return false\n\tif (!isScopeNode(nodeWithVariables, true)) return false\n\n\tconst scopeType = getScopeTypeForScope(nodeWithVariables)\n\tif (!withOptional(variable, scopeType)) return false\n\n\tvariable.optional = !hasInitialValue\n\treturn true\n}\n\nfunction maybeSetRequiredOnCollections(\n\tnodeWithVariables: (CanvasNode & WithVariables) | undefined,\n\tvariable: CreateVariableResult,\n\thasInitialValue: boolean,\n): boolean {\n\tif (!nodeWithVariables || !isCollectionNode(nodeWithVariables) || !withRequired(variable)) return false\n\n\tvariable.required = !hasInitialValue\n\treturn true\n}\n\nfunction addQueryParam(\n\tnodeWithVariables: (CanvasNode & WithVariables) | undefined,\n\tvariable: VariableOrDivider,\n\tqueryParam: string,\n\tonWarning: (message: string) => void,\n) {\n\tif (queryParam === \"\") {\n\t\tonWarning(\"queryParam cannot be empty\")\n\t\treturn\n\t}\n\n\tif (!nodeWithVariables || !isWebPageNode(nodeWithVariables, true)) {\n\t\tonWarning(\"queryParam can only be set on WebPage variables\")\n\t\treturn\n\t}\n\n\tif (!withQueryParam(variable)) {\n\t\tonWarning(`queryParam is not supported for ${variable.type} variables`)\n\t\treturn\n\t}\n\n\tvariable.queryParam = queryParam\n}\n\nfunction createSlugVariable(\n\tscopeNode: CanvasNode & WithVariables,\n\tvariable: CreateVariableResult,\n): SlugVariableDefinition | undefined {\n\tif (\n\t\t!isCollectionNode(scopeNode) ||\n\t\tvariable.type !== ControlType.String ||\n\t\tscopeNode.variables.some(isSlugVariableDefinition)\n\t) {\n\t\treturn\n\t}\n\n\treturn {\n\t\tid: randomID(),\n\t\tname: Dictionary.Slug,\n\t\ttype: \"slug\",\n\t\tinitialValue: \"\",\n\t\tassociatedStringVariable: variable.id,\n\t}\n}\n\nasync function normalizeImageVariableAttributes(\n\tattributes: Exclude<AddVariableAttributes, { type: typeof IconVariableType }>,\n\tctx: Pick<AgentContext, \"files\">,\n): Promise<Exclude<AddVariableAttributes, { type: typeof IconVariableType }>> {\n\tif (attributes.type !== ControlType.Image) return attributes\n\tif (!isString(attributes.initialValue) || !isValidURL(attributes.initialValue)) return attributes\n\n\tconst mediaType = getMediaTypeFromURL(attributes.initialValue)\n\tif (mediaType && !isCompatibleFileType(mediaType, imageAllowedFileTypes)) {\n\t\tthrow new Error(disallowedFileTypeMessage(attributes.initialValue, imageAllowedFileTypes, mediaType))\n\t}\n\tif (!ctx.files.isTrustedUrl(attributes.initialValue)) {\n\t\tthrow new Error(untrustedUrlMessage(attributes.initialValue))\n\t}\n\n\tconst assetReference = await ctx.files.forUrl(attributes.initialValue, { linkToProject: true })\n\tif (!assetReference) return attributes\n\n\treturn { ...attributes, initialValue: assetReference }\n}\n\nasync function normalizeIconVariableAttributes(\n\tattributes: AddVariableAttributes,\n\tctx: Pick<AgentContext, \"files\" | \"vectorSets\">,\n): Promise<NormalizedAddVariableAttributes> {\n\tif (attributes.type !== IconVariableType) return normalizeImageVariableAttributes(attributes, ctx)\n\n\tconst resolved = await ctx.vectorSets.insertForVariable(attributes.set, attributes.initialValue)\n\tassert(resolved, `Icon \"${attributes.initialValue}\" not found in set \"${attributes.set}\".`)\n\n\tconst { type: _type, set: _set, ...rest } = attributes\n\treturn {\n\t\t...rest,\n\t\ttype: ControlType.VectorSetItem,\n\t\tinitialValue: resolved.initialValue,\n\t\tsetModuleId: resolved.setModuleId,\n\t}\n}\n\nfunction getCollectionReferenceInitialValue(\n\trawInitialValue: unknown,\n\tdataIdentifier: ModuleExportIdentifierString,\n\ttreeStore: TreeStore,\n\ttreeResolver: Pick<TreeResolver, \"get\">,\n) {\n\tif (isUndefined(rawInitialValue)) return undefined\n\n\tconst rawId = String(rawInitialValue)\n\tconst resolved = treeResolver.get(rawId)\n\tconst parsedValue = resolved ? resolved.id : rawId\n\n\tassertReferencedItemsExist(treeStore, dataIdentifier, [parsedValue])\n\treturn parsedValue\n}\n\nconst multiCollectionReferenceValueError = `Initial value for ${ControlType.MultiCollectionReference} must be a JSON array of item IDs`\n\nfunction getMultiCollectionReferenceInitialValue(\n\tinitialValue: unknown,\n\tdataIdentifier: ModuleExportIdentifierString,\n\ttreeStore: TreeStore,\n\ttreeResolver: Pick<TreeResolver, \"get\">,\n) {\n\tif (isUndefined(initialValue)) return []\n\n\tassert(isArray(initialValue) && initialValue.every(isString), multiCollectionReferenceValueError)\n\n\tconst resolvedIds = initialValue.map(id => {\n\t\tconst resolved = treeResolver.get(id)\n\t\treturn resolved ? resolved.id : id\n\t})\n\n\tassertReferencedItemsExist(treeStore, dataIdentifier, resolvedIds)\n\treturn resolvedIds\n}\n\nfunction assertReferencedItemsExist(\n\ttreeStore: TreeStore,\n\tdataIdentifier: ModuleExportIdentifierString,\n\titemIds: readonly string[],\n) {\n\tconst collectionNode = getCollectionForIdentifier(treeStore.tree, dataIdentifier)\n\tassert(collectionNode, `Cannot find collection for ${dataIdentifier}`)\n\n\tfor (const itemId of itemIds) {\n\t\tassert(\n\t\t\tcollectionHasItemWithId(treeStore.tree, collectionNode.instanceIdentifier, itemId),\n\t\t\t`Referenced collection item \"${itemId}\" does not exist in collection \"${collectionNode.resolveValue(\"name\")}\"`,\n\t\t)\n\t}\n}\n\nexport async function createVariable(\n\tattributes: AddVariableAttributes,\n\tctx: AgentContext,\n\toptions: CreateVariableInScopeOptions,\n): Promise<CreateVariableInScopeResult> {\n\tif (attributes.type === ControlType.EventHandler) {\n\t\tassert(\n\t\t\tisSmartComponentNode(options.scopeNode),\n\t\t\t`EventHandler variables can only be created on ${ComponentNodeClass} scopes.`,\n\t\t)\n\t}\n\n\tconst variable = createBaseVariable(\n\t\tawait normalizeIconVariableAttributes(attributes, ctx),\n\t\tctx,\n\t\toptions.onWarning,\n\t\toptions.scopeNode,\n\t)\n\n\tconst { llmId, scopeNode } = options\n\tctx.dynamicValues.add(scopeNode.id, llmId, variable)\n\n\tif (isSmartComponentNode(scopeNode)) {\n\t\tawait ctx.components.upsertVariable(scopeNode.instanceIdentifier, variable, llmId)\n\t}\n\tif (isCollectionNode(scopeNode)) {\n\t\tctx.collections.upsertVariable(scopeNode.id, variable, llmId)\n\t}\n\n\tconst slugVariable = createSlugVariable(scopeNode, variable)\n\treturn { variable, slugVariable }\n}\n", "import { assert, assertNever, isModuleExportIdentifier } from \"@framerjs/shared\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport {\n\tcreateMediaBlock,\n\tcreateRichTextBlockquote,\n\tcreateRichTextBulletList,\n\tcreateRichTextLineBreak,\n\tcreateRichTextListItem,\n\tcreateRichTextNumberedList,\n\tcreateRichTextTable,\n\tcreateRichTextTableCell,\n\tcreateRichTextTableRow,\n\tcreateRichTextTextComponentInstance,\n\tcreateRichTextTextBlock,\n\tcreateRichTextTextRun,\n\ttype VirtualRichTextNode,\n} from \"./context/richtext/document.ts\"\nimport { isInsertableVirtualNodeClass, type AddCommandAttributes, type InsertableVirtualNodeClass } from \"./dsl.ts\"\nimport { TextBlockquoteClass, TextTableCellClass, TextTableClass, TextTableRowClass } from \"./dsl.ts\"\n\ntype AddVirtualNodeCommandAttributes = Extract<AddCommandAttributes, { node: InsertableVirtualNodeClass }>\n\nexport async function createVirtualNode(\n\tattributes: AddVirtualNodeCommandAttributes,\n\tctx: AgentContext,\n): Promise<VirtualRichTextNode> {\n\tswitch (attributes.node) {\n\t\tcase \"TextBlock\": {\n\t\t\tconst tag = attributes.tag ?? undefined\n\t\t\treturn createRichTextTextBlock(attributes.id, tag)\n\t\t}\n\t\tcase TextBlockquoteClass: {\n\t\t\treturn createRichTextBlockquote(attributes.id)\n\t\t}\n\t\tcase TextTableClass: {\n\t\t\treturn createRichTextTable(attributes.id)\n\t\t}\n\t\tcase TextTableRowClass: {\n\t\t\treturn createRichTextTableRow(attributes.id)\n\t\t}\n\t\tcase TextTableCellClass: {\n\t\t\treturn createRichTextTableCell(attributes.id, attributes.cellType ?? \"cell\")\n\t\t}\n\t\tcase \"TextBulletList\": {\n\t\t\treturn createRichTextBulletList(attributes.id)\n\t\t}\n\t\tcase \"TextNumberedList\": {\n\t\t\treturn createRichTextNumberedList(attributes.id)\n\t\t}\n\t\tcase \"TextListItem\": {\n\t\t\treturn createRichTextListItem(attributes.id)\n\t\t}\n\t\tcase \"TextLineBreak\":\n\t\t\treturn createRichTextLineBreak(attributes.id)\n\t\tcase \"TextMediaBlock\": {\n\t\t\treturn createMediaBlock(attributes.id)\n\t\t}\n\t\tcase \"TextComponentInstance\": {\n\t\t\tconst { component } = attributes\n\t\t\tassert(component, \"Component is required for TextComponentInstance\")\n\n\t\t\tconst identifier = isModuleExportIdentifier(component) ? component : await ctx.components.insert(component)\n\t\t\tassert(identifier, `Component \"${component}\" not found`)\n\n\t\t\treturn createRichTextTextComponentInstance(attributes.id, identifier)\n\t\t}\n\t\tcase \"TextRun\":\n\t\t\treturn createRichTextTextRun(attributes.id)\n\t\tdefault: {\n\t\t\tassertNever(attributes)\n\t\t}\n\t}\n}\n\nexport function isVirtualNodeCommand(\n\tcommand: AddCommandAttributes,\n): command is Extract<AddCommandAttributes, { node: InsertableVirtualNodeClass }> {\n\treturn isInsertableVirtualNodeClass(command.node)\n}\n", "/**\n * Helper to catch errors from operations and defer throwing them until a future point.\n */\nexport function createDeferredThrower() {\n\tlet error: Error | undefined\n\n\treturn {\n\t\trun(fn: VoidFunction) {\n\t\t\ttry {\n\t\t\t\tfn()\n\t\t\t} catch (caught) {\n\t\t\t\tif (!error) {\n\t\t\t\t\terror = caught instanceof Error ? caught : new Error(\"Unknown error in deferred thrower\", { cause: caught })\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tthrowIfAny() {\n\t\t\tif (error) throw error\n\t\t},\n\t}\n}\n", "import { List, assertNever, isModuleExportIdentifier } from \"@framerjs/shared\"\nimport { unflatten } from \"app/ai/utils/flatten.ts\"\nimport { duplicateWebPage } from \"document/components/chrome/Pages/utils/duplicatePage.ts\"\nimport { getTakenSlugs } from \"document/components/chrome/contentManagement/useTakenSlugs.ts\"\nimport { createContentManagementNodeIfNeeded } from \"document/components/chrome/contentManagement/utils/createContentManagementNodeIfNeeded.ts\"\nimport { maybeAutoGenerateSlugForCollectionItem } from \"document/components/chrome/contentManagement/utils/maybeAutoGenerateSlugForCollectionItem.ts\"\nimport { createVariableWithTree } from \"document/components/chrome/properties/utils/createVariableInScope.ts\"\nimport { duplicateLayoutTemplateNode } from \"document/components/chrome/shared/utils/duplicateLayoutTemplate.ts\"\nimport { bottomSideOf, rightSideOf } from \"document/components/tools/utils/FramesHelper.ts\"\nimport { RenamedIds } from \"document/components/tools/utils/updateNodeConnections.ts\"\nimport { cloneScopeNodeWithVariants } from \"document/components/unlinking/importExternalSmartComponentOrWebpage.ts\"\nimport { ContextAction } from \"document/components/utils/contextActions.ts\"\nimport {\n\ttype CanvasNode,\n\ttype CollectionItemNode,\n\ttype ScopeNode,\n\tisScopeNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport {\n\tisCollectionItemNode,\n\tisCollectionNode,\n\tisColorStyleTokenNode,\n\tisComponentPresetNode,\n\tisFrameNode,\n\tisLayoutTemplateNode,\n\tisRichTextNode,\n\tisSmartComponentNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { scopeSupportsOverlays } from \"document/models/CanvasTree/nodes/utils/overlayHelpers.ts\"\nimport { isCollectionVariableDefinitionOrDivider } from \"document/models/CanvasTree/traits/CollectionVariableDefinition.ts\"\nimport { withChildren } from \"document/models/CanvasTree/traits/WithChildren.ts\"\nimport { hasAnyLayout, withLayout } from \"document/models/CanvasTree/traits/WithLayout.ts\"\nimport { withReplicaVariants } from \"document/models/CanvasTree/traits/WithReplicaVariants.ts\"\nimport type { Loaded } from \"document/models/CanvasTree/traits/WithScopeLoader.ts\"\nimport { isReplica, isReplicaChild, isReplicaOrReplicaChild } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport {\n\tisVariableDefinition,\n\twithVariables,\n\ttype VariableOrDivider,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { isBreakpointVariant, isTopLevelVariant, isVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { acceptsChild } from \"document/models/CanvasTree/traits/utils/acceptsChild.ts\"\nimport { containsPrefixedControlProp } from \"document/models/controlProps/controlPropKey.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport {\n\tisReorderableReplicaParent,\n\tisSortableNode,\n\tupdateIdIndexInItemsOrder,\n} from \"document/utils/itemsOrderOverrideHelpers.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { RejectedCommandError, RejectedCommandKind } from \"./RejectedCommandError.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { isVariableReferenceHandleToCollectionItemId, isVariableReferenceHandle } from \"./context/dynamicValues.ts\"\nimport { applyVirtualTextTarget } from \"./context/richtext/apply.ts\"\nimport {\n\ttype RichTextTarget,\n\tisVirtualRichTextUnsupported,\n\tisVirtualRichTextLineBreak,\n\tisVirtualNodeId,\n} from \"./context/richtext/document.ts\"\nimport { resolveSubtreeTransferHandle, resolveRichTextDestination } from \"./context/richtext/richTextDestination.ts\"\nimport { resolveRichTextTargetHandle } from \"./context/richtext/targets.ts\"\nimport { isAgentSupportedStylePresetNode } from \"./context/stylePresetType.ts\"\nimport { createNode, isAllowedNodeClass } from \"./createNode.ts\"\nimport { createVariable, updateVariable } from \"./createVariable.ts\"\nimport { createVirtualNode, isVirtualNodeCommand } from \"./createVirtualNode.ts\"\nimport { createDeferredThrower } from \"./defferedThrower.ts\"\nimport type {\n\tAddCommandAttributes,\n\tAddVariableAttributes,\n\tAddVariableCommandAttributes,\n\tCommand,\n\tUpdateCommandAttributes,\n} from \"./dsl.ts\"\nimport {\n\tCollectionReferenceVariableAliasNodeClass,\n\tCommandType,\n\tDateVariableAliasNodeClass,\n\tOptionVariableAliasNodeClass,\n\tEventHandlerVariableAliasNodeClass,\n\tFileVariableAliasNodeClass,\n\tFixedOverlayNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tIconVariableAliasNodeClass,\n\tIconVariableType,\n\tisAddVariableCommandAttributes,\n\tLinkVariableAliasNodeClass,\n\tshouldInsertNodeImmediately,\n\tVariableNodeClass,\n} from \"./dsl.ts\"\nimport { fromAttributes } from \"./traits/attributes.ts\"\nimport { resolveControlProps } from \"./traits/controls.ts\"\nimport { nullString } from \"./traits/helpers.ts\"\nimport type { DSLAttributes } from \"./traits/types.ts\"\nimport { fromVirtualNodeAttributes } from \"./traits/virtualAttributes.ts\"\n\nexport function createProcessCommand(\n\ttreeStore: TreeStore,\n\tinsertionScopeNode: Loaded<ScopeNode>,\n\tctx: AgentContext,\n\tupdate: (fn: VoidFunction, raw: string) => Promise<void>,\n): (command: Command, raw: string) => Promise<void> {\n\treturn async (command: Command, raw: string) => {\n\t\tconst scheduleUpdate = (fn: VoidFunction) => update(fn, raw)\n\t\tawait ctx.deferred.processPendingCodeGenerations(\n\t\t\tcommand,\n\t\t\tid => ctx.treeResolver.getScopeNodeFor(id)?.id,\n\t\t\tctx.dynamicValues,\n\t\t)\n\n\t\tswitch (command.type) {\n\t\t\tcase CommandType.Add: {\n\t\t\t\tconst { id, position, parent } = command.attributes\n\t\t\t\tassertCreatableId(id)\n\t\t\t\tassert(!isRootNodeReference(ctx, id), RejectedCommandKind.AddCanvasRoot)\n\t\t\t\tassert(!ctx.treeResolver.get(id), RejectedCommandKind.AddExistingNodeId)\n\t\t\t\tassert(!ctx.virtualText.has(id), RejectedCommandKind.AddExistingNodeId)\n\t\t\t\tassert(parent !== id, RejectedCommandKind.ParentNodeToItself)\n\n\t\t\t\tif (isAddVariableCommandAttributes(command.attributes)) {\n\t\t\t\t\treturn handleVariableAdd(normalizeVariableAlias(command.attributes), ctx, scheduleUpdate, raw)\n\t\t\t\t}\n\n\t\t\t\tconst { node: nodeClass } = command.attributes\n\n\t\t\t\tif (isVirtualNodeCommand(command.attributes)) {\n\t\t\t\t\tassert(command.attributes.parent, RejectedCommandKind.ParentAttributeMustBeString)\n\n\t\t\t\t\tconst destination = resolveRichTextDestination(command.attributes.node, command.attributes.parent, ctx)\n\t\t\t\t\tconst target = ctx.virtualText.getTarget(destination)\n\t\t\t\t\tconst virtualNode = await createVirtualNode(command.attributes, ctx)\n\t\t\t\t\tawait ctx.nodeAttributeChanges.captureVirtualNodeInsert(target, virtualNode.id)\n\n\t\t\t\t\tctx.virtualText.insert(virtualNode, destination, command.attributes.position)\n\n\t\t\t\t\tif (isVirtualRichTextLineBreak(virtualNode)) {\n\t\t\t\t\t\tassert(target, RejectedCommandKind.LineBreakTargetRequired)\n\t\t\t\t\t\treturn applyVirtualText(ctx, scheduleUpdate, target)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tassert(\n\t\t\t\t\tisKnownParent(ctx, command.attributes),\n\t\t\t\t\tRejectedCommandKind.AddUnknownParent,\n\t\t\t\t\t`Cannot add \"${id}\" to unknown parent \"${parent}\"`,\n\t\t\t\t)\n\t\t\t\tassert(\n\t\t\t\t\tparentAcceptsChildren(ctx, command.attributes),\n\t\t\t\t\tRejectedCommandKind.ParentDoesNotAcceptChildren,\n\t\t\t\t\t`Cannot add \"${id}\" to \"${parent}\" because it does not accept children`,\n\t\t\t\t)\n\t\t\t\tassert(\n\t\t\t\t\tisAllowedNodeClass(command.attributes),\n\t\t\t\t\tRejectedCommandKind.InvalidNodeClass,\n\t\t\t\t\t`Invalid node class \"${command.attributes.node}\"`,\n\t\t\t\t)\n\n\t\t\t\tconst node = await createNode(command.attributes, ctx)\n\t\t\t\tctx.nodeAttributeChanges.captureInsertedNode(node)\n\n\t\t\t\tassert(\n\t\t\t\t\tnodeClass !== FixedOverlayNodeClass || fixedOverlayAllowedInParentScope(ctx, command.attributes),\n\t\t\t\t\tRejectedCommandKind.FixedOverlayInSmartComponent,\n\t\t\t\t)\n\n\t\t\t\t// Most nodes are not inserted immediately, instead after the first SET command.\n\t\t\t\tif (!shouldInsertNodeImmediately(nodeClass)) {\n\t\t\t\t\treturn ctx.treeResolver.scheduleInsertion(id, node, command.attributes)\n\t\t\t\t}\n\n\t\t\t\tswitch (nodeClass) {\n\t\t\t\t\tcase ClassDiscriminator.RichTextNode:\n\t\t\t\t\tcase ClassDiscriminator.CollectionItemNode: {\n\t\t\t\t\t\treturn ctx.treeResolver.insert(scheduleUpdate, id, node, command.attributes)\n\t\t\t\t\t}\n\t\t\t\t\tcase ClassDiscriminator.CollectionNode: {\n\t\t\t\t\t\treturn ctx.treeResolver.insertWithCallback(scheduleUpdate, id, () => {\n\t\t\t\t\t\t\tconst contentManagementNode = createContentManagementNodeIfNeeded(treeStore.tree)\n\t\t\t\t\t\t\treturn ctx.treeResolver.getLookupTree().insertNode(node, contentManagementNode.id, position)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tcase ClassDiscriminator.DesignPageNode: {\n\t\t\t\t\t\treturn ctx.treeResolver.insertWithCallback(scheduleUpdate, id, () => {\n\t\t\t\t\t\t\treturn ctx.treeResolver.getLookupTree().insertNode(node)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(nodeClass)\n\t\t\t\t}\n\n\t\t\t\t// Unnecessary break to satisfy the linter which is struggling. Prefer dead code\n\t\t\t\t// than disabling the entire lint rule on this case which is likely to allow bugs to\n\t\t\t\t// slip through.\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase CommandType.Update: {\n\t\t\t\twarnForImmutableSetAttributes(command.attributes, ctx, raw)\n\n\t\t\t\tconst dynamicValueHandle = ctx.dynamicValues.getVariableReferenceHandleByVariableId(command.attributes.id)\n\t\t\t\tif (isVariableReferenceHandle(dynamicValueHandle)) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!isVariableReferenceHandleToCollectionItemId(dynamicValueHandle),\n\t\t\t\t\t\tRejectedCommandKind.CollectionItemIdReadOnly,\n\t\t\t\t\t)\n\n\t\t\t\t\tconst scopeNode = ctx.treeResolver.get(dynamicValueHandle.scopeId)\n\t\t\t\t\tassert(scopeNode && withVariables(scopeNode), RejectedCommandKind.ScopeMustSupportVariables)\n\n\t\t\t\t\tconst updatedVariable = await updateVariable(\n\t\t\t\t\t\tdynamicValueHandle.variable,\n\t\t\t\t\t\tprepareUpdateCommandAttributes(dynamicValueHandle.variable.type, command.attributes),\n\t\t\t\t\t\tscopeNode,\n\t\t\t\t\t\tmessage => ctx.issues.warning(raw, { queryParam: message }, { nodeIds: [scopeNode.id] }),\n\t\t\t\t\t\tctx,\n\t\t\t\t\t)\n\t\t\t\t\tassert(isVariableDefinition(updatedVariable), RejectedCommandKind.UpdatedVariableRequired)\n\n\t\t\t\t\tif (isSmartComponentNode(scopeNode)) {\n\t\t\t\t\t\tawait ctx.components.upsertVariable(scopeNode.instanceIdentifier, updatedVariable, command.attributes.id)\n\t\t\t\t\t}\n\t\t\t\t\tif (isCollectionNode(scopeNode)) {\n\t\t\t\t\t\tctx.collections.upsertVariable(scopeNode.id, updatedVariable, command.attributes.id)\n\t\t\t\t\t\tctx.collections.registerVariables(scopeNode.id)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.dynamicValues.replaceNodeVariables(scopeNode)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.treeResolver.update(scheduleUpdate, scopeNode.id, () => {\n\t\t\t\t\t\tconst current = ctx.treeResolver.current(scopeNode)\n\t\t\t\t\t\tassert(current, RejectedCommandKind.ScopeMustBePresentInTree)\n\n\t\t\t\t\t\tconst variables = current.variables.map(v =>\n\t\t\t\t\t\t\tv.id === dynamicValueHandle.variable.id ? updatedVariable : v,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (isCollectionNode(current)) {\n\t\t\t\t\t\t\tcurrent.set({\n\t\t\t\t\t\t\t\tvariables: variables.filter(isCollectionVariableDefinitionOrDivider),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrent.set({ variables })\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst resolvedVirtualUpdateId = ctx.treeResolver.resolveVirtualId(command.attributes.id)\n\t\t\t\tconst virtualNode = ctx.virtualText.resolve(resolvedVirtualUpdateId)\n\t\t\t\tif (virtualNode) {\n\t\t\t\t\tif (isVirtualRichTextLineBreak(virtualNode)) return\n\t\t\t\t\tassert(!isVirtualRichTextUnsupported(virtualNode), RejectedCommandKind.UnsupportedVirtualNodeNotEditable)\n\n\t\t\t\t\tconst target = ctx.virtualText.getTarget(virtualNode)\n\t\t\t\t\tawait ctx.nodeAttributeChanges.captureBeforeVirtualNodeUpdate(target, virtualNode)\n\n\t\t\t\t\tif (isString(command.attributes.text)) {\n\t\t\t\t\t\tconst isVariableReference = ctx.dynamicValues.getVariableReferenceHandleByVariableId(\n\t\t\t\t\t\t\tcommand.attributes.text,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tassert(!isVariableReference, RejectedCommandKind.VirtualTextNodeVariableReferenceNotAllowed)\n\t\t\t\t\t}\n\t\t\t\t\tfromVirtualNodeAttributes(virtualNode, command.attributes, ctx, raw)\n\t\t\t\t\tawait ctx.nodeAttributeChanges.recordAppliedVirtualNodeAttributes(target, virtualNode.id, command.attributes)\n\t\t\t\t\treturn applyVirtualText(ctx, scheduleUpdate, target)\n\t\t\t\t}\n\n\t\t\t\tconst node = ctx.treeResolver.get(command.attributes.id)\n\t\t\t\tassert(node, RejectedCommandKind.UpdateUnknownNode, `Cannot update unknown node \"${command.attributes.id}\"`)\n\n\t\t\t\tawait ensureComponentPresetControlsLoaded(node, command.attributes, ctx)\n\n\t\t\t\tawait ctx.nodeAttributeChanges.captureNodeBeforeUpdate(node)\n\n\t\t\t\tif (treeStore.getDataTreeOrPartialTree().has(node.id)) {\n\t\t\t\t\tawait ctx.treeResolver.update(scheduleUpdate, node.id, () => {\n\t\t\t\t\t\tconst current = ctx.treeResolver.current(node)\n\t\t\t\t\t\tassert(current, RejectedCommandKind.NodeMustBePresentInTree)\n\t\t\t\t\t\tfromAttributes(current, command.attributes, ctx, raw)\n\n\t\t\t\t\t\tconst updatedNode = ctx.treeResolver.current(node)\n\t\t\t\t\t\tif (isRichTextNode(updatedNode) && ctx.virtualText.getDocument(updatedNode.id)) {\n\t\t\t\t\t\t\tctx.virtualText.apply(updatedNode)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isCollectionItemNode(updatedNode)) {\n\t\t\t\t\t\t\tensureSlug(updatedNode, command.attributes, ctx)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tconst updatedNode = ctx.treeResolver.get(command.attributes.id)\n\t\t\t\t\tif (updatedNode) {\n\t\t\t\t\t\t// Existing preset updates can change lookup fields like `name`; refresh the cached\n\t\t\t\t\t\t// style preset definition.\n\t\t\t\t\t\tif (isAgentSupportedStylePresetNode(updatedNode)) {\n\t\t\t\t\t\t\tawait ctx.stylePresets.add(updatedNode, ctx)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait ctx.nodeAttributeChanges.recordAppliedNodeAttributes(updatedNode, command.attributes)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Replica scopes (WebPageNode, LayoutTemplateNode, SmartComponentNode) are\n\t\t\t\t// only inserted once their primary FrameNode child receives a SET. Apply\n\t\t\t\t// scope-level SETs to the pending node until then, otherwise the scope would\n\t\t\t\t// be inserted bare, with no primary breakpoint and in the wrong place.\n\t\t\t\tif (withReplicaVariants(node) && !node.baseVariantId) {\n\t\t\t\t\tawait scheduleUpdate(() => {\n\t\t\t\t\t\tfromAttributes(node, command.attributes, ctx, raw)\n\t\t\t\t\t})\n\t\t\t\t\tawait ctx.nodeAttributeChanges.recordAppliedNodeAttributes(node, command.attributes)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst pendingParent = ctx.treeResolver.getParentNode(node)\n\t\t\t\tconst pendingParentInserted = pendingParent ? treeStore.getDataTreeOrPartialTree().has(pendingParent.id) : true\n\t\t\t\tconst canInsertIntoDeferredScopeParent = pendingParent ? isScopeNode(pendingParent) : false\n\t\t\t\tassert(\n\t\t\t\t\tpendingParentInserted || canInsertIntoDeferredScopeParent,\n\t\t\t\t\tRejectedCommandKind.UpdateParentNotInsertedYet,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ cause: { nodeId: node.id, pendingParentId: pendingParent?.id } },\n\t\t\t\t)\n\n\t\t\t\tconst isInsertingIntoLayoutlessBreakpoint =\n\t\t\t\t\tpendingParent &&\n\t\t\t\t\tisBreakpointVariant(pendingParent) &&\n\t\t\t\t\twithLayout(pendingParent) &&\n\t\t\t\t\t!hasAnyLayout(pendingParent) &&\n\t\t\t\t\t!hasExplicitInsetPlacement(command.attributes)\n\t\t\t\tassert(!isInsertingIntoLayoutlessBreakpoint, RejectedCommandKind.InsertIntoLayoutlessBreakpoint)\n\n\t\t\t\t// Captured inside the sync insertOnFirstUpdate callback and awaited below so the\n\t\t\t\t// LockQueue can't start the next command until the preset is registered.\n\t\t\t\tlet stylePresetsPromise: Promise<void> | undefined\n\n\t\t\t\tconst operationWithError = createDeferredThrower()\n\n\t\t\t\tawait ensureComponentPresetControlsLoaded(node, command.attributes, ctx)\n\n\t\t\t\tawait ctx.treeResolver.insertOnFirstUpdate(scheduleUpdate, command.attributes.id, current => {\n\t\t\t\t\toperationWithError.run(() => fromAttributes(current, command.attributes, ctx, raw))\n\n\t\t\t\t\tif (isAgentSupportedStylePresetNode(current)) {\n\t\t\t\t\t\tstylePresetsPromise = ctx.stylePresets.add(current, ctx)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tawait stylePresetsPromise\n\t\t\t\toperationWithError.throwIfAny()\n\n\t\t\t\tconst insertedNode = ctx.treeResolver.get(node.id)\n\t\t\t\tif (insertedNode) {\n\t\t\t\t\tawait ctx.nodeAttributeChanges.recordAppliedNodeAttributes(insertedNode, command.attributes)\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase CommandType.Remove: {\n\t\t\t\tconst dynamicValueToRemove = ctx.dynamicValues.getVariableReferenceHandleByVariableId(command.attributes.id)\n\t\t\t\tif (isVariableReferenceHandle(dynamicValueToRemove)) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!isVariableReferenceHandleToCollectionItemId(dynamicValueToRemove),\n\t\t\t\t\t\tRejectedCommandKind.CollectionItemIdReadOnly,\n\t\t\t\t\t)\n\n\t\t\t\t\tconst variableId = dynamicValueToRemove.variable.id\n\t\t\t\t\tctx.dynamicValues.remove(variableId)\n\n\t\t\t\t\tconst scopeNode = ctx.treeResolver.get(dynamicValueToRemove.scopeId)\n\t\t\t\t\tassert(scopeNode && withVariables(scopeNode), RejectedCommandKind.ScopeMustSupportVariables)\n\n\t\t\t\t\t// Also remove from the components context\n\t\t\t\t\tif (isSmartComponentNode(scopeNode)) {\n\t\t\t\t\t\tctx.components.removeVariable(scopeNode.instanceIdentifier, variableId)\n\t\t\t\t\t}\n\t\t\t\t\tif (isCollectionNode(scopeNode)) {\n\t\t\t\t\t\tctx.collections.removeVariable(scopeNode.id, variableId)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn scheduleUpdate(() => {\n\t\t\t\t\t\tconst current = ctx.treeResolver.current(scopeNode)\n\t\t\t\t\t\tassert(current, RejectedCommandKind.ScopeMustBePresentInTree)\n\n\t\t\t\t\t\tif (isCollectionNode(current)) {\n\t\t\t\t\t\t\tcurrent.set({ variables: current.variables.filter(variable => variable.id !== variableId) })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrent.set({ variables: current.variables.filter(variable => variable.id !== variableId) })\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst resolvedVirtualRemoveId = ctx.treeResolver.resolveVirtualId(command.attributes.id)\n\t\t\t\tconst removedVirtualNode = ctx.virtualText.resolve(resolvedVirtualRemoveId)\n\t\t\t\tif (removedVirtualNode) {\n\t\t\t\t\tconst richTextNodeId = ctx.virtualText.getTarget(removedVirtualNode)\n\n\t\t\t\t\tctx.virtualText.remove(resolvedVirtualRemoveId)\n\t\t\t\t\treturn applyVirtualText(ctx, scheduleUpdate, richTextNodeId)\n\t\t\t\t}\n\n\t\t\t\tconst node = ctx.treeResolver.get(command.attributes.id)\n\t\t\t\tassert(node, RejectedCommandKind.RemoveUnknownNode)\n\t\t\t\tassert(!isRootNodeReference(ctx, command.attributes.id), RejectedCommandKind.RemoveCanvasRoot)\n\t\t\t\tassert(node.id !== ctx.scopeNode.id, RejectedCommandKind.RemoveEditScope)\n\t\t\t\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(node.id)\n\t\t\t\tconst isPrimaryVariantOfScope = withReplicaVariants(scopeNode) && scopeNode.baseVariantId === node.id\n\t\t\t\tassert(!isPrimaryVariantOfScope, RejectedCommandKind.RemovePrimaryVariant)\n\n\t\t\t\t// TODO: Removing WebPageNodes requires proper handling of:\n\t\t\t\t// 1. Cascading deletion of orphaned web pages when route segments with children are\n\t\t\t\t//    deleted\n\t\t\t\t// 2. Cleanup via deletePageFromCustomCode (requires engine access) See\n\t\t\t\t//    deleteRouteSegmentAndOrphanedWebPages for reference implementation. For now,\n\t\t\t\t//    skip removing web pages to prevent corrupted document states.\n\t\t\t\tif (isWebPageNode(node)) {\n\t\t\t\t\tctx.issues.warning(\n\t\t\t\t\t\traw,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[node.id]: \"Cannot remove a web page node\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ nodeIds: [node.id] },\n\t\t\t\t\t)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// Not allowed to remove replica children - they must be hidden.\n\t\t\t\tif (isReplicaChild(node)) {\n\t\t\t\t\treturn ctx.treeResolver.update(scheduleUpdate, node.id, () => {\n\t\t\t\t\t\tnode.set({ visible: false })\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (isCollectionNode(node)) ctx.collections.remove(node.id)\n\t\t\t\tif (isColorStyleTokenNode(node)) ctx.tokens.remove(node.id)\n\t\t\t\tif (isAgentSupportedStylePresetNode(node)) {\n\t\t\t\t\tctx.stylePresets.remove(node.id)\n\t\t\t\t}\n\t\t\t\tif (isRichTextNode(node)) ctx.virtualText.removeDocument(node.id)\n\t\t\t\tif (isLayoutTemplateNode(node)) ctx.layoutTemplates.remove(node.instanceIdentifier)\n\n\t\t\t\treturn ctx.treeResolver.remove(scheduleUpdate, node.id)\n\t\t\t}\n\t\t\tcase CommandType.Move: {\n\t\t\t\tassert(command.attributes.parent !== command.attributes.id, RejectedCommandKind.ParentNodeToItself)\n\t\t\t\tconst resolvedVirtualMoveId = ctx.treeResolver.resolveVirtualId(command.attributes.id)\n\t\t\t\tconst movedVirtualNode = ctx.virtualText.resolve(resolvedVirtualMoveId)\n\t\t\t\tif (movedVirtualNode) {\n\t\t\t\t\tconst sourceTarget = ctx.virtualText.getTarget(movedVirtualNode)\n\n\t\t\t\t\tconst destination = resolveRichTextDestination(movedVirtualNode, command.attributes.parent, ctx)\n\t\t\t\t\tconst destinationTarget = ctx.virtualText.getTarget(destination)\n\n\t\t\t\t\tif (destinationTarget !== sourceTarget) {\n\t\t\t\t\t\tconst handle = resolveSubtreeTransferHandle(ctx, movedVirtualNode, destinationTarget)\n\t\t\t\t\t\tctx.virtualText.maybeHydrateDocument(handle)\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.virtualText.move(resolvedVirtualMoveId, destination, command.attributes.position)\n\n\t\t\t\t\tif (destinationTarget !== sourceTarget) {\n\t\t\t\t\t\tawait applyVirtualText(ctx, scheduleUpdate, destinationTarget)\n\t\t\t\t\t}\n\t\t\t\t\treturn applyVirtualText(ctx, scheduleUpdate, sourceTarget)\n\t\t\t\t}\n\n\t\t\t\tconst movedVariable = moveVariable(ctx, scheduleUpdate, command.attributes)\n\t\t\t\tif (movedVariable) return movedVariable\n\n\t\t\t\tconst node = ctx.treeResolver.get(command.attributes.id)\n\t\t\t\tassert(node, RejectedCommandKind.MoveUnknownNode)\n\t\t\t\tassert(!isRootNodeReference(ctx, command.attributes.id), RejectedCommandKind.MoveCanvasRoot)\n\n\t\t\t\t// If parent is specified (it's optional), but not found, break.\n\t\t\t\tconst parent = ctx.treeResolver.get(command.attributes.parent)\n\t\t\t\tassert(!command.attributes.parent || parent, RejectedCommandKind.MoveUnknownParent)\n\n\t\t\t\tif (isReplicaChild(node)) {\n\t\t\t\t\tconst replicaParent = ctx.treeResolver.getLookupTree().getParent(node.id)\n\t\t\t\t\tassert(\n\t\t\t\t\t\tparent && replicaParent && replicaParent.id === parent.id,\n\t\t\t\t\t\tRejectedCommandKind.ReplicaChildMoveMustStayInParent,\n\t\t\t\t\t)\n\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisReorderableReplicaParent(replicaParent) && isSortableNode(node),\n\t\t\t\t\t\tRejectedCommandKind.ReplicaChildMoveRequiresReorderableParent,\n\t\t\t\t\t)\n\n\t\t\t\t\t// ctx.treeResolver.update can only update a single node so we manually record\n\t\t\t\t\t// the change.\n\t\t\t\t\tctx.treeResolver.recordChangedNode(node.id, \"update\")\n\n\t\t\t\t\treturn ctx.treeResolver.update(scheduleUpdate, replicaParent.id, () => {\n\t\t\t\t\t\tconst latestNode = ctx.treeResolver.current(node)\n\t\t\t\t\t\tconst latestParent = ctx.treeResolver.current(replicaParent)\n\n\t\t\t\t\t\tassert(latestNode && isReplicaChild(latestNode), RejectedCommandKind.MoveNodeNoLongerPresentInTree)\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tlatestParent && isReorderableReplicaParent(latestParent) && isSortableNode(latestNode),\n\t\t\t\t\t\t\tRejectedCommandKind.MoveParentNoLongerPresentInTree,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tupdateIdIndexInItemsOrder(latestNode.originalid, latestParent, command.attributes.position ?? -1)\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn ctx.treeResolver.update(scheduleUpdate, node.id, () => {\n\t\t\t\t\tconst currentNode = ctx.treeResolver.current(node)\n\t\t\t\t\tassert(currentNode, RejectedCommandKind.NodeMustBePresentInTree)\n\n\t\t\t\t\t// The parent of the node to move to/in must be in the tree already.\n\t\t\t\t\t//\n\t\t\t\t\t// This will fail if the LLM generates commands in an unexpected order, e.g.\n\t\t\t\t\t// INSERT parent, INSERT node, MOVE node VS INSERT parent, SET parent, INSERT\n\t\t\t\t\t// node, SET node, MOVE node. However neither of these examples are realistic\n\t\t\t\t\t// because the new node should be created in the intended parent.\n\t\t\t\t\tconst currentParent =\n\t\t\t\t\t\tctx.treeResolver.current(parent) ?? ctx.treeResolver.getLookupTree().getParent(currentNode.id)\n\n\t\t\t\t\tassert(currentParent, RejectedCommandKind.ParentMustBePresentInTree)\n\t\t\t\t\tif (isReplica(currentNode)) {\n\t\t\t\t\t\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(currentNode.id)\n\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tscopeNode && currentParent.id === scopeNode.id,\n\t\t\t\t\t\t\tRejectedCommandKind.ReplicaMoveMustStayWithinDirectParent,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tassert(currentParent.id !== currentNode.id, RejectedCommandKind.ParentNodeToItself)\n\t\t\t\t\tassert(!isReplicaOrReplicaChild(currentParent), RejectedCommandKind.MoveIntoReplicaRejected)\n\t\t\t\t\tassert(!treeStore.tree.isAncestorOfNode(currentParent, currentNode.id), RejectedCommandKind.MoveToDescendant)\n\t\t\t\t\tassert(\n\t\t\t\t\t\tacceptsChild(treeStore.tree, currentParent, currentNode, insertionScopeNode.id, ctx.componentLoader),\n\t\t\t\t\t\tRejectedCommandKind.MoveToRejectingParent,\n\t\t\t\t\t)\n\n\t\t\t\t\tctx.treeResolver.getLookupTree().moveNode(currentNode, currentParent.id, command.attributes.position)\n\t\t\t\t})\n\t\t\t}\n\t\t\tcase CommandType.CreateVariant: {\n\t\t\t\tassertCreatableId(command.attributes.id)\n\t\t\t\tconst node = ctx.treeResolver.get(command.attributes.from)\n\t\t\t\tassert(node, RejectedCommandKind.CreateVariantFromUnknownNode)\n\t\t\t\tassert(command.attributes.id !== command.attributes.from, RejectedCommandKind.DuplicateSameId)\n\t\t\t\tassert(!ctx.treeResolver.get(command.attributes.id), RejectedCommandKind.DuplicateExistingId)\n\n\t\t\t\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(node.id)\n\t\t\t\tassert(scopeNode, RejectedCommandKind.ScopeNodeRequiredForVariantDuplicate)\n\t\t\t\tassert(withReplicaVariants(scopeNode), RejectedCommandKind.ScopeNodeMustHaveReplicaVariants)\n\t\t\t\tassert(isFrameNode(node) && isVariant(node), RejectedCommandKind.CreateVariantFromNonVariant)\n\t\t\t\tif (command.attributes.gesture) {\n\t\t\t\t\tassert(isTopLevelVariant(node) && isSmartComponentNode(scopeNode), RejectedCommandKind.GestureVariant)\n\t\t\t\t}\n\t\t\t\tconst suggestedRect = command.attributes.gesture\n\t\t\t\t\t? bottomSideOf(treeStore.tree, scopeNode, node, node.rect())\n\t\t\t\t\t: rightSideOf(treeStore.tree, scopeNode, node, node.rect())\n\n\t\t\t\tconst duplicate = await ctx.treeResolver.insertWithCallback(scheduleUpdate, command.attributes.id, () =>\n\t\t\t\t\tContextAction.createVariant(\n\t\t\t\t\t\tctx.componentLoader,\n\t\t\t\t\t\tctx.treeResolver.getLookupTree(),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tscopeNode,\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tsuggestedRect,\n\t\t\t\t\t\t{ gesture: command.attributes.gesture },\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tif (isSmartComponentNode(scopeNode)) await ctx.components.updateVariants(scopeNode)\n\t\t\t\treturn duplicate\n\t\t\t}\n\t\t\tcase CommandType.Duplicate: {\n\t\t\t\tassertCreatableId(command.attributes.newId)\n\t\t\t\tconst resolvedVirtualDuplicateId = ctx.treeResolver.resolveVirtualId(command.attributes.id)\n\t\t\t\tconst dupedVirtualNode = ctx.virtualText.resolve(resolvedVirtualDuplicateId)\n\t\t\t\tassert(command.attributes.newId !== command.attributes.id, RejectedCommandKind.DuplicateSameId)\n\t\t\t\tassert(!ctx.treeResolver.get(command.attributes.newId), RejectedCommandKind.DuplicateExistingId)\n\t\t\t\tassert(!ctx.virtualText.has(command.attributes.newId), RejectedCommandKind.DuplicateExistingId)\n\n\t\t\t\tif (dupedVirtualNode) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!isVirtualRichTextUnsupported(dupedVirtualNode),\n\t\t\t\t\t\tRejectedCommandKind.UnsupportedVirtualNodeNotDuplicable,\n\t\t\t\t\t)\n\n\t\t\t\t\tconst sourceTarget = ctx.virtualText.getTarget(dupedVirtualNode)\n\n\t\t\t\t\tconst destination = command.attributes.parent\n\t\t\t\t\t\t? resolveRichTextDestination(dupedVirtualNode, command.attributes.parent, ctx)\n\t\t\t\t\t\t: undefined\n\n\t\t\t\t\tconst destinationTarget = destination ? ctx.virtualText.getTarget(destination) : sourceTarget\n\n\t\t\t\t\tif (destinationTarget !== sourceTarget) {\n\t\t\t\t\t\tconst handle = resolveSubtreeTransferHandle(ctx, dupedVirtualNode, destinationTarget)\n\t\t\t\t\t\tctx.virtualText.maybeHydrateDocument(handle)\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.virtualText.duplicate(\n\t\t\t\t\t\tresolvedVirtualDuplicateId,\n\t\t\t\t\t\tcommand.attributes.newId,\n\t\t\t\t\t\tdestination,\n\t\t\t\t\t\tcommand.attributes.position,\n\t\t\t\t\t)\n\n\t\t\t\t\tif (destinationTarget !== sourceTarget) {\n\t\t\t\t\t\tawait applyVirtualText(ctx, scheduleUpdate, destinationTarget)\n\n\t\t\t\t\t\t// DUPE'ing to another target doesn't change the current target's content. So no need to apply.\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\treturn applyVirtualText(ctx, scheduleUpdate, sourceTarget)\n\t\t\t\t}\n\n\t\t\t\tconst node = ctx.treeResolver.get(command.attributes.id)\n\t\t\t\tassert(node, RejectedCommandKind.DuplicateUnknownNode)\n\t\t\t\tassert(!isRootNodeReference(ctx, command.attributes.id), RejectedCommandKind.DuplicateCanvasRoot)\n\n\t\t\t\tif (isFrameNode(node) && isVariant(node)) {\n\t\t\t\t\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(node.id)\n\t\t\t\t\tassert(scopeNode, RejectedCommandKind.ScopeNodeRequiredForVariantDuplicate)\n\t\t\t\t\tassert(withReplicaVariants(scopeNode), RejectedCommandKind.ScopeNodeMustHaveReplicaVariants)\n\n\t\t\t\t\tconst duplicate = await ctx.treeResolver.insertWithCallback(scheduleUpdate, command.attributes.newId, () =>\n\t\t\t\t\t\tContextAction.createVariant(\n\t\t\t\t\t\t\tctx.componentLoader,\n\t\t\t\t\t\t\tctx.treeResolver.getLookupTree(),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tscopeNode,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\trightSideOf(treeStore.tree, scopeNode, node, node.rect()),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tif (isSmartComponentNode(scopeNode)) await ctx.components.updateVariants(scopeNode)\n\t\t\t\t\treturn duplicate\n\t\t\t\t}\n\n\t\t\t\tconst parentId = command.attributes.parent ?? node.parentid\n\t\t\t\tconst parent = parentId\n\t\t\t\t\t? ctx.treeResolver.get(parentId)\n\t\t\t\t\t: // Fallback to the root if the parent is not found.\n\t\t\t\t\t\t// TODO: Don't allow non-scope nodes to be inserted into the root.\n\t\t\t\t\t\t(ctx.treeResolver.getLookupTree().getScopeNodeFor(node) ?? ctx.treeResolver.getLookupTree().root)\n\t\t\t\tassert(!command.attributes.parent || parent, RejectedCommandKind.DuplicateUnknownParent)\n\t\t\t\tif (!parent) break\n\n\t\t\t\t// Not allowed to duplicate replica children.\n\t\t\t\tif (isReplicaChild(node) || isReplicaOrReplicaChild(parent)) break\n\n\t\t\t\tif (isWebPageNode(node)) {\n\t\t\t\t\tconst engine = ctx.hooks.getEngine()\n\t\t\t\t\tassert(\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tRejectedCommandKind.DuplicateUnknownNode,\n\t\t\t\t\t\t\"Cannot duplicate a web page without an active project engine\",\n\t\t\t\t\t)\n\t\t\t\t\tconst loadedPage = node.isLoaded() ? node : await node.load()\n\t\t\t\t\tassert(loadedPage, RejectedCommandKind.DuplicateUnknownNode, \"Cannot duplicate unloaded web page\")\n\n\t\t\t\t\tconst renamedIds = new RenamedIds()\n\t\t\t\t\tconst duplicate = await ctx.treeResolver.insertWithCallback(scheduleUpdate, command.attributes.newId, () =>\n\t\t\t\t\t\tduplicateWebPage(engine, loadedPage, loadedPage.getPrimaryVariant(), undefined, {\n\t\t\t\t\t\t\tshouldOpenPage: false,\n\t\t\t\t\t\t\trenamedIds,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tctx.treeResolver.recordDuplicateDescendantAliases(node, command.attributes.newId, renamedIds)\n\t\t\t\t\treturn duplicate\n\t\t\t\t}\n\n\t\t\t\tif (isLayoutTemplateNode(node) || isSmartComponentNode(node)) {\n\t\t\t\t\tconst engine = ctx.hooks.getEngine()\n\t\t\t\t\tassert(\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tRejectedCommandKind.DuplicateUnknownNode,\n\t\t\t\t\t\t\"Cannot duplicate scope node without an active engine\",\n\t\t\t\t\t)\n\t\t\t\t\tconst loadedNode = node.loaded\n\t\t\t\t\tassert(loadedNode, RejectedCommandKind.DuplicateUnknownNode, \"Cannot duplicate unloaded scope node\")\n\n\t\t\t\t\tconst renamedIds = new RenamedIds()\n\t\t\t\t\tconst duplicate = await ctx.treeResolver.insertWithCallback(scheduleUpdate, command.attributes.newId, () =>\n\t\t\t\t\t\tisLayoutTemplateNode(loadedNode)\n\t\t\t\t\t\t\t? duplicateLayoutTemplateNode(engine.tree, engine.componentLoader, loadedNode, { renamedIds })\n\t\t\t\t\t\t\t: cloneScopeNodeWithVariants(engine, loadedNode, loadedNode.getPrimaryVariant(), \"duplicate\", {\n\t\t\t\t\t\t\t\t\tenterIsolation: false,\n\t\t\t\t\t\t\t\t\tinsertionIndex: command.attributes.position ?? treeStore.tree.getIndex(node),\n\t\t\t\t\t\t\t\t\trenamedIds,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tctx.treeResolver.recordDuplicateDescendantAliases(node, command.attributes.newId, renamedIds)\n\t\t\t\t\treturn duplicate\n\t\t\t\t}\n\n\t\t\t\tconst position = command.attributes.position ?? treeStore.tree.getIndex(node)\n\n\t\t\t\treturn ctx.treeResolver.duplicate(\n\t\t\t\t\tscheduleUpdate,\n\t\t\t\t\tcommand.attributes.id,\n\t\t\t\t\tcommand.attributes.newId,\n\t\t\t\t\tparent.id,\n\t\t\t\t\tposition,\n\t\t\t\t)\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(command)\n\t\t}\n\t}\n}\n\nfunction assertCreatableId(id: string) {\n\tassert(\n\t\t!isVirtualNodeId(id),\n\t\tRejectedCommandKind.ReservedVirtualTextNodeId,\n\t\t`IDs like \"${id}\" are reserved for existing virtual text snapshot nodes. Use a temporary id like \"tb1\", \"tr1\", or \"br1\" when creating new nodes.`,\n\t)\n}\n\nfunction isRootNodeReference(ctx: AgentContext, id: string): boolean {\n\treturn ctx.treeResolver.getLookupTree().root.id === ctx.treeResolver.get(id)?.id\n}\n\nfunction prepareUpdateCommandAttributes(\n\tvariableType: VariableOrDivider[\"type\"],\n\tattributes: UpdateCommandAttributes,\n): Record<string, unknown> {\n\tif (\n\t\tvariableType === ControlType.Enum ||\n\t\tvariableType === ControlType.File ||\n\t\tvariableType === ControlType.MultiCollectionReference\n\t) {\n\t\treturn unflatten(attributes)\n\t}\n\n\treturn attributes\n}\n\ntype ImmutableSetAttribute = keyof Pick<UpdateCommandAttributes, \"component\" | \"set\" | \"shader\">\n// These attributes choose the underlying node implementation during ADD. SET can still update the\n// node's controls, but changing the implementation requires deleting and adding a replacement node.\nconst immutableSetAttributes = [\"component\", \"set\", \"shader\"] as const satisfies readonly ImmutableSetAttribute[]\n\n/**\n * Warn when immutable set attributes are used in SET commands.\n * @TODO: Consider a way to handle this more naturally, e.g. warning on any unhandled SET attributes.\n */\nfunction warnForImmutableSetAttributes(attributes: UpdateCommandAttributes, ctx: AgentContext, raw: string) {\n\tconst warnings: Record<string, string> = {}\n\n\tfor (const attribute of immutableSetAttributes) {\n\t\tconst value = attributes[attribute]\n\t\tif (isUndefined(value)) continue\n\n\t\twarnings[attribute] =\n\t\t\t`[rejected] ${attribute} cannot be changed with ${CommandType.Update}. ${CommandType.Remove} this node and add a new one with ${attribute}=\"${value}\", then set the relevant controls on the new node.`\n\t}\n\n\tif (Object.keys(warnings).length === 0) return\n\n\tctx.issues.warning(raw, warnings, { nodeIds: [attributes.id] })\n}\n\nasync function ensureComponentPresetControlsLoaded(\n\tnode: CanvasNode,\n\tattributes: DSLAttributes,\n\tctx: AgentContext,\n): Promise<void> {\n\tif (!isComponentPresetNode(node)) return\n\tif (!isModuleExportIdentifier(node.componentIdentifier)) return\n\tif (!containsPrefixedControlProp(attributes)) return\n\n\tawait ctx.components.async.forIdentifier(node.componentIdentifier)\n}\n\nfunction ensureSlug(node: CollectionItemNode, attributes: DSLAttributes, ctx: AgentContext) {\n\tconst parent = ctx.treeResolver.getLookupTree().getNodeWithTrait(node.parentid, isCollectionNode)\n\tif (!parent) return\n\n\tconst pendingControlProps = resolveControlProps(\n\t\tnode,\n\t\tattributes,\n\t\tctx,\n\t\t// Ignore errors\n\t\t() => {},\n\t\t// Ignore warnings\n\t\t() => {},\n\t)\n\tconst takenSlugs = getTakenSlugs(parent, node)\n\tconst slugChanges = maybeAutoGenerateSlugForCollectionItem(parent, node, takenSlugs, pendingControlProps)\n\tif (slugChanges) {\n\t\tctx.treeResolver.recordMutatingNodeUpdates(node.id, {\n\t\t\tchangedControlProps: new Set([slugChanges.changedControlProp]),\n\t\t})\n\t}\n}\n\nfunction moveVariable(\n\tctx: AgentContext,\n\tscheduleUpdate: (fn: VoidFunction) => Promise<void>,\n\tattributes: { id: string; parent: string; position?: number },\n) {\n\tconst variableHandle = ctx.dynamicValues.getVariableReferenceHandleByVariableId(attributes.id)\n\tif (!isVariableReferenceHandle(variableHandle)) return\n\n\tconst variableId = variableHandle.variable.id\n\tconst parentNode = ctx.treeResolver.get(attributes.parent)\n\tassert(parentNode, RejectedCommandKind.MoveUnknownParent)\n\tassert(withVariables(parentNode), RejectedCommandKind.ScopeMustSupportVariables)\n\tassert(parentNode.hasVariable(variableId), RejectedCommandKind.MoveNodeNoLongerPresentInTree)\n\n\treturn ctx.treeResolver.update(scheduleUpdate, parentNode.id, () => {\n\t\tconst current = ctx.treeResolver.current(parentNode)\n\t\tassert(current && withVariables(current), RejectedCommandKind.ParentMustBePresentInTree)\n\n\t\tconst fromIndex = current.variables.findIndex(v => v.id === variableId)\n\t\tassert(fromIndex !== -1, RejectedCommandKind.MoveNodeNoLongerPresentInTree)\n\n\t\tconst toIndex = attributes.position ?? current.variables.length - 1\n\t\tconst updatedVariables = List.move(current.variables, fromIndex, toIndex)\n\t\tcurrent.set({ variables: updatedVariables })\n\t})\n}\n\nfunction applyVirtualText(\n\tctx: AgentContext,\n\tscheduleUpdate: (fn: VoidFunction) => Promise<void>,\n\trichTextTarget: RichTextTarget,\n) {\n\tconst handle = resolveRichTextTargetHandle(richTextTarget, ctx)\n\tassert(handle, RejectedCommandKind.RichTextTargetNotFound)\n\n\tconst node = ctx.treeResolver.get(handle.nodeId)\n\tassert(node, RejectedCommandKind.RichTextTargetNotFound)\n\treturn ctx.treeResolver.update(scheduleUpdate, handle.nodeId, () => {\n\t\tassert(applyVirtualTextTarget(ctx, richTextTarget), RejectedCommandKind.RichTextTargetNotFound)\n\t})\n}\n\nfunction isExplicitPin(value: unknown): value is string {\n\treturn isString(value) && value !== nullString && value.trim() !== \"\"\n}\n\nfunction hasExplicitInsetPlacement(attributes: DSLAttributes): boolean {\n\tconst hasHorizontal = isExplicitPin(attributes.left) || isExplicitPin(attributes.right)\n\tconst hasVertical = isExplicitPin(attributes.top) || isExplicitPin(attributes.bottom)\n\treturn hasHorizontal && hasVertical\n}\n\nfunction fixedOverlayAllowedInParentScope(\n\tctx: AgentContext,\n\tattributes: Pick<AddCommandAttributes, \"parent\">,\n): boolean {\n\tassert(isString(attributes.parent), RejectedCommandKind.ParentAttributeMustBeString)\n\n\tconst parentNode = ctx.treeResolver.get(attributes.parent)\n\tif (!parentNode) return false\n\n\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(parentNode.id)\n\tif (!scopeNode) return true\n\treturn scopeSupportsOverlays(scopeNode) && !isSmartComponentNode(scopeNode)\n}\n\nfunction isKnownParent(ctx: AgentContext, attributes: Pick<AddCommandAttributes, \"parent\">): boolean {\n\t// When the value is not explicitly set the parent is automatically resolved.\n\tif (isUndefined(attributes.parent)) return true\n\n\tassert(isString(attributes.parent), RejectedCommandKind.ParentAttributeMustBeString)\n\n\tconst parent = ctx.treeResolver.get(attributes.parent)\n\treturn Boolean(parent)\n}\n\nfunction parentAcceptsChildren(ctx: AgentContext, attributes: Pick<AddCommandAttributes, \"parent\">): boolean {\n\tif (isUndefined(attributes.parent)) return true\n\n\tconst parent = ctx.treeResolver.get(attributes.parent)\n\tif (!parent) return false\n\treturn withChildren(parent)\n}\n\nfunction normalizeVariableAlias(attributes: AddVariableCommandAttributes): AddVariableAttributes {\n\tswitch (attributes.node) {\n\t\tcase VariableNodeClass:\n\t\t\treturn attributes\n\t\tcase CollectionReferenceVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: attributes.type === \"multi\" ? ControlType.MultiCollectionReference : ControlType.CollectionReference,\n\t\t\t}\n\t\tcase DateVariableAliasNodeClass: {\n\t\t\tconst { displayTime, ...rest } = attributes\n\t\t\treturn {\n\t\t\t\t...rest,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.Date,\n\t\t\t\t...(displayTime === \"true\" && { displayTime: true }),\n\t\t\t}\n\t\t}\n\t\tcase OptionVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.Enum,\n\t\t\t}\n\t\tcase EventHandlerVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.EventHandler,\n\t\t\t}\n\t\tcase FileVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.File,\n\t\t\t}\n\t\tcase IconVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: IconVariableType,\n\t\t\t}\n\t\tcase GalleryVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.Array,\n\t\t\t}\n\t\tcase LinkVariableAliasNodeClass:\n\t\t\treturn {\n\t\t\t\t...attributes,\n\t\t\t\tnode: VariableNodeClass,\n\t\t\t\ttype: ControlType.Link,\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(attributes)\n\t}\n}\n\nasync function handleVariableAdd(\n\tattributes: AddVariableAttributes,\n\tctx: AgentContext,\n\tscheduleUpdate: (fn: VoidFunction) => Promise<void>,\n\traw: string,\n) {\n\tconst scopeNode = ctx.treeResolver.get(attributes.scope)\n\tassert(scopeNode, RejectedCommandKind.ScopeRequired)\n\tassert(withVariables(scopeNode), RejectedCommandKind.ScopeMustSupportVariables)\n\n\ttry {\n\t\tconst { slugVariable, variable } = await createVariable(attributes, ctx, {\n\t\t\tllmId: attributes.id,\n\t\t\tscopeNode,\n\t\t\tonWarning: message => ctx.issues.warning(raw, { queryParam: message }, { nodeIds: [scopeNode.id] }),\n\t\t})\n\n\t\treturn await ctx.treeResolver.update(scheduleUpdate, scopeNode.id, () => {\n\t\t\tcreateVariableWithTree(ctx.treeResolver.getLookupTree(), { ...variable, scopeId: scopeNode.id })\n\t\t\tif (slugVariable) {\n\t\t\t\tcreateVariableWithTree(ctx.treeResolver.getLookupTree(), { ...slugVariable, scopeId: scopeNode.id })\n\t\t\t}\n\t\t})\n\t} catch (error: unknown) {\n\t\tthrow new RejectedCommandError(\n\t\t\tRejectedCommandKind.CreateVariableFailed,\n\t\t\terror instanceof Error ? error.message : \"Failed to create variable.\",\n\t\t)\n\t}\n}\n\nfunction assert(\n\tcondition: unknown,\n\tkind: RejectedCommandKind,\n\tmessage?: string,\n\toptions?: ErrorOptions,\n): asserts condition {\n\tif (condition) return\n\tthrow new RejectedCommandError(kind, message, options)\n}\n", "import { generateText } from \"ai\"\nimport { createVekterOpenRouterExtraBody, openRouter } from \"app/ai/config/openRouter.ts\"\nimport { LanguageModel } from \"app/ai/languageModels.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"app/ai/tracing/openRouterTrace.ts\"\n\nconst LEADING_TRAILING_QUOTES_REGEX = /^[\"']|[\"']$/g\n\n/**\n * Generates a short title for an agent session based on the initial prompt.\n * Uses generateText for quick response times.\n */\nexport async function generateSessionTitle(\n\tprompt: string,\n\ttraceConfig: OpenRouterFeatureStepTraceConfig,\n): Promise<string | undefined> {\n\tif (!prompt.trim()) return undefined\n\n\ttry {\n\t\tconst { text } = await generateText({\n\t\t\tmodel: openRouter(LanguageModel.Gemini3Flash, {\n\t\t\t\textraBody: createVekterOpenRouterExtraBody({\n\t\t\t\t\tfeatureCategory: \"agents\",\n\t\t\t\t\tstep: \"generate-session-title\",\n\t\t\t\t\t...traceConfig,\n\t\t\t\t}),\n\t\t\t}),\n\t\t\tsystem: systemPrompt,\n\t\t\tprompt: prompt,\n\t\t})\n\n\t\tconst title = text.trim().replace(LEADING_TRAILING_QUOTES_REGEX, \"\")\n\t\t// If the title is empty after processing, fall back to the prompt\n\t\treturn title || prompt\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nconst systemPrompt = `\nYou generate short, descriptive titles for user requests.\n\nTask: From the user's prompt, output a 3 word title that captures the main goal.\n\nExamples:\n- Prompt: \"Can you help me change all the button colors to blue and make them rounded?\"\n  Title: \"Update Button Styles\"\n\n- Prompt: \"I need to create a hero section with a background image and centered text\"\n  Title: \"Create Hero Section\"\n\n- Prompt: \"Make the navbar sticky and add a shadow effect when scrolling\"\n  Title: \"Add Sticky Navbar\"\n\nRules:\n- Aim for exactly 3 words\n- Use clear, action-oriented language\n- Focus on the main goal, not implementation details\n- No quotation marks, trailing punctuation, or emojis\n- Use Title Case\n- Output only the title text\n`\n", "import { assertNever } from \"@framerjs/shared\"\nimport { getNodeIdForPossiblyVirtualId } from \"app/ai/agents/commandTargets.ts\"\nimport { isVirtualNodeId } from \"app/ai/agents/context/richtext/document.ts\"\nimport { CommandType } from \"app/ai/agents/dsl.ts\"\nimport type { Command } from \"app/ai/agents/dsl.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { countAndNoun } from \"utils/countAndNoun.ts\"\n\nexport type OperationSummary = Record<CommandType, Set<NodeID>>\n\n/**\n * Returns operation counts with deduplication:\n * - Nodes that were created (Add/Duplicate/CreateVariant) are not also counted as Updated/Moved\n *\n * @param ops - The operation summary to get the counts of.\n * @returns The counts of each operation type.\n */\nexport function getOperationCounts(ops: OperationSummary): Record<keyof OperationSummary, number> {\n\tconst newlyCreatedIds = new Set([\n\t\t...ops[CommandType.Add],\n\t\t...ops[CommandType.Duplicate],\n\t\t...ops[CommandType.CreateVariant],\n\t])\n\n\treturn {\n\t\t[CommandType.Add]: ops[CommandType.Add].size,\n\t\t[CommandType.Duplicate]: ops[CommandType.Duplicate].size,\n\t\t[CommandType.Update]: [...ops[CommandType.Update]].filter(id => !newlyCreatedIds.has(id)).length,\n\t\t[CommandType.Move]: [...ops[CommandType.Move]].filter(id => !newlyCreatedIds.has(id)).length,\n\t\t[CommandType.Remove]: ops[CommandType.Remove].size,\n\t\t[CommandType.CreateVariant]: ops[CommandType.CreateVariant].size,\n\t}\n}\n\n/**\n * Resolves the effective ID and operation type for a command, collapsing\n * richtext-internal operations to the parent richtext node ID. A node is\n * considered richtext-internal when its own ID is virtual OR when it was\n * added under a virtual parent (tracked by virtualChildIds). All such\n * operations are reclassified as Update; getOperationCounts filters out\n * redundant updates when the parent was itself created in this batch.\n */\nfunction resolveCommandTarget(\n\tcommand: Command,\n\tvirtualChildIds: ReadonlyMap<string, NodeID>,\n): { id: NodeID; type: CommandType } {\n\tlet rawId: string\n\tswitch (command.type) {\n\t\tcase CommandType.Duplicate:\n\t\t\trawId = command.attributes.newId\n\t\t\tbreak\n\t\tcase CommandType.Add:\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Remove:\n\t\tcase CommandType.Move:\n\t\tcase CommandType.CreateVariant:\n\t\t\trawId = command.attributes.id\n\t\t\tbreak\n\t\tdefault:\n\t\t\tassertNever(command, \"Invalid command type\")\n\t}\n\n\tif (isVirtualNodeId(rawId)) {\n\t\tconst richTextNodeId = getNodeIdForPossiblyVirtualId(rawId)\n\t\treturn { id: richTextNodeId, type: CommandType.Update }\n\t}\n\n\tconst parentRichTextId = virtualChildIds.get(rawId)\n\tif (parentRichTextId) {\n\t\treturn { id: parentRichTextId, type: CommandType.Update }\n\t}\n\n\treturn { id: rawId, type: command.type }\n}\n\nfunction toOperationSummary(commands: readonly Command[]): OperationSummary {\n\t// First pass: for Add commands whose parent is a virtual node ID, map the\n\t// child node ID to the grandparent richtext node ID. This catches TextRun\n\t// nodes (non-virtual IDs) created inside virtual text blocks.\n\tconst virtualChildIds = new Map<string, NodeID>()\n\tfor (const command of commands) {\n\t\tif (command.type !== CommandType.Add) continue\n\t\tconst parentId = command.attributes.parent\n\t\tif (parentId && isVirtualNodeId(parentId)) {\n\t\t\tvirtualChildIds.set(command.attributes.id, getNodeIdForPossiblyVirtualId(parentId))\n\t\t}\n\t}\n\n\tconst ops: OperationSummary = {\n\t\t[CommandType.Add]: new Set(),\n\t\t[CommandType.Update]: new Set(),\n\t\t[CommandType.Remove]: new Set(),\n\t\t[CommandType.Move]: new Set(),\n\t\t[CommandType.Duplicate]: new Set(),\n\t\t[CommandType.CreateVariant]: new Set(),\n\t}\n\n\tfor (const command of commands) {\n\t\tconst { id, type } = resolveCommandTarget(command, virtualChildIds)\n\t\tops[type].add(id)\n\t}\n\n\treturn ops\n}\n\n/**\n * Formats a deduplicated operations summary that matches agent chat UI wording.\n * Example: \"Added 3 layers, edited 1\"\n */\nexport function formatOperationSummary(commands: readonly Command[]): string | undefined {\n\tconst operationCounts = getOperationCounts(toOperationSummary(commands))\n\tconst parts: string[] = []\n\tlet isFirst = true\n\n\tconst addPart = (verb: string, count: number) => {\n\t\tif (count === 0) return\n\n\t\tconst capitalizedVerb = isFirst ? verb : verb.toLowerCase()\n\t\tconst suffix = isFirst ? ` ${countAndNoun(count, \"layer\", \"layers\")}` : ` ${count}`\n\t\tparts.push(`${capitalizedVerb}${suffix}`)\n\t\tisFirst = false\n\t}\n\n\t// Order matters - this defines display priority.\n\taddPart(\"Added\", operationCounts[CommandType.Add])\n\taddPart(\"Edited\", operationCounts[CommandType.Update])\n\taddPart(\"Removed\", operationCounts[CommandType.Remove])\n\taddPart(\"Moved\", operationCounts[CommandType.Move])\n\taddPart(\"Duplicated\", operationCounts[CommandType.Duplicate] + operationCounts[CommandType.CreateVariant])\n\n\tif (parts.length === 0) return undefined\n\treturn parts.join(\", \")\n}\n", "import { assertNever } from \"@framerjs/shared/src/assert.ts\"\nimport { formatOperationSummary } from \"app/agent/utils/messages.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { formatElapsedMs } from \"./debug/utils.ts\"\nimport type { Command } from \"./dsl.ts\"\nimport {\n\tgetBlockingTaskCompletedMessage,\n\tgetBlockingTaskStartMessage,\n\tgetDSLCommandCompletedMessage,\n\tgetReadTaskDisplayMessage,\n} from \"./statusMessages.ts\"\nimport type { TransientTurnMessage } from \"./types.ts\"\n\nexport interface HarnessDisplayTimelineEntry {\n\tkind: \"tool\" | \"action\" | \"annotation\"\n\tdisplay: string\n}\n\nfunction getElapsedDisplay(startedAt: number, completedAt: number): string {\n\tconst elapsedMs = Math.max(0, Math.round(completedAt - startedAt))\n\treturn `${formatElapsedMs(elapsedMs)}`\n}\n\nexport function createHarnessDisplayTimeline(\n\tmessages: readonly TransientTurnMessage[],\n): readonly HarnessDisplayTimelineEntry[] {\n\tconst entries: HarnessDisplayTimelineEntry[] = []\n\tconst commands: Command[] = []\n\n\tfor (const message of messages) {\n\t\tswitch (message.type) {\n\t\t\tcase \"annotation\":\n\t\t\tcase \"step\":\n\t\t\tcase \"create-component\":\n\t\t\t\tentries.push({\n\t\t\t\t\tkind: \"annotation\",\n\t\t\t\t\tdisplay: message.text,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase \"read\":\n\t\t\t\tentries.push({\n\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\tdisplay: getReadTaskDisplayMessage(message.task),\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase \"blocking-task\": {\n\t\t\t\tentries.push({\n\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\tdisplay: getBlockingTaskStartMessage(message.task, message.message),\n\t\t\t\t})\n\t\t\t\tif (isNumber(message.timestamp) && isNumber(message.completedAt)) {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\tdisplay: `${getBlockingTaskCompletedMessage(message.task, message.message)} ${getElapsedDisplay(message.timestamp, message.completedAt)}`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"command\":\n\t\t\t\tcommands.push(message.command)\n\t\t\t\tentries.push({\n\t\t\t\t\tkind: \"action\",\n\t\t\t\t\tdisplay: getDSLCommandCompletedMessage(message.command),\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase \"text\":\n\t\t\tcase \"thinking\":\n\t\t\tcase \"design-plan\":\n\t\t\tcase \"clarification\":\n\t\t\tcase \"code-patch\":\n\t\t\tcase \"code-agent-status\":\n\t\t\tcase \"scripting\":\n\t\t\tcase \"script-read\":\n\t\t\tcase \"changes\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(message, \"Invalid transient turn message\")\n\t\t}\n\t}\n\n\tconst actionSummary = commands.length > 1 ? formatOperationSummary(commands) : undefined\n\tif (actionSummary !== undefined) {\n\t\tentries.push({\n\t\t\tkind: \"action\",\n\t\t\tdisplay: actionSummary,\n\t\t})\n\t}\n\n\treturn entries\n}\n", "import type { CurrentUser } from \"@framerjs/app-shared\"\nimport { assertNever, getLogger } from \"@framerjs/shared\"\nimport type { OpenRouterProviderOptions } from \"@openrouter/ai-sdk-provider\"\nimport type { Attachment } from \"@raindrop-ai/ai-sdk/browser\"\nimport { getImageUrls, type AgentAttachmentImage } from \"app/agent/attachments.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getGeneratedValue } from \"document/models/CanvasTree/traits/Generated.ts\"\nimport { withName } from \"document/models/CanvasTree/traits/WithName.ts\"\nimport { isFramerEmployee } from \"web/lib/isFramerEmployee.ts\"\nimport type { AgentIssues } from \"../agents/context/issues.ts\"\nimport type { CommandType } from \"../agents/dsl.ts\"\nimport { createHarnessDisplayTimeline } from \"../agents/harnessDisplayTimeline.ts\"\nimport type { HarnessDisplayTimelineEntry } from \"../agents/harnessDisplayTimeline.ts\"\nimport type { Source } from \"../agents/source.ts\"\nimport type { StreamLifeCycleHooks } from \"../agents/stream.ts\"\nimport { isNodeScreenshotResult, type Response as ScreenshotResponse } from \"../agents/tools/utils/AgentScreenshots.ts\"\nimport type { AgentRequest, AgentRequestAbortedReason } from \"../agents/types.ts\"\nimport { createRaindropEventMetadata, raindrop } from \"./client.ts\"\n\nconst log = getLogger(\"ai:agents:tracking\")\n\nconst submitMessageEvent = \"agent_submit_message\"\n\ninterface RaindropTelemetryOptions {\n\texperimental_telemetry: {\n\t\tisEnabled: true\n\t\tmetadata: ReturnType<typeof createRaindropEventMetadata>\n\t}\n}\n\nfunction withDevelopmentPrefix(value: string): string {\n\tconst prefix = process.env.BUILD_TYPE === \"production\" ? \"\" : \"development_\"\n\treturn `${prefix}${value}`\n}\n\ninterface EventProperties extends Record<string, unknown> {\n\tagent_source?: Source[\"agent\"]\n\tproject_id?: string\n\tinput_selection_count?: number\n\tsystem_prompt?: string\n\tcommit_sha?: string\n\ttime_to_first_token?: number\n\ttotal_duration?: number\n\tfinish_reason?: \"completed\" | \"cancelled\" | \"error\"\n\terror_count?: number\n\tparse_error_count?: number\n\trejected_command_count?: number\n\twarning_count?: number\n\ttotal_issues?: number\n\tinput_tokens?: number\n\taborted_reason?: AgentRequestAbortedReason[\"reason\"]\n\treasoning_effort?: string\n\tselection_count?: number\n\timage_count?: number\n\ttext_message_count?: number\n\tstep_message_count?: number\n\tcommand_message_count?: number\n\tanswer_message_count?: number\n\tclarification_answer_count?: number\n\telapsed_ms?: number\n\tsubcall_count?: number\n\tcommand_counts?: Record<string, number>\n}\n\nexport interface AgentIssueCounts {\n\terrorCount: number\n\tparseErrorCount: number\n\trejectedCommandCount: number\n\twarningCount: number\n}\n\nexport interface AgentInteractionStartTurnOptions {\n\tcontextMessages: readonly string[]\n\tvisibleInput: string\n\tselectionIds: readonly string[]\n\treasoningEffort: OpenRouterProviderOptions[\"reasoning\"]\n}\n\nexport interface AgentInteractionStreamLifecycleHookOptions {\n\tonFirstToken?: () => void\n}\n\nexport interface AgentInteractionTurnOutcome {\n\trequest: AgentRequest\n\tfinishReason: NonNullable<EventProperties[\"finish_reason\"]>\n\tissues?: AgentIssues\n\tinputTokens: number | undefined\n\terror?: Error\n}\n\ntype AgentInteractionStreamLifecycleHooks = Pick<\n\tStreamLifeCycleHooks,\n\t\"onSystemPromptHash\" | \"onSystemPromptSnapshot\" | \"onRawAssistantText\" | \"onFirstToken\"\n>\n\nfunction toRaindropPropertyValue(value: unknown): unknown {\n\tif (value === undefined) return undefined\n\tif (value === null) return \"null\"\n\tif (typeof value === \"object\") return value\n\tif (typeof value === \"string\") return value\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n\t\treturn String(value)\n\t}\n\treturn \"[unserializable]\"\n}\n\nfunction createInitialEventProperties(): EventProperties {\n\treturn {\n\t\tcommit_sha: process.env.GIT_HASH || undefined,\n\t}\n}\n\n// Raindrop needs strings as values (or JSON objects / arrays).\nfunction toRaindropProperties(properties: EventProperties): Record<string, unknown> {\n\tconst serialized: Record<string, unknown> = {}\n\tfor (const [key, value] of Object.entries(properties)) {\n\t\tconst serializedValue = toRaindropPropertyValue(value)\n\t\tif (serializedValue === undefined) continue\n\t\tserialized[key] = serializedValue\n\t}\n\treturn serialized\n}\n\nasync function addEventAttachments(\n\teventId: string,\n\tattachments: Attachment[],\n\tcontext: {\n\t\tconvoId: string\n\t\tsource: \"event\" | \"subcall\"\n\t\tstep?: string\n\t},\n): Promise<boolean> {\n\tif (attachments.length === 0) return true\n\ttry {\n\t\tawait raindrop.events.addAttachments(eventId, attachments)\n\t\treturn true\n\t} catch {\n\t\tlog.error(\"Error attaching AI payload\", eventId, {\n\t\t\tconvoId: context.convoId,\n\t\t\tsource: context.source,\n\t\t\tstep: context.step,\n\t\t})\n\t\treturn false\n\t}\n}\n\nexport interface NormalizedAgentTurnSummary {\n\tfinish_reason: NonNullable<EventProperties[\"finish_reason\"]>\n\taborted_reason?: AgentRequestAbortedReason[\"reason\"]\n\tmodel?: string\n\treasoning_effort?: string\n\tselection_count: number\n\timage_count: number\n\ttext_message_count: number\n\tstep_message_count: number\n\tcommand_message_count: number\n\tanswer_message_count: number\n\tclarification_answer_count: number\n\tcommand_counts: Record<string, number>\n\tfinal_visible_text?: string\n\telapsed_ms?: number\n\tinput_tokens?: number\n\tsubcall_count?: number\n}\n\nexport function getTrackedInputTokens(\n\tcontextUsage: { source: \"estimated\" | \"actual\"; inputTokens: number } | undefined,\n): number | undefined {\n\tif (!contextUsage) return undefined\n\tif (contextUsage.source !== \"actual\") return undefined\n\treturn contextUsage.inputTokens\n}\n\nfunction createNormalizedAgentSummary(\n\trequest: AgentRequest,\n\tfinishReason: NonNullable<NormalizedAgentTurnSummary[\"finish_reason\"]>,\n\tinputTokens: number | undefined,\n): NormalizedAgentTurnSummary {\n\tconst commandCounts: Record<string, number> = {}\n\tlet textMessageCount = 0\n\tlet stepMessageCount = 0\n\tlet commandMessageCount = 0\n\tlet answerMessageCount = 0\n\tlet clarificationAnswerCount = 0\n\tlet finalVisibleText: string | undefined\n\n\tfor (const message of request.state.messages) {\n\t\tswitch (message.type) {\n\t\t\tcase \"text\": {\n\t\t\t\ttextMessageCount++\n\t\t\t\tfinalVisibleText = message.text\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"step\":\n\t\t\tcase \"create-component\":\n\t\t\tcase \"annotation\":\n\t\t\t\tstepMessageCount++\n\t\t\t\tbreak\n\t\t\tcase \"command\":\n\t\t\t\tcommandMessageCount++\n\t\t\t\tincrementSummaryCount(commandCounts, message.command.type)\n\t\t\t\tbreak\n\t\t\tcase \"clarification\":\n\t\t\t\tanswerMessageCount++\n\t\t\t\tclarificationAnswerCount += message.answers?.length ?? 0\n\t\t\t\tbreak\n\n\t\t\tcase \"thinking\":\n\t\t\tcase \"read\":\n\t\t\tcase \"design-plan\":\n\t\t\tcase \"blocking-task\":\n\t\t\tcase \"code-patch\":\n\t\t\tcase \"code-agent-status\":\n\t\t\tcase \"scripting\":\n\t\t\tcase \"script-read\":\n\t\t\tcase \"changes\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(message)\n\t\t}\n\t}\n\n\treturn {\n\t\tfinish_reason: finishReason,\n\t\taborted_reason: request.aborted?.reason,\n\t\tmodel: request.model,\n\t\treasoning_effort: request.reasoningEffort,\n\t\tselection_count: request.selection?.length ?? 0,\n\t\timage_count: request.images.length,\n\t\ttext_message_count: textMessageCount,\n\t\tstep_message_count: stepMessageCount,\n\t\tcommand_message_count: commandMessageCount,\n\t\tanswer_message_count: answerMessageCount,\n\t\tclarification_answer_count: clarificationAnswerCount,\n\t\tcommand_counts: commandCounts,\n\t\tfinal_visible_text: finalVisibleText?.trim() || undefined,\n\t\telapsed_ms: request.elapsedMs,\n\t\tinput_tokens: inputTokens,\n\t}\n}\n\nfunction incrementSummaryCount(counts: Record<string, number>, key: CommandType): void {\n\tcounts[key] = (counts[key] ?? 0) + 1\n}\n\nfunction getInputImageAttachmentName(image: AgentAttachmentImage, index: number): string {\n\tconst extension = image.referenceImage.asset.extension.replace(/^\\./u, \"\")\n\treturn extension ? `input_image_${index}.${extension}` : `input_image_${index}`\n}\n\nexport interface OutputScopeScreenshotter {\n\treadonly treeResolver: {\n\t\tget(id: NodeID): CanvasNode | null | undefined\n\t}\n\tcreateRequest(request: { id: NodeID }): Promise<ScreenshotResponse>\n\tflushRequests(): Promise<void>\n}\n\nfunction getScreenshotTargetName(screenshotter: OutputScopeScreenshotter, nodeId: NodeID): string {\n\tconst node = screenshotter.treeResolver.get(nodeId)\n\tif (!node) return nodeId\n\n\tif (!withName(node) || !node.name) return nodeId\n\treturn getGeneratedValue(node.name).trim() || nodeId\n}\n\nasync function createOutputScopeScreenshotRequest(\n\tscreenshotter: OutputScopeScreenshotter,\n\trequestId: NodeID,\n): Promise<ScreenshotResponse | undefined> {\n\ttry {\n\t\treturn await screenshotter.createRequest({ id: requestId })\n\t} catch (error) {\n\t\tlog.reportError(error)\n\t\treturn undefined\n\t}\n}\n\nexport interface AgentSubcallTelemetryHandle {\n\treadonly eventId: string\n\ttelemetryOptions(): RaindropTelemetryOptions | undefined\n\taddJsonAttachment(name: string, role: Attachment[\"role\"], value: unknown): void\n\tflush(): Promise<void>\n\tfinish(\n\t\tfinishReason: NonNullable<EventProperties[\"finish_reason\"]>,\n\t\toptions?: { model?: string; output?: string },\n\t): Promise<void>\n}\n\nexport interface AgentInteractionHandle {\n\treadonly eventId: string\n\ttraceEventId(): string | undefined\n\ttelemetryOptions(): RaindropTelemetryOptions | undefined\n\tbeginTurn(options: AgentInteractionStartTurnOptions): void\n\tcreateStreamLifecycleHooks(options?: AgentInteractionStreamLifecycleHookOptions): AgentInteractionStreamLifecycleHooks\n\trecordTurnOutcome(options: AgentInteractionTurnOutcome): Promise<void>\n\trecordTTFT(): void\n\tsetIssueCounts(counts?: AgentIssueCounts): void\n\tsetVisibleInput(input: string): void\n\trecordVisibleOutput(output: string): void\n\tsetSystemPromptHash(hash: string): void\n\tsetSystemPromptSnapshot(prompt: string): void\n\tsetContextMessages(contextMessages: readonly string[]): void\n\tsetInputTokens(inputTokens: number | undefined): void\n\tsetReasoningEffort(reasoningEffort: OpenRouterProviderOptions[\"reasoning\"]): void\n\tsetInputSelectionIds(selectionIds: readonly string[]): void\n\tsetGeneratedDSL(commands: readonly string[]): void\n\tsetHarnessDisplayTimeline(entries: readonly HarnessDisplayTimelineEntry[]): void\n\tsetNormalizedSummary(summary: NormalizedAgentTurnSummary): void\n\tcaptureAffectedOutputNodeScreenshots(\n\t\taffectedNodeIds: ReadonlySet<NodeID>,\n\t\tscreenshotter: OutputScopeScreenshotter,\n\t): Promise<void>\n\tcreateSubcall(step: string, properties?: Record<string, unknown>): AgentSubcallTelemetryHandle\n\terror(error: Error): Promise<void>\n\tfinish(finishReason: NonNullable<EventProperties[\"finish_reason\"]>): Promise<void>\n}\n\ninterface FinalizedEventState {\n\tinput: string | undefined\n\toutput: string | undefined\n\tmodel: string | undefined\n\tproperties: Record<string, unknown>\n}\n\nclass NoopAgentSubcallTelemetry implements AgentSubcallTelemetryHandle {\n\treadonly eventId = crypto.randomUUID()\n\n\ttelemetryOptions() {\n\t\treturn undefined\n\t}\n\n\taddJsonAttachment(_name: string, _role: Attachment[\"role\"], _value: unknown) {}\n\n\tflush() {\n\t\treturn Promise.resolve()\n\t}\n\n\tfinish(_finishReason: NonNullable<EventProperties[\"finish_reason\"]>, _options?: { model?: string; output?: string }) {\n\t\treturn Promise.resolve()\n\t}\n}\n\nclass NoopAgentInteraction implements AgentInteractionHandle {\n\treadonly eventId = crypto.randomUUID()\n\n\ttraceEventId() {\n\t\treturn undefined\n\t}\n\n\ttelemetryOptions() {\n\t\treturn undefined\n\t}\n\n\tbeginTurn(_options: AgentInteractionStartTurnOptions) {}\n\n\tcreateStreamLifecycleHooks(\n\t\toptions?: AgentInteractionStreamLifecycleHookOptions,\n\t): AgentInteractionStreamLifecycleHooks {\n\t\treturn {\n\t\t\tonFirstToken: options?.onFirstToken,\n\t\t}\n\t}\n\n\trecordTurnOutcome(_options: AgentInteractionTurnOutcome) {\n\t\treturn Promise.resolve()\n\t}\n\n\trecordTTFT() {}\n\n\tsetIssueCounts(_counts?: AgentIssueCounts) {}\n\n\tsetVisibleInput(_input: string) {}\n\n\trecordVisibleOutput(_output: string) {}\n\n\tsetSystemPromptHash(_hash: string) {}\n\n\tsetSystemPromptSnapshot(_prompt: string) {}\n\n\tsetContextMessages(_contextMessages: readonly string[]) {}\n\n\tsetInputTokens(_inputTokens: number | undefined) {}\n\n\tsetReasoningEffort(_reasoningEffort: OpenRouterProviderOptions[\"reasoning\"]) {}\n\n\tsetInputSelectionIds(_selectionIds: readonly string[]) {}\n\n\tsetGeneratedDSL(_commands: readonly string[]) {}\n\n\tsetHarnessDisplayTimeline(_entries: readonly HarnessDisplayTimelineEntry[]) {}\n\n\tsetNormalizedSummary(_summary: NormalizedAgentTurnSummary) {}\n\n\tcaptureAffectedOutputNodeScreenshots(\n\t\t_affectedNodeIds: ReadonlySet<NodeID>,\n\t\t_screenshotter: OutputScopeScreenshotter,\n\t) {\n\t\treturn Promise.resolve()\n\t}\n\n\tcreateSubcall(_step: string, _properties?: Record<string, unknown>) {\n\t\treturn new NoopAgentSubcallTelemetry()\n\t}\n\n\terror(_error: Error) {\n\t\treturn Promise.resolve()\n\t}\n\n\tfinish(_finishReason: NonNullable<EventProperties[\"finish_reason\"]>) {\n\t\treturn Promise.resolve()\n\t}\n}\n\nfunction createNoopAgentInteraction(): AgentInteractionHandle {\n\treturn new NoopAgentInteraction()\n}\n\nclass AgentSubcallTelemetry implements AgentSubcallTelemetryHandle {\n\treadonly eventId = crypto.randomUUID()\n\n\tprivate readonly submitTime = performance.now()\n\tprivate readonly attachments: Attachment[] = []\n\tprivate readonly userId: string\n\tprivate readonly convoId: string\n\tprivate readonly step: string\n\tprivate readonly parentEventId: string\n\tprivate readonly startedAt: string\n\tprivate readonly creationPatch: Promise<void>\n\tprivate properties: EventProperties\n\n\tconstructor({\n\t\tuserId,\n\t\tconvoId,\n\t\tstep,\n\t\tparentEventId,\n\t\tproperties,\n\t}: {\n\t\tuserId: string\n\t\tconvoId: string\n\t\tstep: string\n\t\tparentEventId: string\n\t\tproperties?: EventProperties\n\t}) {\n\t\tthis.userId = userId\n\t\tthis.convoId = convoId\n\t\tthis.step = step\n\t\tthis.parentEventId = parentEventId\n\t\tthis.startedAt = new Date().toISOString()\n\t\tthis.properties = {\n\t\t\tagent_step: step,\n\t\t\tparent_event_id: parentEventId,\n\t\t\t...properties,\n\t\t}\n\n\t\tlog.debug(\"Raindrop subcall | convoId:\", convoId, \"eventId:\", this.eventId, {\n\t\t\tparentEventId,\n\t\t\tstep,\n\t\t\tproperties: this.properties,\n\t\t})\n\n\t\tthis.creationPatch = raindrop.events\n\t\t\t.patch(this.eventId, {\n\t\t\t\teventName: withDevelopmentPrefix(`agent_${this.step}`),\n\t\t\t\tuserId: this.userId,\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\tisPending: true,\n\t\t\t\ttimestamp: this.startedAt,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error creating AI subcall event\", this.eventId)\n\t\t\t})\n\t}\n\n\ttelemetryOptions(): RaindropTelemetryOptions {\n\t\treturn {\n\t\t\texperimental_telemetry: {\n\t\t\t\tisEnabled: true,\n\t\t\t\tmetadata: createRaindropEventMetadata({\n\t\t\t\t\tuserId: this.userId,\n\t\t\t\t\teventId: this.eventId,\n\t\t\t\t\tconvoId: this.convoId,\n\t\t\t\t\teventName: withDevelopmentPrefix(`agent_${this.step}`),\n\t\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\t}),\n\t\t\t},\n\t\t}\n\t}\n\n\taddJsonAttachment(name: string, role: Attachment[\"role\"], value: unknown) {\n\t\tthis.attachments.push({\n\t\t\ttype: \"text\",\n\t\t\trole,\n\t\t\tname,\n\t\t\tvalue: JSON.stringify(value),\n\t\t})\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this.attachments.length === 0) return\n\t\tawait this.creationPatch\n\n\t\tlog.debug(\"Raindrop subcall attachments | convoId:\", this.convoId, \"eventId:\", this.eventId, {\n\t\t\tstep: this.step,\n\t\t\tattachmentCount: this.attachments.length,\n\t\t\tparentEventId: this.parentEventId,\n\t\t})\n\n\t\t// Subcall payload belongs to the subcall event. Fallback to parent event if subcall\n\t\t// attachment upload fails so telemetry is still available during transient regressions.\n\t\tconst didAttach = await addEventAttachments(this.eventId, this.attachments, {\n\t\t\tconvoId: this.convoId,\n\t\t\tsource: \"subcall\",\n\t\t\tstep: this.step,\n\t\t})\n\t\tif (didAttach) return\n\n\t\tawait addEventAttachments(this.parentEventId, this.attachments, {\n\t\t\tconvoId: this.convoId,\n\t\t\tsource: \"subcall\",\n\t\t\tstep: this.step,\n\t\t})\n\t}\n\n\tasync finish(\n\t\tfinishReason: NonNullable<EventProperties[\"finish_reason\"]>,\n\t\toptions?: { model?: string; output?: string },\n\t): Promise<void> {\n\t\tawait this.creationPatch\n\t\tthis.properties = {\n\t\t\t...this.properties,\n\t\t\ttotal_duration: performance.now() - this.submitTime,\n\t\t\tfinish_reason: finishReason,\n\t\t}\n\n\t\tawait raindrop.events\n\t\t\t.finish(this.eventId, {\n\t\t\t\tmodel: options?.model,\n\t\t\t\toutput: options?.output,\n\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error finishing AI subcall event\", this.eventId)\n\t\t\t})\n\t}\n}\n\nexport class AgentInteraction implements AgentInteractionHandle {\n\treadonly eventId = crypto.randomUUID()\n\n\tprivate readonly submitTime = performance.now()\n\tprivate readonly startedAt = new Date().toISOString()\n\tprivate readonly userId: string\n\tprivate readonly convoId: string\n\tprivate properties: EventProperties\n\tprivate readonly attachments: Attachment[] = []\n\tprivate readonly inputImageAttachments: Attachment[] = []\n\tprivate readonly contextAttachments: Attachment[] = []\n\tprivate readonly outputScopeScreenshots = new Map<NodeID, { imageUrl: string; attachmentName: string }>()\n\tprivate subcallCount = 0\n\tprivate generatedDSL: readonly string[] | undefined = undefined\n\tprivate latestVisibleInput = \"\"\n\tprivate pendingVisibleInputPatch: Promise<void> | undefined = undefined\n\tprivate latestVisibleOutput = \"\"\n\tprivate lastTrackedVisibleOutput = \"\"\n\tprivate pendingVisibleOutputPatch: Promise<void> | undefined = undefined\n\tprivate systemPromptSnapshot: string | undefined = undefined\n\tprivate harnessDisplayTimeline: readonly HarnessDisplayTimelineEntry[] | undefined = undefined\n\tprivate normalizedSummary: NormalizedAgentTurnSummary | undefined = undefined\n\tprivate recordedTTFT = false\n\tprivate outputScopeScreenshotVersion = 0\n\tprivate flushedOutputScopeScreenshotVersion = 0\n\tprivate finalizedEventState: FinalizedEventState | undefined = undefined\n\tprivate finishPromise: Promise<void> | undefined = undefined\n\tprivate pendingPostFinishOutputScopeScreenshotPatch: Promise<void> | undefined = undefined\n\n\tconstructor(\n\t\tconvoId: string,\n\t\tuserId: string,\n\t\ttraits: Record<string, string | number | boolean | null> | undefined,\n\t\tagentSource: Source[\"agent\"],\n\t\tprojectId: string,\n\t) {\n\t\tthis.convoId = convoId\n\t\tthis.userId = userId\n\t\tthis.properties = {\n\t\t\t...createInitialEventProperties(),\n\t\t\tagent_source: agentSource,\n\t\t\tproject_id: projectId,\n\t\t}\n\n\t\tlog.debug(\"Raindrop | convoId:\", convoId, \"eventId:\", this.eventId, { userId, traits })\n\n\t\tvoid raindrop.events\n\t\t\t.patch(this.eventId, {\n\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\tuserId: this.userId,\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\tisPending: true,\n\t\t\t\ttimestamp: this.startedAt,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error creating AI event\", this.eventId)\n\t\t\t})\n\n\t\tvoid raindrop.users.identify({ userId, traits: traits ?? {} }).catch(() => {\n\t\t\tlog.error(\"Error identifying Raindrop user\", userId)\n\t\t})\n\t}\n\n\ttraceEventId() {\n\t\treturn this.eventId\n\t}\n\n\tprivate pushJsonAttachment(name: string, role: Attachment[\"role\"], value: unknown) {\n\t\tthis.attachments.push({\n\t\t\ttype: \"text\",\n\t\t\trole,\n\t\t\tname,\n\t\t\tvalue: JSON.stringify(value),\n\t\t})\n\t}\n\n\ttelemetryOptions(): RaindropTelemetryOptions {\n\t\treturn {\n\t\t\texperimental_telemetry: {\n\t\t\t\tisEnabled: true,\n\t\t\t\tmetadata: createRaindropEventMetadata({\n\t\t\t\t\tuserId: this.userId,\n\t\t\t\t\teventId: this.eventId,\n\t\t\t\t\tconvoId: this.convoId,\n\t\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\t}),\n\t\t\t},\n\t\t}\n\t}\n\n\tbeginTurn({ contextMessages, visibleInput, selectionIds, reasoningEffort }: AgentInteractionStartTurnOptions) {\n\t\tthis.setInputSelectionIds(selectionIds)\n\t\tthis.setReasoningEffort(reasoningEffort)\n\t\tthis.setContextMessages(contextMessages)\n\t\tthis.setVisibleInput(visibleInput)\n\t}\n\n\tcreateStreamLifecycleHooks(\n\t\toptions?: AgentInteractionStreamLifecycleHookOptions,\n\t): AgentInteractionStreamLifecycleHooks {\n\t\treturn {\n\t\t\tonSystemPromptHash: this.setSystemPromptHash.bind(this),\n\t\t\tonSystemPromptSnapshot: this.setSystemPromptSnapshot.bind(this),\n\t\t\tonRawAssistantText: this.setGeneratedDSL.bind(this),\n\t\t\tonFirstToken: () => {\n\t\t\t\tthis.recordTTFT()\n\t\t\t\toptions?.onFirstToken?.()\n\t\t\t},\n\t\t}\n\t}\n\n\tasync recordTurnOutcome({\n\t\trequest,\n\t\tfinishReason,\n\t\tissues,\n\t\tinputTokens,\n\t\terror,\n\t}: AgentInteractionTurnOutcome): Promise<void> {\n\t\tif (issues) {\n\t\t\tthis.setIssueCounts({\n\t\t\t\terrorCount: issues.errorCount,\n\t\t\t\tparseErrorCount: issues.parseErrorCount,\n\t\t\t\trejectedCommandCount: issues.rejectedCommandCount,\n\t\t\t\twarningCount: issues.warningCount,\n\t\t\t})\n\t\t}\n\t\tthis.setInputTokens(inputTokens)\n\t\tthis.setInputImages(request.images)\n\t\tthis.setHarnessDisplayTimeline(createHarnessDisplayTimeline(request.state.messages))\n\t\tthis.setNormalizedSummary(createNormalizedAgentSummary(request, finishReason, inputTokens))\n\t\tif (error) {\n\t\t\tawait this.error(error)\n\t\t}\n\t\tawait this.finish(finishReason)\n\t}\n\n\trecordTTFT() {\n\t\tif (this.recordedTTFT) return\n\t\tthis.recordedTTFT = true\n\t\tthis.properties.time_to_first_token = performance.now() - this.submitTime\n\t}\n\n\tsetVisibleInput(input: string) {\n\t\tconst normalizedInput = input.trim()\n\t\tif (normalizedInput.length === 0 || normalizedInput === this.latestVisibleInput) return\n\t\tthis.latestVisibleInput = normalizedInput\n\t\tconst pendingVisibleInputPatch = raindrop.events\n\t\t\t.patch(this.eventId, {\n\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\tuserId: this.userId,\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\tinput: normalizedInput,\n\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\tisPending: true,\n\t\t\t\ttimestamp: this.startedAt,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error updating AI event input\", this.eventId)\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (this.pendingVisibleInputPatch === pendingVisibleInputPatch) {\n\t\t\t\t\tthis.pendingVisibleInputPatch = undefined\n\t\t\t\t}\n\t\t\t})\n\t\tthis.pendingVisibleInputPatch = pendingVisibleInputPatch\n\t}\n\n\tprivate async trackAssistantOutputUpdate(output: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait raindrop.events.patch(this.eventId, {\n\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\tuserId: this.userId,\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\toutput,\n\t\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t\t\tisPending: true,\n\t\t\t\ttimestamp: this.startedAt,\n\t\t\t})\n\t\t\treturn true\n\t\t} catch {\n\t\t\tlog.error(\"Error updating AI event output\", this.eventId)\n\t\t\treturn false\n\t\t}\n\t}\n\n\trecordVisibleOutput(output: string) {\n\t\tconst normalizedOutput = output.trim()\n\t\tif (normalizedOutput.length === 0 || normalizedOutput === this.latestVisibleOutput) return\n\t\tthis.latestVisibleOutput = normalizedOutput\n\t\tvoid this.flushVisibleOutput()\n\t}\n\n\tprivate async flushVisibleOutput() {\n\t\tif (this.pendingVisibleOutputPatch) return this.pendingVisibleOutputPatch\n\n\t\tthis.pendingVisibleOutputPatch = (async () => {\n\t\t\twhile (this.lastTrackedVisibleOutput !== this.latestVisibleOutput) {\n\t\t\t\tconst output = this.latestVisibleOutput\n\t\t\t\tif (output.length === 0) return\n\n\t\t\t\tconst didTrack = await this.trackAssistantOutputUpdate(output)\n\t\t\t\tthis.lastTrackedVisibleOutput = output\n\t\t\t\tif (!didTrack) return\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tthis.pendingVisibleOutputPatch = undefined\n\t\t\tif (this.lastTrackedVisibleOutput !== this.latestVisibleOutput) void this.flushVisibleOutput()\n\t\t})\n\n\t\treturn this.pendingVisibleOutputPatch\n\t}\n\n\t/** Ensures no `isPending` output patch is still in flight before we finalize the event. */\n\tprivate async awaitPendingVisibleOutputPatches(): Promise<void> {\n\t\twhile (true) {\n\t\t\tawait this.flushVisibleOutput()\n\t\t\tif (!this.pendingVisibleOutputPatch && this.lastTrackedVisibleOutput === this.latestVisibleOutput) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tsetIssueCounts(counts?: AgentIssueCounts) {\n\t\tif (!counts) return\n\t\tthis.properties = {\n\t\t\t...this.properties,\n\t\t\terror_count: counts.errorCount,\n\t\t\tparse_error_count: counts.parseErrorCount,\n\t\t\trejected_command_count: counts.rejectedCommandCount,\n\t\t\twarning_count: counts.warningCount,\n\t\t\ttotal_issues: counts.errorCount + counts.warningCount,\n\t\t}\n\t}\n\n\tsetSystemPromptHash(hash: string) {\n\t\tif (hash.length === 0) return\n\t\tthis.properties.system_prompt = hash\n\t}\n\n\tsetSystemPromptSnapshot(prompt: string) {\n\t\tif (prompt.length === 0) return\n\t\tthis.systemPromptSnapshot = prompt\n\t}\n\n\tsetContextMessages(contextMessages: readonly string[]) {\n\t\tthis.contextAttachments.length = 0\n\t\tif (contextMessages.length === 0) return\n\t\tthis.contextAttachments.push({\n\t\t\ttype: \"text\",\n\t\t\trole: \"input\",\n\t\t\tname: \"context_messages.xml\",\n\t\t\tvalue: contextMessages.join(\"\\n\\n\"),\n\t\t})\n\t}\n\n\tsetInputTokens(inputTokens: number | undefined) {\n\t\tif (inputTokens === undefined) return\n\t\tthis.properties.input_tokens = inputTokens\n\n\t\tif (inputTokens <= 200_000) return\n\t\tvoid raindrop.signals\n\t\t\t.track({\n\t\t\t\teventId: this.eventId,\n\t\t\t\tname: withDevelopmentPrefix(\"High Input Tokens\"),\n\t\t\t\ttype: \"feedback\",\n\t\t\t\tsentiment: \"NEGATIVE\",\n\t\t\t\tcomment: `${inputTokens} input tokens`,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error tracking high-input signal\", this.eventId)\n\t\t\t})\n\t}\n\n\tsetReasoningEffort(reasoningEffort: OpenRouterProviderOptions[\"reasoning\"]) {\n\t\tif (!reasoningEffort) return\n\t\tthis.pushJsonAttachment(\"model_reasoning.json\", \"input\", reasoningEffort)\n\t}\n\n\tsetInputSelectionIds(selectionIds: readonly string[]) {\n\t\tif (selectionIds.length === 0) return\n\t\tthis.properties.input_selection_count = selectionIds.length\n\t\tthis.pushJsonAttachment(\"input_selection_ids.json\", \"input\", selectionIds)\n\t}\n\n\tsetInputImages(images: readonly AgentAttachmentImage[]) {\n\t\tthis.inputImageAttachments.length = 0\n\t\tif (images.length === 0) return\n\n\t\tconst imageUrls = new Set<string>()\n\t\tfor (const image of images) {\n\t\t\tconst { referenceUrl } = getImageUrls(image)\n\t\t\tif (imageUrls.has(referenceUrl)) continue\n\n\t\t\timageUrls.add(referenceUrl)\n\t\t\tthis.inputImageAttachments.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\trole: \"input\",\n\t\t\t\tname: getInputImageAttachmentName(image, this.inputImageAttachments.length + 1),\n\t\t\t\tvalue: referenceUrl,\n\t\t\t})\n\t\t}\n\t}\n\n\tsetGeneratedDSL(commands: readonly string[]) {\n\t\tif (commands.length === 0) return\n\t\tthis.generatedDSL = commands\n\t}\n\n\tsetHarnessDisplayTimeline(entries: readonly HarnessDisplayTimelineEntry[]) {\n\t\tthis.harnessDisplayTimeline = entries\n\t}\n\n\tsetNormalizedSummary(summary: NormalizedAgentTurnSummary) {\n\t\tthis.normalizedSummary = summary\n\t}\n\n\tasync captureAffectedOutputNodeScreenshots(\n\t\taffectedNodeIds: ReadonlySet<NodeID>,\n\t\tscreenshotter: OutputScopeScreenshotter,\n\t) {\n\t\tlog.info(\"captureAffectedOutputNodeScreenshots\", affectedNodeIds)\n\t\tif (affectedNodeIds.size === 0) return\n\n\t\tconst screenshotTargets = Array.from(affectedNodeIds, nodeId => ({\n\t\t\trequestId: nodeId,\n\t\t\tattachmentName: getScreenshotTargetName(screenshotter, nodeId),\n\t\t}))\n\t\tlog.info(\"screenshotTargets\", screenshotTargets)\n\t\tconst screenshotRequests = screenshotTargets.map(({ requestId, attachmentName }) => ({\n\t\t\trequestId,\n\t\t\tattachmentName,\n\t\t\trequest: createOutputScopeScreenshotRequest(screenshotter, requestId),\n\t\t}))\n\t\tconst screenshotUpdates = screenshotRequests.map(({ requestId, attachmentName, request }) =>\n\t\t\tthis.recordOutputScopeScreenshot(requestId, attachmentName, request),\n\t\t)\n\n\t\tawait screenshotter.flushRequests()\n\t\tawait Promise.all(screenshotUpdates)\n\t}\n\n\tprivate async recordOutputScopeScreenshot(\n\t\trequestId: NodeID,\n\t\tattachmentName: string,\n\t\trequest: Promise<ScreenshotResponse | undefined>,\n\t): Promise<void> {\n\t\tconst screenshot = await request\n\t\tlog.info(\"screenshot\", requestId, screenshot)\n\t\tif (!screenshot) return\n\n\t\tlog.info(\"created screenshot\", requestId, screenshot)\n\t\tif (!isNodeScreenshotResult(screenshot)) return\n\n\t\tthis.outputScopeScreenshots.set(screenshot.id, { imageUrl: screenshot.image_url, attachmentName })\n\t\tthis.outputScopeScreenshotVersion++\n\n\t\tif (this.finishPromise) {\n\t\t\tvoid this.flushPostFinishOutputScopeScreenshots()\n\t\t}\n\t}\n\n\tcreateSubcall(step: string, properties?: Record<string, unknown>) {\n\t\tconst subcall = new AgentSubcallTelemetry({\n\t\t\tuserId: this.userId,\n\t\t\tconvoId: this.convoId,\n\t\t\tstep,\n\t\t\tparentEventId: this.eventId,\n\t\t\tproperties,\n\t\t})\n\t\tthis.subcallCount++\n\t\treturn subcall\n\t}\n\n\terror(error: Error) {\n\t\tlog.reportError(error)\n\t\tlog.info(\"Raindrop error signal | convoId:\", this.convoId, \"eventId:\", this.eventId, {\n\t\t\terrorName: error.name,\n\t\t})\n\t\treturn raindrop.signals\n\t\t\t.track({\n\t\t\t\teventId: this.eventId,\n\t\t\t\tname: withDevelopmentPrefix(`ERROR: ${error.name ?? \"Unknown Error\"}`),\n\t\t\t\ttype: \"standard\",\n\t\t\t\tsentiment: \"NEGATIVE\",\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error tracking AI error signal\", this.eventId)\n\t\t\t})\n\t}\n\n\tprivate getVisibleInput(): string | undefined {\n\t\treturn this.latestVisibleInput.trim() || undefined\n\t}\n\n\tprivate getVisibleOutput(): string | undefined {\n\t\tconst accumulatedVisibleOutput = this.latestVisibleOutput.trim()\n\t\tconst summaryVisibleOutput = this.normalizedSummary?.final_visible_text?.trim()\n\t\treturn accumulatedVisibleOutput.length > 0\n\t\t\t? accumulatedVisibleOutput\n\t\t\t: summaryVisibleOutput && summaryVisibleOutput.length > 0\n\t\t\t\t? summaryVisibleOutput\n\t\t\t\t: undefined\n\t}\n\n\tprivate buildOutputScopeScreenshotAttachments(): Attachment[] {\n\t\tconst attachments: Attachment[] = []\n\t\tfor (const { imageUrl, attachmentName } of this.outputScopeScreenshots.values()) {\n\t\t\tattachments.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\trole: \"output\",\n\t\t\t\tname: attachmentName,\n\t\t\t\tvalue: imageUrl,\n\t\t\t})\n\t\t}\n\t\treturn attachments\n\t}\n\n\tprivate buildFinishAttachments(): Attachment[] {\n\t\tconst attachments = [...this.attachments]\n\n\t\tif (this.inputImageAttachments.length > 0) {\n\t\t\tattachments.push(...this.inputImageAttachments)\n\t\t}\n\t\tif (this.contextAttachments.length > 0) {\n\t\t\tattachments.push(...this.contextAttachments)\n\t\t}\n\t\tif (this.systemPromptSnapshot) {\n\t\t\tattachments.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\trole: \"input\",\n\t\t\t\tname: \"system_prompt.txt\",\n\t\t\t\tvalue: this.systemPromptSnapshot,\n\t\t\t})\n\t\t}\n\t\tif (this.generatedDSL && this.generatedDSL.length > 0) {\n\t\t\tattachments.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\trole: \"output\",\n\t\t\t\tname: \"generated_dsl.txt\",\n\t\t\t\tvalue: this.generatedDSL.join(\"\\n\"),\n\t\t\t})\n\t\t}\n\t\tattachments.push(...this.buildOutputScopeScreenshotAttachments())\n\t\tif (this.harnessDisplayTimeline && this.harnessDisplayTimeline.length > 0) {\n\t\t\tattachments.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\trole: \"output\",\n\t\t\t\tname: \"harness_display_timeline.json\",\n\t\t\t\tvalue: JSON.stringify(this.harnessDisplayTimeline),\n\t\t\t})\n\t\t}\n\n\t\treturn attachments\n\t}\n\n\tprivate buildFinalizedEventState(finishReason: NonNullable<EventProperties[\"finish_reason\"]>): FinalizedEventState {\n\t\tthis.properties.total_duration = performance.now() - this.submitTime\n\t\tthis.properties.finish_reason = finishReason\n\n\t\tif (this.normalizedSummary) {\n\t\t\tconst summary = {\n\t\t\t\t...this.normalizedSummary,\n\t\t\t\tsubcall_count: this.subcallCount,\n\t\t\t} satisfies NormalizedAgentTurnSummary\n\t\t\tconst { final_visible_text: _finalVisibleText, model: _model, ...summaryProperties } = summary\n\n\t\t\tthis.properties = {\n\t\t\t\t...this.properties,\n\t\t\t\t...summaryProperties,\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tinput: this.getVisibleInput(),\n\t\t\toutput: this.getVisibleOutput(),\n\t\t\tmodel: this.normalizedSummary?.model,\n\t\t\tproperties: toRaindropProperties(this.properties),\n\t\t}\n\t}\n\n\tprivate async flushPostFinishOutputScopeScreenshots(): Promise<void> {\n\t\tif (!this.finishPromise) return\n\t\tif (this.pendingPostFinishOutputScopeScreenshotPatch) return this.pendingPostFinishOutputScopeScreenshotPatch\n\n\t\tthis.pendingPostFinishOutputScopeScreenshotPatch = (async () => {\n\t\t\tawait this.finishPromise\n\t\t\tif (!this.finalizedEventState) return\n\n\t\t\twhile (this.flushedOutputScopeScreenshotVersion < this.outputScopeScreenshotVersion) {\n\t\t\t\tconst targetVersion = this.outputScopeScreenshotVersion\n\t\t\t\tconst attachments = this.buildOutputScopeScreenshotAttachments()\n\t\t\t\tif (attachments.length === 0) {\n\t\t\t\t\tthis.flushedOutputScopeScreenshotVersion = targetVersion\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait raindrop.events.patch(this.eventId, {\n\t\t\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\t\t\tuserId: this.userId,\n\t\t\t\t\t\tconvoId: this.convoId,\n\t\t\t\t\t\tinput: this.finalizedEventState.input,\n\t\t\t\t\t\toutput: this.finalizedEventState.output,\n\t\t\t\t\t\tmodel: this.finalizedEventState.model,\n\t\t\t\t\t\tproperties: this.finalizedEventState.properties,\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\tisPending: false,\n\t\t\t\t\t\ttimestamp: this.startedAt,\n\t\t\t\t\t})\n\t\t\t\t\tthis.flushedOutputScopeScreenshotVersion = targetVersion\n\t\t\t\t} catch {\n\t\t\t\t\tlog.error(\"Error patching AI event attachments after finish\", this.eventId)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tthis.pendingPostFinishOutputScopeScreenshotPatch = undefined\n\t\t\tif (this.finalizedEventState && this.flushedOutputScopeScreenshotVersion < this.outputScopeScreenshotVersion) {\n\t\t\t\tvoid this.flushPostFinishOutputScopeScreenshots()\n\t\t\t}\n\t\t})\n\n\t\treturn this.pendingPostFinishOutputScopeScreenshotPatch\n\t}\n\n\tprivate async finishInternal(finishReason: NonNullable<EventProperties[\"finish_reason\"]>) {\n\t\tawait this.pendingVisibleInputPatch\n\t\tawait this.awaitPendingVisibleOutputPatches()\n\t\tconst finalizedEventState = this.buildFinalizedEventState(finishReason)\n\t\tconst attachments = this.buildFinishAttachments()\n\t\tconst flushedScreenshotVersion = this.outputScopeScreenshotVersion\n\t\tlet didUploadFinishAttachments = attachments.length === 0\n\n\t\tlog.info(\"Raindrop finish | convoId:\", this.convoId, \"eventId:\", this.eventId, {\n\t\t\tfinishReason,\n\t\t\tsubcallCount: this.subcallCount,\n\t\t\tattachmentCount: attachments.length,\n\t\t})\n\n\t\tif (attachments.length > 0) {\n\t\t\tdidUploadFinishAttachments = await addEventAttachments(this.eventId, attachments, {\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\tsource: \"event\",\n\t\t\t})\n\t\t}\n\n\t\t// Persist finalized input/properties before finish. Short or cancelled turns can end\n\t\t// before incremental Raindrop writes settle, so resend the latest input here.\n\t\tawait raindrop.events\n\t\t\t.patch(this.eventId, {\n\t\t\t\teventName: withDevelopmentPrefix(submitMessageEvent),\n\t\t\t\tuserId: this.userId,\n\t\t\t\tconvoId: this.convoId,\n\t\t\t\tinput: finalizedEventState.input,\n\t\t\t\tproperties: finalizedEventState.properties,\n\t\t\t\tisPending: true,\n\t\t\t\ttimestamp: this.startedAt,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error updating AI event properties before finish\", this.eventId)\n\t\t\t})\n\n\t\tawait raindrop.events\n\t\t\t.finish(this.eventId, {\n\t\t\t\toutput: finalizedEventState.output,\n\t\t\t\tmodel: finalizedEventState.model,\n\t\t\t\tproperties: finalizedEventState.properties,\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tlog.error(\"Error finishing AI event\", this.eventId)\n\t\t\t})\n\n\t\tthis.finalizedEventState = finalizedEventState\n\t\tif (didUploadFinishAttachments) {\n\t\t\tthis.flushedOutputScopeScreenshotVersion = flushedScreenshotVersion\n\t\t}\n\n\t\tif (this.flushedOutputScopeScreenshotVersion < this.outputScopeScreenshotVersion) {\n\t\t\tvoid this.flushPostFinishOutputScopeScreenshots()\n\t\t}\n\t}\n\n\tasync finish(finishReason: NonNullable<EventProperties[\"finish_reason\"]>) {\n\t\tthis.finishPromise ??= this.finishInternal(finishReason)\n\t\treturn this.finishPromise\n\t}\n}\n\nexport function createAgentInteraction(\n\tconvoId: string,\n\tuser: CurrentUser | undefined,\n\tagentSource: Source[\"agent\"],\n\tprojectId: string,\n\toptions?: { disableRaindropTelemetry?: boolean },\n): AgentInteractionHandle {\n\tconst userId = user?.id ?? \"no-engine-exists\"\n\tconst defaultSpace = user?.spaces.find(space => space.id === user.defaultSpaceId)\n\tconst plan = !user ? null : defaultSpace?.scope === \"organization\" ? (defaultSpace.license.type ?? null) : \"personal\"\n\tconst traits = user\n\t\t? {\n\t\t\t\temail: user.email,\n\t\t\t\tplan,\n\t\t\t\tisFramerEmployee: user.isFramerEmployee ?? isFramerEmployee(user.email),\n\t\t\t}\n\t\t: undefined\n\n\tif (!user || options?.disableRaindropTelemetry === true) {\n\t\treturn createNoopAgentInteraction()\n\t}\n\n\treturn new AgentInteraction(convoId, userId, traits, agentSource, projectId)\n}\n", "import type { LanguageModelUsage } from \"ai\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { LanguageModel } from \"../languageModels.ts\"\n\n/**\n * List-price USD per 1M tokens (prompt / completion), aligned with OpenRouter\u2019s public\n * model pages where available. Used only when the provider omits `usage.cost` in metadata\n * (for example Framer\u2019s AI proxy). Estimates are approximate; tiered or long-context pricing\n * is not modeled.\n *\n * `cacheRead`: USD per 1M cached read tokens (OpenAI-style prompt cache). When present and\n * `inputTokenDetails.cacheReadTokens` is set, non-cached prompt tokens are billed at `prompt`\n * and cached reads at `cacheRead`.\n */\ninterface ModelUsdPerMillion {\n\tprompt: number\n\tcompletion: number\n\tcacheRead?: number\n}\n\nconst usdPerMillionByModel = {\n\t[LanguageModel.CheapAndFast]: { prompt: 1, completion: 2 },\n\t[LanguageModel.SmartButExpensive]: { prompt: 30, completion: 60 },\n\t[LanguageModel.OmniModel]: { prompt: 5, completion: 15 },\n\t[LanguageModel.OmniModelMini]: { prompt: 0.15, completion: 0.6 },\n\n\t[LanguageModel.GeminiFlash20]: { prompt: 0.1, completion: 0.4 },\n\t[LanguageModel.GeminiFlash25]: { prompt: 0.3, completion: 2.5 },\n\t[LanguageModel.GeminiFlash25Lite]: { prompt: 0.1, completion: 0.4 },\n\t[LanguageModel.Gemini25Pro]: { prompt: 1.25, completion: 10 },\n\t[LanguageModel.Gemini3Flash]: { prompt: 0.3, completion: 2.5 },\n\t[LanguageModel.Gemini31Pro]: { prompt: 2, completion: 12 },\n\t[LanguageModel.Gemini31FlashLite]: { prompt: 0.18, completion: 1.5 },\n\t[LanguageModel.Gemini35Flash]: { prompt: 1.5, completion: 9, cacheRead: 0.15 },\n\t[LanguageModel.Qwen36Flash]: { prompt: 0.25, completion: 1.5, cacheRead: 0.025 },\n\n\t[LanguageModel.GPT41]: { prompt: 2, completion: 8 },\n\t[LanguageModel.GPT51]: { prompt: 1.25, completion: 10 },\n\t[LanguageModel.GPT52]: { prompt: 1.75, completion: 14 },\n\t[LanguageModel.GPT52Codex]: { prompt: 1.75, completion: 14 },\n\t[LanguageModel.GPT51CodexMini]: { prompt: 0.5, completion: 3 },\n\t[LanguageModel.GPT53Codex]: { prompt: 2, completion: 15 },\n\t[LanguageModel.GPT54]: { prompt: 2.5, completion: 15, cacheRead: 0.25 },\n\t[LanguageModel.GPT55]: { prompt: 5, completion: 30 },\n\t[LanguageModel.GPTNEXT]: { prompt: 5, completion: 30 },\n\t[LanguageModel.GPT54Mini]: { prompt: 0.75, completion: 4.5, cacheRead: 0.075 },\n\n\t[LanguageModel.ClaudeHaiku45]: { prompt: 1, completion: 5 },\n\t[LanguageModel.ClaudeSonnet45]: { prompt: 3, completion: 15 },\n\t[LanguageModel.ClaudeSonnet46]: { prompt: 3, completion: 15 },\n\t[LanguageModel.ClaudeOpus45]: { prompt: 15, completion: 75 },\n\t[LanguageModel.ClaudeOpus46]: { prompt: 15, completion: 75 },\n\t[LanguageModel.ClaudeOpus47]: { prompt: 15, completion: 75 },\n\t[LanguageModel.ClaudeOpus48]: { prompt: 15, completion: 75 },\n\n\t[LanguageModel.DeepSeekV4Pro]: { prompt: 0.435, completion: 0.87, cacheRead: 0.003625 },\n\t[LanguageModel.DeepSeekV4Flash]: { prompt: 0.14, completion: 0.28 },\n\t[LanguageModel.KimiK25]: { prompt: 0.6, completion: 3, cacheRead: 0.12 },\n\t[LanguageModel.KimiK26]: { prompt: 0.95, completion: 4, cacheRead: 0.16 },\n\t[LanguageModel.Qwen3VL235B]: { prompt: 0.2, completion: 0.88, cacheRead: 0.11 },\n\t[LanguageModel.GPTOOS120B]: { prompt: 0.039, completion: 0.19 },\n\t[LanguageModel.GPTOOS20B]: { prompt: 0.03, completion: 0.14 },\n\n\t[LanguageModel.Contour]: { prompt: 0, completion: 0 },\n} as const satisfies Record<LanguageModel, ModelUsdPerMillion>\n\nfunction usageHasTokenBreakdown(usage: LanguageModelUsage): boolean {\n\treturn usage.inputTokens !== undefined || usage.outputTokens !== undefined\n}\n\n/**\n * Best-effort USD from list prices and token counts. Returns 0 if usage has no in/out breakdown.\n */\nexport function estimateLanguageModelUsdCost(model: LanguageModel, usage: LanguageModelUsage | undefined): number {\n\tif (!usage || !usageHasTokenBreakdown(usage)) return 0\n\n\tconst rates: ModelUsdPerMillion = usdPerMillionByModel[model]\n\tconst inTok = usage.inputTokens ?? 0\n\tconst outTok = usage.outputTokens ?? 0\n\tconst cacheRead = usage.inputTokenDetails?.cacheReadTokens ?? 0\n\tconst uncachedIn = Math.max(0, inTok - cacheRead)\n\n\tlet usd: number = 0\n\tif (rates.cacheRead !== undefined && cacheRead > 0) {\n\t\tusd = (uncachedIn * rates.prompt + cacheRead * rates.cacheRead + outTok * rates.completion) / 1_000_000\n\t} else {\n\t\tusd = (inTok * rates.prompt + outTok * rates.completion) / 1_000_000\n\t}\n\treturn usd\n}\n\n/**\n * Resolve the total USD for an agent turn (debug bar / status bar).\n *\n * The primary-model cost prefers provider-reported OpenRouter USD when present, otherwise it\n * falls back to a list-price estimate from token usage. Sub-model costs (accrued by tool calls\n * such as `analyze`/`search`) are tracked separately by the stream and always added on top so\n * we don't confuse them with the main model's cost \u2014 important for providers that don't report\n * cost (e.g. direct OpenAI Responses), where `providerReportedCost` is always 0 even though\n * sub-model tools may have charged something.\n */\nexport function resolveAgentTurnUsdCost(\n\tproviderReportedCost: number,\n\tsubModelCost: number,\n\tmodel: LanguageModel | undefined,\n\tusage: LanguageModelUsage | undefined,\n): number {\n\tlet primaryCost = 0\n\tif (providerReportedCost > 0) {\n\t\tprimaryCost = providerReportedCost\n\t} else if (!isUndefined(model)) {\n\t\tprimaryCost = estimateLanguageModelUsdCost(model, usage)\n\t}\n\treturn primaryCost + subModelCost\n}\n", "import type { LanguageModelUsage, ModelMessage } from \"ai\"\nimport type { LatestAgentSchemas } from \"document/agentSnapshotMigration/schemas.ts\"\nimport type { Changeset } from \"document/models/CanvasTree/Changeset.ts\"\nimport { isNumber, isObject, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { cloneContextRuntimeState } from \"./context/AgentContext.ts\"\nimport type { ToolStep } from \"./messages.ts\"\nimport type { RequestCodeFileHistoryChange } from \"./tools/requestCodeFileChanges.ts\"\nimport type { AgentRequest } from \"./types.ts\"\n\ntype PersistedAgentRequest = LatestAgentSchemas.PersistedAgentSnapshot[\"history\"][number]\ntype PersistedSerializedChangeset = NonNullable<NonNullable<PersistedAgentRequest[\"changeset\"]>[number]>\n\nexport function hydratePersistedAgentRequest(\n\trequest: PersistedAgentRequest,\n\trestoreChangeset: (serializedChangeset: PersistedSerializedChangeset) => Changeset | undefined,\n): AgentRequest {\n\treturn {\n\t\t...request,\n\t\tfiles: request.files ?? [],\n\t\tsteps: request.steps.map(hydrateToolStep),\n\t\tcrdtSnapshot: hydrateCrdtSnapshot(request.crdtSnapshot),\n\t\tcodeFileChanges: hydrateCodeFileChanges(request.codeFileChanges),\n\t\trevertedCodeFileChanges: hydrateCodeFileChanges(request.revertedCodeFileChanges),\n\t\tusage: hydrateLanguageModelUsage(request.usage),\n\t\tinitialUsage: hydrateLanguageModelUsage(request.initialUsage),\n\t\tchangeset: request.changeset\n\t\t\t?.map(restoreChangeset)\n\t\t\t.filter((changeset): changeset is Changeset => !isUndefined(changeset)),\n\t\trevertedChangeset: request.revertedChangeset\n\t\t\t?.map(restoreChangeset)\n\t\t\t.filter((changeset): changeset is Changeset => !isUndefined(changeset)),\n\t\taborted: normalizeHydratedAborted(request.aborted, request.done),\n\t\tdone: true, // Hydrate interrupted requests as done so that they are not considered generating.\n\t\tcost: undefined, // Don't carry over cost from previous sessions so the debug bar resets.\n\t}\n}\n\nfunction hydrateToolStep(step: PersistedAgentRequest[\"steps\"][number]): ToolStep {\n\tconst { content, toolResults, metadata: persistedMetadata, raw: persistedRaw, ...rest } = step\n\tconst raw = hydrateRawModelMessages(persistedRaw)\n\n\tconst hydratedStep: ToolStep = {\n\t\t...rest,\n\t\tcontent: [...content],\n\t\ttoolResults: [...toolResults],\n\t\tmetadata: {\n\t\t\tproviderMetadata: persistedMetadata.providerMetadata,\n\t\t\tusage: hydrateLanguageModelUsage(persistedMetadata.usage),\n\t\t\tbeforeMessageCount: persistedMetadata.beforeMessageCount,\n\t\t\tcrdtSnapshot: persistedMetadata.crdtSnapshot\n\t\t\t\t? hydrateStepCrdtSnapshot(persistedMetadata.crdtSnapshot)\n\t\t\t\t: undefined,\n\t\t},\n\t}\n\n\tif (raw) hydratedStep.raw = raw\n\treturn hydratedStep\n}\n\nfunction hydrateStepCrdtSnapshot(\n\tcrdtSnapshot: NonNullable<PersistedAgentRequest[\"steps\"][number][\"metadata\"][\"crdtSnapshot\"]>,\n): NonNullable<ToolStep[\"metadata\"][\"crdtSnapshot\"]> {\n\tconst hydrated: NonNullable<ToolStep[\"metadata\"][\"crdtSnapshot\"]> = {}\n\thydrated.beforeRowIndex = crdtSnapshot.beforeRowIndex\n\thydrated.afterRowIndex = crdtSnapshot.afterRowIndex\n\tif (crdtSnapshot.afterRuntimeState) {\n\t\thydrated.afterRuntimeState = cloneContextRuntimeState(crdtSnapshot.afterRuntimeState)\n\t}\n\treturn hydrated\n}\n\nfunction hydrateCrdtSnapshot(crdtSnapshot: PersistedAgentRequest[\"crdtSnapshot\"]): AgentRequest[\"crdtSnapshot\"] {\n\tif (!crdtSnapshot) return undefined\n\treturn { turnEndRowIndex: crdtSnapshot.turnEndRowIndex }\n}\n\nexport function hydrateLanguageModelUsages(\n\tusage: LatestAgentSchemas.PersistedAgentSnapshot[\"usage\"],\n): LanguageModelUsage[] {\n\treturn usage.map(hydrateLanguageModelUsage).filter((value): value is LanguageModelUsage => !isUndefined(value))\n}\n\nexport function normalizeHydratedState(\n\tstate: LatestAgentSchemas.PersistedAgentSnapshot[\"state\"],\n\thistoryLength: number,\n): \"idle\" | \"follow-up\" | \"error\" {\n\tif (state === \"error\") return \"error\"\n\treturn historyLength > 0 ? \"follow-up\" : \"idle\"\n}\n\nfunction normalizeHydratedAborted(\n\taborted: AgentRequest[\"aborted\"] | undefined,\n\tdone: boolean,\n): AgentRequest[\"aborted\"] | undefined {\n\tif (aborted) return aborted\n\tif (done) return undefined\n\n\t// If a request is not done, and no aborted reason recorded, treat it as an unknown error. This\n\t// could happen if the user refresh the tab while the request is still in progress.\n\treturn { reason: \"unknown\" }\n}\n\nfunction hydrateRawModelMessages(raw: readonly unknown[] | undefined): readonly ModelMessage[] | undefined {\n\treturn raw?.filter(isModelMessage)\n}\n\nfunction isModelMessage(message: unknown): message is ModelMessage {\n\treturn (\n\t\tisObject(message) &&\n\t\t(message.role === \"system\" || message.role === \"user\" || message.role === \"assistant\" || message.role === \"tool\") &&\n\t\t\"content\" in message\n\t)\n}\n\nfunction hydrateCodeFileChanges(\n\tcodeFileChanges: PersistedAgentRequest[\"codeFileChanges\"],\n): AgentRequest[\"codeFileChanges\"] {\n\treturn codeFileChanges?.filter(isRequestCodeFileHistoryChange).map(codeFileChange => ({ ...codeFileChange }))\n}\n\nfunction hydrateLanguageModelUsage(value: unknown): LanguageModelUsage | undefined {\n\tif (!isObject(value)) return undefined\n\n\tconst inputTokenDetails: LanguageModelUsage[\"inputTokenDetails\"] = {\n\t\tnoCacheTokens: undefined,\n\t\tcacheReadTokens: undefined,\n\t\tcacheWriteTokens: undefined,\n\t}\n\tif (isObject(value.inputTokenDetails)) {\n\t\tif (isNumber(value.inputTokenDetails.noCacheTokens)) {\n\t\t\tinputTokenDetails.noCacheTokens = value.inputTokenDetails.noCacheTokens\n\t\t}\n\t\tif (isNumber(value.inputTokenDetails.cacheReadTokens)) {\n\t\t\tinputTokenDetails.cacheReadTokens = value.inputTokenDetails.cacheReadTokens\n\t\t}\n\t\tif (isNumber(value.inputTokenDetails.cacheWriteTokens)) {\n\t\t\tinputTokenDetails.cacheWriteTokens = value.inputTokenDetails.cacheWriteTokens\n\t\t}\n\t}\n\n\tconst outputTokenDetails: LanguageModelUsage[\"outputTokenDetails\"] = {\n\t\ttextTokens: undefined,\n\t\treasoningTokens: undefined,\n\t}\n\tif (isObject(value.outputTokenDetails)) {\n\t\tif (isNumber(value.outputTokenDetails.textTokens)) {\n\t\t\toutputTokenDetails.textTokens = value.outputTokenDetails.textTokens\n\t\t}\n\t\tif (isNumber(value.outputTokenDetails.reasoningTokens)) {\n\t\t\toutputTokenDetails.reasoningTokens = value.outputTokenDetails.reasoningTokens\n\t\t}\n\t}\n\n\tconst usage: LanguageModelUsage = {\n\t\tinputTokens: undefined,\n\t\toutputTokens: undefined,\n\t\ttotalTokens: undefined,\n\t\tinputTokenDetails,\n\t\toutputTokenDetails,\n\t}\n\tif (isNumber(value.inputTokens)) usage.inputTokens = value.inputTokens\n\tif (isNumber(value.outputTokens)) usage.outputTokens = value.outputTokens\n\tif (isNumber(value.totalTokens)) usage.totalTokens = value.totalTokens\n\treturn usage\n}\n\nfunction isRequestCodeFileHistoryChange(value: unknown): value is RequestCodeFileHistoryChange {\n\tif (!isObject(value) || !isString(value.localId) || !isString(value.moduleId)) return false\n\n\tswitch (value.operation) {\n\t\tcase \"create_file\":\n\t\t\treturn isString(value.saveId)\n\t\tcase \"update_file\":\n\t\t\treturn isString(value.saveId) && isString(value.saveIdBeforeChange)\n\t\tcase \"delete_file\":\n\t\t\treturn isString(value.saveIdBeforeChange)\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { MaybeCanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport {\n\tisCollectionNode,\n\tisLinkStylePresetNode,\n\tisSmartComponentNode,\n\tisTextStylePresetNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport pluralize from \"pluralize\"\nimport { getCollectionNameForPage } from \"../utils/siteMap.ts\"\nimport { getCommandCollectionTargetId, getCommandTargetIds, getNodeIdForPossiblyVirtualId } from \"./commandTargets.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { isVirtualNodeId } from \"./context/richtext/document.ts\"\nimport { countChangedDiffLines } from \"./diffLines.ts\"\nimport type { Command } from \"./dsl.ts\"\nimport { CommandType } from \"./dsl.ts\"\nimport { getNameValue } from \"./traits/name.ts\"\nimport type { AgentChange, AgentChangeKind, AgentRequest, CodePatchOperation, TransientTurnMessage } from \"./types.ts\"\n\ninterface CommandSummary {\n\tid: NodeID\n\tname: string\n\tkind: AgentChangeKind\n\tchangeKey: string\n}\n\nexport function buildAgentSummaryForRequest(request: AgentRequest, ctx: AgentContext): readonly AgentChange[] {\n\tconst changesById = new Map<NodeID, CommandSummary & { changes: number; seenChangeKeys: Set<string> }>()\n\n\t// Track nodes added under virtual parents so subsequent updates on the same\n\t// node ID can be collapsed to the parent richtext node.\n\tconst virtualChildIds = new Map<string, NodeID>()\n\n\tlet lastScopeId: NodeID | undefined\n\tfor (const message of request.state.messages) {\n\t\tif (message.type !== \"command\") continue\n\t\tif (message.failed) continue\n\n\t\tconst command = message.command\n\t\tif (command.type === CommandType.Add) {\n\t\t\tconst parentId = command.attributes.parent\n\t\t\tif (parentId && isVirtualNodeId(parentId)) {\n\t\t\t\tvirtualChildIds.set(command.attributes.id, getNodeIdForPossiblyVirtualId(parentId))\n\t\t\t}\n\t\t}\n\n\t\tconst fallbackScopeId = lastScopeId ?? request.scopeId\n\t\tconst summary = getCommandMessageSummary(message, ctx, fallbackScopeId, virtualChildIds)\n\t\tif (!summary) continue\n\t\tif (summary.kind === \"page\" || summary.kind === \"component\") lastScopeId = summary.id\n\n\t\tconst existing = changesById.get(summary.id)\n\t\tif (existing) {\n\t\t\tif (!existing.seenChangeKeys.has(summary.changeKey)) {\n\t\t\t\texisting.seenChangeKeys.add(summary.changeKey)\n\t\t\t\texisting.changes += 1\n\t\t\t}\n\t\t} else {\n\t\t\tchangesById.set(summary.id, {\n\t\t\t\t...summary,\n\t\t\t\tchanges: 1,\n\t\t\t\tseenChangeKeys: new Set([summary.changeKey]),\n\t\t\t})\n\t\t}\n\t}\n\n\tconst nodeChanges: AgentChange[] = []\n\tconst textStyleNodeIds: NodeID[] = []\n\tconst linkStyleNodeIds: NodeID[] = []\n\tfor (const summary of changesById.values()) {\n\t\tif (summary.kind === \"text-style\") {\n\t\t\ttextStyleNodeIds.push(summary.id)\n\t\t\tcontinue\n\t\t}\n\t\tif (summary.kind === \"link-style\") {\n\t\t\tlinkStyleNodeIds.push(summary.id)\n\t\t\tcontinue\n\t\t}\n\t\tnodeChanges.push({\n\t\t\tid: summary.id,\n\t\t\tname: summary.name,\n\t\t\tsource: \"node\",\n\t\t\tkind: summary.kind,\n\t\t\tchanges: summary.changes,\n\t\t})\n\t}\n\n\tconst groupedStyles: AgentChange[] = []\n\t// Collapse every text-style preset (and similarly link-style) into a single summary\n\t// row; the count reflects distinct presets touched rather than command count.\n\tif (textStyleNodeIds.length > 0) {\n\t\tgroupedStyles.push({\n\t\t\tid: textStyleNodeIds[0]!,\n\t\t\tname: pluralize(\"Text Style\", textStyleNodeIds.length),\n\t\t\tsource: \"node\",\n\t\t\tkind: \"text-style\",\n\t\t\tchanges: textStyleNodeIds.length,\n\t\t})\n\t}\n\tif (linkStyleNodeIds.length > 0) {\n\t\tgroupedStyles.push({\n\t\t\tid: linkStyleNodeIds[0]!,\n\t\t\tname: pluralize(\"Link Style\", linkStyleNodeIds.length),\n\t\t\tsource: \"node\",\n\t\t\tkind: \"link-style\",\n\t\t\tchanges: linkStyleNodeIds.length,\n\t\t})\n\t}\n\n\tconst result = [...nodeChanges, ...getCodeFileSummaryForRequest(request), ...groupedStyles]\n\treturn sortAgentChanges(result, ctx)\n}\n\nfunction sortAgentChanges(changes: readonly AgentChange[], ctx: AgentContext): readonly AgentChange[] {\n\tconst homePageNodeId = ctx.treeResolver.getLookupTree().root.homePageNodeId\n\treturn [...changes].sort((a, b) => getChangeSortRank(a, homePageNodeId) - getChangeSortRank(b, homePageNodeId))\n}\n\nfunction getChangeSortRank(change: AgentChange, homePageNodeId: NodeID | undefined): number {\n\tswitch (change.kind) {\n\t\tcase \"page\":\n\t\t\treturn change.id === homePageNodeId ? 0 : 1\n\t\tcase \"collection\":\n\t\t\treturn 2\n\t\tcase \"component\":\n\t\t\treturn 3\n\t\tcase \"layer\":\n\t\t\treturn 4\n\t\tcase \"code-file\":\n\t\t\treturn 5\n\t\tcase \"text-style\":\n\t\t\treturn 6\n\t\tcase \"link-style\":\n\t\t\treturn 7\n\t\tdefault:\n\t\t\tassertNever(change.kind, \"Invalid AgentChangeKind\")\n\t}\n}\n\nfunction getCommandSourceNodeId(\n\tcommand: Command,\n\tctx: AgentContext,\n\tfallbackScopeId: NodeID | undefined,\n): NodeID | undefined {\n\tconst collectionId = getCommandCollectionTargetId(command, ctx)\n\tif (collectionId) return collectionId\n\n\tfor (const id of getCommandTargetIds(command)) {\n\t\tconst node = ctx.treeResolver.get(id)\n\t\tif (node) return node.id\n\t}\n\treturn fallbackScopeId\n}\n\nfunction getCommandChangeKey(command: Command, virtualChildIds: ReadonlyMap<string, NodeID>): string {\n\tlet rawId: string\n\tswitch (command.type) {\n\t\tcase CommandType.Duplicate:\n\t\t\trawId = command.attributes.newId\n\t\t\tbreak\n\t\tcase CommandType.Add:\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Remove:\n\t\tcase CommandType.Move:\n\t\tcase CommandType.CreateVariant:\n\t\t\trawId = command.attributes.id\n\t\t\tbreak\n\t\tdefault:\n\t\t\tassertNever(command, \"Invalid command type\")\n\t}\n\tif (isVirtualNodeId(rawId)) {\n\t\treturn getNodeIdForPossiblyVirtualId(rawId)\n\t}\n\tconst parentRichTextId = virtualChildIds.get(rawId)\n\tif (parentRichTextId) {\n\t\treturn parentRichTextId\n\t}\n\treturn rawId\n}\n\nfunction getCommandMessageSummary(\n\tmessage: Extract<TransientTurnMessage, { type: \"command\" }>,\n\tctx: AgentContext,\n\tfallbackScopeId: NodeID | undefined,\n\tvirtualChildIds: ReadonlyMap<string, NodeID>,\n): CommandSummary | undefined {\n\tconst changeKey = getCommandChangeKey(message.command, virtualChildIds)\n\n\tif (message.collectionId) {\n\t\tconst node = ctx.treeResolver.get(message.collectionId)\n\t\treturn getNodeChange(node, message.collectionId, ctx, changeKey)\n\t}\n\n\tconst id = message.scopeId ?? getCommandSourceNodeId(message.command, ctx, fallbackScopeId)\n\tif (!id) return\n\tconst node = ctx.treeResolver.get(id)\n\tconst summary = getNodeChange(node, id, ctx, changeKey)\n\tif (summary.kind !== \"layer\") return summary\n\n\t// The \"layer\" kind is the catch-all for anything that isn't a recognised\n\t// page/component/collection/style. Walk up to attribute the change to a meaningful\n\t// ancestor (or fall back to the agent's request scope) so anonymous root-level or\n\t// orphaned touches roll up into one parent row instead of many \"Layer\" rows.\n\tconst ancestor = findMeaningfulAncestor(node, ctx)\n\tif (ancestor) return getNodeChange(ancestor, ancestor.id, ctx, changeKey)\n\tif (fallbackScopeId && fallbackScopeId !== summary.id) {\n\t\tconst fallbackNode = ctx.treeResolver.get(fallbackScopeId)\n\t\tif (fallbackNode) return getNodeChange(fallbackNode, fallbackScopeId, ctx, changeKey)\n\t}\n\treturn summary\n}\n\nfunction findMeaningfulAncestor(node: MaybeCanvasNode, ctx: AgentContext): CanvasNode | undefined {\n\tif (!node) return undefined\n\tfor (const ancestor of ctx.treeResolver.getAncestorsFor(node.id)) {\n\t\tif (\n\t\t\tisWebPageNode(ancestor) ||\n\t\t\tisSmartComponentNode(ancestor) ||\n\t\t\tisCollectionNode(ancestor) ||\n\t\t\tisTextStylePresetNode(ancestor) ||\n\t\t\tisLinkStylePresetNode(ancestor)\n\t\t) {\n\t\t\treturn ancestor\n\t\t}\n\t}\n\treturn undefined\n}\n\nfunction getNodeChange(\n\tnode: MaybeCanvasNode,\n\tfallbackId: NodeID,\n\tctx: AgentContext,\n\tchangeKey: string,\n): CommandSummary {\n\tconst kind = getNodeChangeKind(node)\n\treturn {\n\t\tid: node?.id ?? fallbackId,\n\t\tname: getNodeChangeName(node, kind, ctx),\n\t\tkind,\n\t\tchangeKey,\n\t}\n}\n\nfunction getNodeChangeKind(node: MaybeCanvasNode): AgentChangeKind {\n\tif (isTextStylePresetNode(node)) return \"text-style\"\n\tif (isLinkStylePresetNode(node)) return \"link-style\"\n\tif (isCollectionNode(node)) return \"collection\"\n\tif (isSmartComponentNode(node)) return \"component\"\n\tif (isWebPageNode(node)) return \"page\"\n\treturn \"layer\"\n}\n\nfunction getNodeChangeName(node: MaybeCanvasNode, kind: AgentChangeKind, ctx: AgentContext): string {\n\tif (!node) return fallbackNameForKind(kind)\n\tconst tree = ctx.treeResolver.getLookupTree()\n\tif (isWebPageNode(node)) {\n\t\tconst collectionName = getCollectionNameForPage(tree, node)\n\t\tif (collectionName) return collectionName\n\t}\n\treturn getNameValue(tree, node) ?? fallbackNameForKind(kind)\n}\n\nfunction fallbackNameForKind(kind: AgentChangeKind): string {\n\tswitch (kind) {\n\t\tcase \"collection\":\n\t\t\treturn Dictionary.Collection\n\t\tcase \"component\":\n\t\t\treturn Dictionary.Component\n\t\tcase \"page\":\n\t\t\treturn Dictionary.Page\n\t\tcase \"layer\":\n\t\t\treturn \"Layer\"\n\t\tcase \"code-file\":\n\t\t\treturn \"Code file\"\n\t\tcase \"text-style\":\n\t\t\treturn \"Text Style\"\n\t\tcase \"link-style\":\n\t\t\treturn \"Link Style\"\n\t\tdefault:\n\t\t\tassertNever(kind, \"Invalid AgentChangeKind\")\n\t}\n}\n\nfunction getCodeFileSummaryForRequest(request: AgentRequest): readonly AgentChange[] {\n\tconst changesByFile = new Map<string, number>()\n\tfor (const message of request.state.messages) {\n\t\tif (message.type !== \"code-patch\" || !message.fileName || !message.complete || message.failed) continue\n\n\t\tconst changedLines = getCodePatchChangedLineCount(message.content, message.operation)\n\t\tif (changedLines === 0) continue\n\t\tchangesByFile.set(message.fileName, (changesByFile.get(message.fileName) ?? 0) + changedLines)\n\t}\n\treturn Array.from(changesByFile, ([id, changes]) => ({\n\t\tid,\n\t\tname: id,\n\t\tsource: \"code-file\" as const,\n\t\tkind: \"code-file\" as const,\n\t\tchanges,\n\t}))\n}\n\nfunction getCodePatchChangedLineCount(content: string, operation: CodePatchOperation | undefined): number {\n\tif (operation === \"delete_file\" && content.length === 0) return 1\n\treturn countChangedDiffLines(content)\n}\n", "export type DiffLinePrefix = \"+\" | \"-\" | \" \"\n\nfunction getDiffLinePrefix(line: string): DiffLinePrefix {\n\tif (line.startsWith(\"+++\") || line.startsWith(\"---\")) return \" \"\n\tif (line.startsWith(\"+\")) return \"+\"\n\tif (line.startsWith(\"-\")) return \"-\"\n\treturn \" \"\n}\n\nexport function countChangedDiffLines(content: string): number {\n\tlet count = 0\n\tfor (const line of content.split(\"\\n\")) {\n\t\tconst prefix = getDiffLinePrefix(line)\n\t\tif (prefix === \"+\" || prefix === \"-\") count++\n\t}\n\treturn count\n}\n\nconst trimEndRegex = /\\n$/\n\nexport function parseDiffLines(content: string): { prefixes: DiffLinePrefix[]; cleanCode: string } {\n\tconst lines = content.replace(trimEndRegex, \"\").split(\"\\n\")\n\tconst prefixes: DiffLinePrefix[] = []\n\tconst cleanLines: string[] = []\n\n\tfor (const line of lines) {\n\t\tconst prefix = getDiffLinePrefix(line)\n\t\tprefixes.push(prefix)\n\t\tconst stripFirstChar = prefix !== \" \" || line.startsWith(\" \")\n\t\tcleanLines.push(stripFirstChar ? line.slice(1) : line)\n\t}\n\n\treturn { prefixes, cleanCode: cleanLines.join(\"\\n\") }\n}\n", "import type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isArray, isString } from \"utils/typeChecks.ts\"\nimport { getCommandCreatedIds } from \"./commandTargets.ts\"\nimport { isCommand } from \"./dsl.ts\"\nimport { isAssistantToolCallPart, isExecutedCommand } from \"./messages.ts\"\nimport {\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n} from \"./tools/toolNames.ts\"\nimport type { AgentRequest } from \"./types.ts\"\n\n// Keep track of the request with the last read_project or review_changes tool call containing sent\n// canvas IDs. We use this as the boundary to determine until which point should we collect the\n// unsent ID mappings.\nexport interface HistoryBoundary {\n\trequestIndex: number\n\tmessageIndex: number\n\tstepIndex: number\n}\n\n/**\n * Collect any unsent LLM <-> Canvas ID mappings from the history. Specifically, ID pairs that were\n * created after the last read_project or review_changes tool call (which should already have sent\n * previous ID mappings via the renamedIds system state). For this we walk the history backwards\n * and collecting the mappings as we go.\n */\nexport function collectLlmToCanvasMappingsFromHistory(history: readonly AgentRequest[]): Map<string, NodeID> {\n\tconst llmIdToCanvasId = new Map<string, NodeID>()\n\n\tfor (let requestIndex = history.length - 1; requestIndex >= 0; requestIndex--) {\n\t\tconst request = history[requestIndex]\n\t\tif (!request) continue\n\n\t\tfor (let stepIndex = request.steps.length - 1; stepIndex >= 0; stepIndex--) {\n\t\t\tconst step = request.steps[stepIndex]\n\t\t\tif (!step) continue\n\n\t\t\tconst { content, toolResults } = step\n\n\t\t\tfor (let contentIndex = content.length - 1; contentIndex >= 0; contentIndex--) {\n\t\t\t\tconst part = content[contentIndex]\n\t\t\t\tif (!part || isString(part)) continue\n\n\t\t\t\tif (isAssistantToolCallPart(part)) {\n\t\t\t\t\tconst { toolCallId, toolName } = part.content\n\n\t\t\t\t\t// If we encounter a read_project or review_changes tool call with a sent\n\t\t\t\t\t// `renamedIds`, safe to assume we've sent all the previous mappings hence can\n\t\t\t\t\t// stop the loop.\n\t\t\t\t\tif (toolName === READ_PROJECT_TOOL_NAME || toolName === REVIEW_CHANGES_TOOL_NAME) {\n\t\t\t\t\t\tconst toolResult = toolResults.find(result => result.toolCallId === toolCallId)\n\t\t\t\t\t\tif (!toolResult) continue\n\t\t\t\t\t\tif (toolResult.toolName !== toolName) continue\n\n\t\t\t\t\t\tconst renamedIds = toolResult.output.systemState?.renamedIds\n\t\t\t\t\t\tif (renamedIds) return llmIdToCanvasId\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we encounter a (successful) flatten_component_instance tool call, we need\n\t\t\t\t\t// to collect the mappings from the tool result.\n\t\t\t\t\tif (toolName === FLATTEN_COMPONENT_INSTANCE_TOOL_NAME) {\n\t\t\t\t\t\tconst toolResult = toolResults.find(result => result.toolCallId === toolCallId)\n\t\t\t\t\t\tif (!toolResult) continue\n\t\t\t\t\t\tif (toolResult.toolName !== toolName) continue\n\t\t\t\t\t\tif (toolResult.output.status !== \"success\") continue\n\t\t\t\t\t\tconst llmId = toolResult.input.id\n\t\t\t\t\t\tif (llmIdToCanvasId.has(llmId)) continue\n\n\t\t\t\t\t\tllmIdToCanvasId.set(llmId, toolResult.output.replacementId)\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// If we encounter a command, collect the mappings as unsent ID pairs.\n\t\t\t\tif (isArray(part)) {\n\t\t\t\t\tfor (let updateIndex = part.length - 1; updateIndex >= 0; updateIndex--) {\n\t\t\t\t\t\tconst update = part[updateIndex]\n\t\t\t\t\t\tif (!isCommand(update)) continue\n\t\t\t\t\t\tif (!isExecutedCommand(update)) continue\n\t\t\t\t\t\tif (!update.nodeId) continue\n\t\t\t\t\t\tconst llmId = getCommandCreatedIds(update)\n\t\t\t\t\t\tif (!llmId || llmIdToCanvasId.has(llmId)) continue\n\t\t\t\t\t\tllmIdToCanvasId.set(llmId, update.nodeId)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn llmIdToCanvasId\n}\n", "import type { Logger } from \"@framerjs/shared\"\nimport type { LanguageModelUsage } from \"ai\"\nimport { formatElapsedMs } from \"./utils.ts\"\n\nfunction formatSignedTokenDelta(delta: number): string {\n\treturn delta > 0 ? `+${delta}` : `${delta}`\n}\n\nexport function logStepUsage(\n\tlog: Logger,\n\tusage: LanguageModelUsage,\n\tpreviousStepUsage: LanguageModelUsage | undefined,\n\tmessage = \"Last step usage\",\n\telapsedMs?: number,\n\tcost?: number,\n): void {\n\tconst inputTokens = usage.inputTokens ?? 0\n\tconst outputTokens = usage.outputTokens ?? 0\n\tconst previousInputTokens = previousStepUsage?.inputTokens ?? 0\n\tconst previousOutputTokens = previousStepUsage?.outputTokens ?? 0\n\n\tconst inDelta = previousStepUsage === undefined ? \"n/a\" : formatSignedTokenDelta(inputTokens - previousInputTokens)\n\tconst outDelta = previousStepUsage === undefined ? \"n/a\" : formatSignedTokenDelta(outputTokens - previousOutputTokens)\n\tconst cachedReadTokens = usage.inputTokenDetails?.cacheReadTokens ?? 0\n\tconst cachedWriteTokens = usage.inputTokenDetails?.cacheWriteTokens ?? 0\n\tconst cachedTokensText =\n\t\tcachedReadTokens === 0 && cachedWriteTokens === 0 ? \"\" : `, cached: r=${cachedReadTokens} w=${cachedWriteTokens}`\n\tconst elapsedText = elapsedMs === undefined ? \"\" : ` | ${formatElapsedMs(elapsedMs)}`\n\tconst costText = cost === undefined ? \"\" : ` | $${cost.toFixed(2)}`\n\n\tlog.debug(\n\t\t`${message} | in: %c${inputTokens}%c (${inDelta}${cachedTokensText}) | out: %c${outputTokens}%c (${outDelta}) %c| total: ${usage.totalTokens}${elapsedText}${costText}%c`,\n\t\t\"font-weight: bold;\",\n\t\t\"\",\n\t\t\"font-weight: bold;\",\n\t\t\"\",\n\t\t\"color: #6b7280\",\n\t\t\"\",\n\t\t{ usage },\n\t)\n}\n", "import { ApiError } from \"@framerjs/app-shared\"\nimport { APICallError } from \"ai\"\nimport { isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { parseAiCreditLimitError } from \"../aiServiceError.ts\"\nimport { isAiDisabledError } from \"../config/disableAi.ts\"\nimport type { AgentRequestAbortedReason } from \"./types.ts\"\n\nexport const userStopError = Symbol(\"user-stopped-turn\")\nexport const queueInterruptedError = Symbol(\"queue-interrupted-turn\")\n\nexport function isUserStopError(error: unknown): error is Error & { cause: typeof userStopError } {\n\treturn error instanceof Error && error.cause === userStopError\n}\n\nexport function isQueueInterruptedError(error: unknown): error is Error & { cause: typeof queueInterruptedError } {\n\treturn error instanceof Error && error.cause === queueInterruptedError\n}\n\nexport function toAgentRequestError(error: unknown): AgentRequestAbortedReason {\n\tif (isUserStopError(error)) {\n\t\treturn {\n\t\t\treason: \"user-stopped\",\n\t\t}\n\t}\n\n\tif (isQueueInterruptedError(error)) {\n\t\treturn {\n\t\t\treason: \"queue-interrupted\",\n\t\t}\n\t}\n\n\tif (isAiDisabledError(error)) {\n\t\treturn {\n\t\t\treason: \"ai-disabled\",\n\t\t\tmessage: error.message,\n\t\t}\n\t}\n\n\tif (APICallError.isInstance(error)) {\n\t\tconst creditLimitError = parseAiCreditLimitError(error.data)\n\t\tif (creditLimitError) {\n\t\t\treturn {\n\t\t\t\treason: \"credit-limit-reached\",\n\t\t\t\tmessage: creditLimitError.message,\n\t\t\t\tcreditLimitReason: creditLimitError.reason,\n\t\t\t}\n\t\t}\n\t}\n\n\tconst openRouterError = extractOpenRouterError(error)\n\tif (openRouterError) {\n\t\treturn {\n\t\t\treason: \"error\",\n\t\t\tcode: openRouterError.code,\n\t\t\tmessage: openRouterError.message,\n\t\t\tmetadata: openRouterError.metadata,\n\t\t}\n\t}\n\n\tif (APICallError.isInstance(error)) {\n\t\tconst code = error.statusCode ?? getUnknownErrorCode(error)\n\t\tconst message = error.message\n\t\treturn { reason: \"error\", code, message }\n\t}\n\n\tconst code = getApiErrorStatus(error) ?? getUnknownErrorCode(error)\n\tconst message = getUnknownErrorMessage(error)\n\tconst metadata = getUnknownErrorMetadata(error)\n\treturn { reason: \"error\", code, message, metadata }\n}\n\nfunction extractOpenRouterError(\n\terror: unknown,\n): { code?: string | number; message?: string; metadata?: Record<string, unknown> } | undefined {\n\tconst payload = getOpenRouterPayload(error)\n\tif (!payload) return\n\treturn {\n\t\tcode: payload.code,\n\t\tmessage: payload.message,\n\t\tmetadata: isObject(payload.metadata) ? payload.metadata : undefined,\n\t}\n}\n\nfunction getOpenRouterPayload(\n\terror: unknown,\n): { code: string | number; message: string; metadata?: unknown } | undefined {\n\t// Because we're using Vercel AI SDK streamText, thrown errors are often wrapped (e.g.\n\t// APICallError) rather than raw OpenRouter JSON.\n\tif (APICallError.isInstance(error)) {\n\t\tconst payloadFromData = parseOpenRouterPayload(error.data)\n\t\tif (payloadFromData) return payloadFromData\n\t\treturn parseOpenRouterPayload(error.responseBody)\n\t}\n\n\tif (isObject(error)) {\n\t\t// Some SDK wrappers (like Vercel AI SDK `TypeValidationError`) place the parsed payload\n\t\t// under `.value`.\n\t\tconst payloadFromValue = parseOpenRouterPayload(error.value)\n\t\tif (payloadFromValue) return payloadFromValue\n\t}\n\n\treturn parseOpenRouterPayload(error)\n}\n\nfunction parseOpenRouterPayload(\n\tvalue: unknown,\n): { code: string | number; message: string; metadata?: unknown } | undefined {\n\tif (isString(value)) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(value) as unknown\n\t\t\treturn parseOpenRouterPayload(parsed)\n\t\t} catch {\n\t\t\treturn\n\t\t}\n\t}\n\tif (!isObject(value) || !isObject(value.error)) return\n\tconst code = value.error.code\n\tconst message = value.error.message\n\n\tif (!isNumber(code) && !isString(code)) return\n\tif (!isString(message)) return\n\treturn { code, message, metadata: value.error.metadata }\n}\n\nfunction getUnknownErrorCode(error: unknown): string | number | undefined {\n\tif (!isObject(error)) return\n\tconst code = error.code\n\tif (!isString(code) && !isNumber(code)) return\n\treturn code\n}\n\nfunction getApiErrorStatus(error: unknown): number | undefined {\n\tif (error instanceof ApiError) return error.status\n\treturn undefined\n}\n\nfunction getUnknownErrorMessage(error: unknown): string | undefined {\n\tif (error instanceof Error) return error.message\n\tif (isObject(error) && isString(error.message)) return error.message\n\treturn\n}\n\nfunction getUnknownErrorMetadata(error: unknown): Record<string, unknown> | undefined {\n\tif (!isObject(error) || !isObject(error.metadata)) return\n\treturn error.metadata\n}\n", "import { CommandType, isAddVariableCommandAttributes, type Command } from \"app/ai/agents/dsl.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tisDesignPageNode,\n\tisSmartComponentNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { assert, assertNever } from \"library/utils/assert.ts\"\nimport type { AgentContext } from \"../agents/context/AgentContext.ts\"\nimport { isVariableReferenceHandle } from \"../agents/context/dynamicValues.ts\"\nimport { isVirtualNodeId, parseVirtualNodeId } from \"../agents/context/richtext/document.ts\"\nimport { parseRichTextTarget } from \"../agents/context/richtext/targets.ts\"\nimport { AgentScreenshots } from \"../agents/tools/utils/AgentScreenshots.ts\"\nimport type { Response as ScreenshotResponse } from \"../agents/tools/utils/AgentScreenshots.ts\"\nimport type { AgentInteractionHandle } from \"./AgentInteraction.ts\"\n\ntype CollectScreenshotTargets = () => void\nexport type CaptureScreenshots = (screenshot: Promise<ScreenshotResponse>) => void\n\nexport class ScreenshotTargetCollector {\n\tprivate readonly targetNodeIds = new Set<NodeID>()\n\tconstructor(\n\t\tprivate readonly ctx: AgentContext,\n\t\tprivate readonly agentInteraction?: AgentInteractionHandle,\n\t\tprivate readonly onCaptureScreenshots?: CaptureScreenshots,\n\t) {}\n\n\tgetTargetNodeIds(): ReadonlySet<NodeID> {\n\t\treturn new Set(this.targetNodeIds)\n\t}\n\n\ttrackCommand(command: Command): CollectScreenshotTargets {\n\t\tconst preCommandTargetNodeIds = this.getTargetNodeIdsBeforeCommand(command)\n\t\treturn () => {\n\t\t\tthis.addTargetNodeIds(preCommandTargetNodeIds)\n\t\t\tthis.addTargetNodeIds(this.getTargetNodeIdsAfterCommand(command))\n\t\t}\n\t}\n\n\tasync capture(): Promise<void> {\n\t\tconst engine = this.ctx.hooks.getEngine()\n\t\tassert(engine, \"Engine is required\")\n\n\t\tconst screenshots = new AgentScreenshots(engine, this.ctx.treeResolver, undefined, this.onCaptureScreenshots)\n\t\tawait this.agentInteraction?.captureAffectedOutputNodeScreenshots(this.targetNodeIds, screenshots)\n\t}\n\n\tprivate addTargetNodeIds(nodeIds: Iterable<NodeID>): void {\n\t\tfor (const nodeId of nodeIds) {\n\t\t\tthis.targetNodeIds.add(nodeId)\n\t\t}\n\t}\n\n\t/**\n\t * Only commands that need old tree state are resolved before execution.\n\t */\n\tprivate getTargetNodeIdsBeforeCommand(command: Command): ReadonlySet<NodeID> {\n\t\tswitch (command.type) {\n\t\t\tcase CommandType.Remove:\n\t\t\t\t// Remove loses the target node after execution.\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.id], this.ctx)\n\t\t\tcase CommandType.Move:\n\t\t\t\t// Move needs the source target before the node changes parent.\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.id], this.ctx)\n\t\t\tcase CommandType.Add:\n\t\t\tcase CommandType.Update:\n\t\t\tcase CommandType.Duplicate:\n\t\t\tcase CommandType.CreateVariant:\n\t\t\t\treturn new Set()\n\t\t\tdefault:\n\t\t\t\tassertNever(command, \"Invalid command type\")\n\t\t}\n\t}\n\n\tprivate getTargetNodeIdsAfterCommand(command: Command): ReadonlySet<NodeID> {\n\t\tswitch (command.type) {\n\t\t\tcase CommandType.Add: {\n\t\t\t\tconst id = isAddVariableCommandAttributes(command.attributes) ? command.attributes.scope : command.attributes.id\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([id], this.ctx)\n\t\t\t}\n\t\t\tcase CommandType.Update:\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.id], this.ctx)\n\t\t\tcase CommandType.Move:\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.id, command.attributes.parent], this.ctx)\n\t\t\tcase CommandType.Duplicate:\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.newId], this.ctx)\n\t\t\tcase CommandType.CreateVariant:\n\t\t\t\treturn getTargetNodeIdsForCommandTargets([command.attributes.id], this.ctx)\n\t\t\tcase CommandType.Remove:\n\t\t\t\treturn new Set()\n\t\t\tdefault:\n\t\t\t\tassertNever(command, \"Invalid command type\")\n\t\t}\n\t}\n}\n\nfunction getScreenshotTargetNodeId(nodeId: string, ctx: AgentContext): NodeID | undefined {\n\tconst node = ctx.treeResolver.get(nodeId)\n\tif (!node) return\n\n\tif (isSmartComponentNode(node, true)) {\n\t\treturn node.baseVariantId || undefined\n\t}\n\n\tif (isWebPageNode(node)) {\n\t\treturn node.getPossiblyNonLoadedBaseVariantId()\n\t}\n\n\tconst groundNode = ctx.treeResolver.getGroundNodeFor(node.id)\n\tif (!groundNode) return\n\n\tif (isVariant(groundNode)) return groundNode.id\n\n\tconst scopeNode = ctx.treeResolver.getScopeNodeFor(groundNode.id)\n\tif (!isScreenshotCapturableScope(scopeNode)) return\n\n\treturn groundNode.id\n}\n\nfunction getTargetNodeIdsForCommandTargets(targetIds: readonly string[], ctx: AgentContext): Set<NodeID> {\n\tconst targetNodeIds = new Set<NodeID>()\n\tfor (const targetId of targetIds) {\n\t\tconst resolved = ctx.dynamicValues.getVariableReferenceHandleByVariableId(targetId)\n\t\tconst targetNodeId = isVariableReferenceHandle(resolved)\n\t\t\t? getScreenshotTargetNodeId(resolved.scopeId, ctx)\n\t\t\t: (getTargetNodeIdForVirtualTextTarget(targetId, ctx) ?? getScreenshotTargetNodeId(targetId, ctx))\n\t\tif (targetNodeId) targetNodeIds.add(targetNodeId)\n\t}\n\treturn targetNodeIds\n}\n\nfunction getTargetNodeIdForVirtualTextTarget(targetId: string, ctx: AgentContext): NodeID | undefined {\n\tif (!isVirtualNodeId(targetId)) return\n\n\tconst resolvedVirtualId = ctx.treeResolver.resolveVirtualId(targetId)\n\tif (!isVirtualNodeId(resolvedVirtualId)) return\n\n\tconst { richTextTarget } = parseVirtualNodeId(resolvedVirtualId)\n\tconst { nodeId } = parseRichTextTarget(richTextTarget)\n\treturn getScreenshotTargetNodeId(nodeId, ctx)\n}\n\nfunction isScreenshotCapturableScope(node: unknown): boolean {\n\treturn isWebPageNode(node, true) || isDesignPageNode(node, true) || isSmartComponentNode(node, true)\n}\n", "import type { ModelMessage, SystemModelMessage } from \"ai\"\nimport type { LanguageModel as LanguageModelType } from \"app/ai/languageModels.ts\"\nimport { isObjectWithKey } from \"utils/typeChecks.ts\"\nimport { getModelVendor, ModelVendor } from \"../../models.ts\"\n\ninterface StreamTextPromptConfiguration {\n\tmessages: ModelMessage[]\n\tresponseMessageOffset: number\n\tsystem?: string\n}\n\ninterface StreamTextPromptConfigurationOptions {\n\tmessages: ModelMessage[]\n\tmodel: LanguageModelType\n\tsystem: string\n}\n\n// Warning: This function kinda lies - on OpenAI models, we have automatic caching enabled by\n// default. For Anthropic models, we use manual caching.\nfunction isCachingSupported(model: LanguageModelType): boolean {\n\treturn getModelVendor(model) === ModelVendor.Anthropic\n}\n\nexport function withPromptCaching({\n\tmessages,\n\tmodel,\n\tsystem,\n}: StreamTextPromptConfigurationOptions): StreamTextPromptConfiguration {\n\tif (!shouldUseAnthropicPromptCaching(model)) {\n\t\treturn {\n\t\t\tsystem,\n\t\t\tmessages,\n\t\t\tresponseMessageOffset: 0,\n\t\t}\n\t}\n\n\tconst cachedMessages = [createCachedSystemMessage(system), ...messages]\n\n\t// The cached system message is synthetic request state. We prepend it for Anthropic request shaping,\n\t// but subscribers should still see only the real conversation history, so we track an offset for later slicing.\n\treturn {\n\t\tmessages: cachedMessages,\n\t\tresponseMessageOffset: 1,\n\t}\n}\n\nexport function getResponseMessages(\n\tconfiguration: StreamTextPromptConfiguration,\n\tmessages: readonly ModelMessage[],\n): readonly ModelMessage[] {\n\tif (configuration.responseMessageOffset === 0) return messages\n\treturn messages.slice(configuration.responseMessageOffset)\n}\n\nfunction shouldUseAnthropicPromptCaching(model: LanguageModelType): boolean {\n\treturn isCachingSupported(model)\n}\n\nexport function shouldUseAnthropicPromptCachingOnCurrentTurn(model: LanguageModelType): boolean {\n\treturn shouldUseAnthropicPromptCaching(model)\n}\n\nfunction createCachedSystemMessage(system: string): SystemModelMessage {\n\tconst providerOptions: SystemModelMessage[\"providerOptions\"] = {\n\t\tanthropic: {\n\t\t\tcacheControl: {\n\t\t\t\ttype: \"ephemeral\",\n\t\t\t\t// no ttl -> 5min caching\n\t\t\t},\n\t\t},\n\t}\n\n\treturn {\n\t\trole: \"system\",\n\t\tcontent: system,\n\t\tproviderOptions,\n\t}\n}\n\nexport function createCachedUserMessage(\n\tmessage: Extract<ModelMessage, { role: \"user\" }>,\n): Extract<ModelMessage, { role: \"user\" }> {\n\tconst providerOptions: Extract<ModelMessage, { role: \"user\" }>[\"providerOptions\"] = {\n\t\tanthropic: {\n\t\t\tcacheControl: {\n\t\t\t\ttype: \"ephemeral\",\n\t\t\t\t// no ttl -> 5min caching\n\t\t\t},\n\t\t},\n\t}\n\n\treturn {\n\t\t...message,\n\t\tproviderOptions,\n\t}\n}\n\nexport const testing = {\n\tgetCachedBreakpointIndices(messages: readonly ModelMessage[]): number[] {\n\t\treturn messages\n\t\t\t.map((message, index) => (testing.hasAnthropicCacheControl(message) ? index : -1))\n\t\t\t.filter(index => index >= 0)\n\t},\n\thasAnthropicCacheControl(message: ModelMessage | undefined): boolean {\n\t\tif (!isObjectWithKey(message, \"providerOptions\")) return false\n\t\tconst providerOptions = message.providerOptions\n\t\tif (!isObjectWithKey(providerOptions, \"anthropic\")) return false\n\t\tconst anthropic = providerOptions.anthropic\n\t\tif (!isObjectWithKey(anthropic, \"cacheControl\")) return false\n\t\treturn anthropic.cacheControl !== undefined\n\t},\n}\n", "import { LogLevel, type Logger } from \"@framerjs/shared/src/logger.ts\"\nimport type { ModelMessage } from \"ai\"\nimport type { getStreamRequestTokenEstimates } from \"../tokens.ts\"\n\nconst openTagRegex = /<[^>]+>/g\n\nexport function logAgentRequest(\n\tlog: Logger,\n\tmodelMessages: readonly ModelMessage[],\n\trequestEstimate: ReturnType<typeof getStreamRequestTokenEstimates>,\n): void {\n\tconst { totalEstimatedTokens, messageEstimates, systemEstimatedTokens, toolEstimatedTokens } = requestEstimate\n\n\tif (log.level <= LogLevel.Debug) {\n\t\tlog.debug(\"Estimated next step input tokens:\", {\n\t\t\ttotal: totalEstimatedTokens,\n\t\t\tmessages: totalEstimatedTokens - systemEstimatedTokens - toolEstimatedTokens,\n\t\t\tsystem: systemEstimatedTokens,\n\t\t\ttools: toolEstimatedTokens,\n\t\t})\n\n\t\t// biome-ignore lint/suspicious/noConsole: Nested token logs are intentionally used for interactive debugging.\n\t\tconsole.groupCollapsed(`[Agent Request] Estimated next step input tokens:`, totalEstimatedTokens)\n\t\tfor (const message of messageEstimates) {\n\t\t\tlet i = 0\n\t\t\tfor (const content of message.contents) {\n\t\t\t\tconst messageContent = modelMessages[message.index]?.content\n\n\t\t\t\topenTagRegex.lastIndex = 0\n\t\t\t\t// eslint-disable-next-line framer-studio/no-global-regex-in-test-exec\n\t\t\t\tconst openTag = typeof messageContent === \"string\" ? openTagRegex.exec(messageContent)?.[0] : undefined\n\n\t\t\t\t// biome-ignore lint/suspicious/noConsole: Nested token logs are intentionally used for interactive debugging.\n\t\t\t\tconsole.log(`[${i++}] ${openTag ?? \"\"}`, content.estimatedTokens, {\n\t\t\t\t\tcontent: modelMessages[message.index]?.content,\n\t\t\t\t\trole: message.role,\n\t\t\t\t\ttype: content.type,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\t// biome-ignore lint/suspicious/noConsole: Nested token logs are intentionally used for interactive debugging.\n\t\tconsole.groupEnd()\n\t}\n\n\tlog.info(\"Agent Request:\", {\n\t\tmodelMessages,\n\t\ttotalEstimatedTokens,\n\t\tmessageCount: modelMessages.length,\n\t})\n}\n", "import { LogLevel, type Logger } from \"@framerjs/shared/src/logger.ts\"\nimport type { ToolSet } from \"ai\"\nimport { estimateTokenCount } from \"tokenx\"\nimport { stringifyToolSchema } from \"../toolSchema.ts\"\n\nexport function logStreamConfig(log: Logger, system: string, tools: ToolSet): void {\n\tif (log.level > LogLevel.Debug) return\n\n\tconst systemTokens = estimateTokenCount(system)\n\n\tconst toolEntries = Object.entries(tools).map(([name, tool]) => {\n\t\tconst schema = stringifyToolSchema(tool)\n\t\tconst description = (tool as { description?: string }).description ?? \"\"\n\t\tconst text = `${name} ${description} ${schema}`\n\t\treturn {\n\t\t\tname,\n\t\t\ttext,\n\t\t\testimatedTokens: estimateTokenCount(text),\n\t\t}\n\t})\n\tconst toolTokens = toolEntries.reduce((sum, t) => sum + t.estimatedTokens, 0)\n\n\t// biome-ignore lint/suspicious/noConsole: Token logs are intentionally used for interactive debugging.\n\tconsole.groupCollapsed(`[Agent Stream] Estimated System:`, systemTokens, \" | Tools:\", toolTokens)\n\t// biome-ignore lint/suspicious/noConsole: Token logs are intentionally used for interactive debugging.\n\tconsole.log(\"System prompt:\", { text: system, estimatedTokens: systemTokens, length: system.length })\n\tfor (const entry of toolEntries) {\n\t\t// biome-ignore lint/suspicious/noConsole: Token logs are intentionally used for interactive debugging.\n\t\tconsole.log(`Tool \"${entry.name}\" text:`, { text: entry.text, estimatedTokens: entry.estimatedTokens })\n\t}\n\t// biome-ignore lint/suspicious/noConsole: Token logs are intentionally used for interactive debugging.\n\tconsole.groupEnd()\n\n\tlog.debug(\"Agent Stream config:\", {\n\t\tsystemPromptTokens: systemTokens,\n\t\ttoolTokens,\n\t\ttools: toolEntries,\n\t})\n}\n", "import { escapeValue, keyValueReference, traitReference, traitValueReference } from \"app/ai/agents/prompt/utils.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { TextRunClass } from \"../dsl.ts\"\nimport { Markdown } from \"./markdown.ts\"\n\nexport const linkRules = Markdown.section(\n\t`Links`,\n\t`- A node can be turned into a link by setting ${escapeValue(\"link.href\")} to an external URL (e.g. \"https://example.com/\") or an internal page path (e.g. \"/pricing\"). Internal pages MUST exist or be created before they can be linked to.`,\n\t`- Links can also scroll to a specific node in a page. FIRST, make sure the target node has ${keyValueReference(\"scrollTargetEnabled\", \"true\")} and ${keyValueReference(\"elementId\", \"<elementId>\")} set. THEN, set ${escapeValue(\"link.href\")} to the page path followed by a hash and the target node's ${traitReference(\"elementId\")} (e.g. \"/about#team\").`,\n\t`- ALWAYS make sure that ${keyValueReference(\"scrollTargetEnabled\", \"true\")} and ${keyValueReference(\"elementId\", \"<elementId>\")} are set on the target node BEFORE linking to it. Otherwise, the hash will be ignored and the link will just point to the page.`,\n\t`- Try to add links to all the elements that normally have links, such as navigation items, buttons, and footer links, but only do so after ensuring the target page or section exists.`,\n\t`- If the target sections or pages don't exist yet, create them first and then add the links.`,\n\tMarkdown.section(\n\t\t`Styling ${escapeValue(ClassDiscriminator.RichTextNode)} links`,\n\t\t`- Every ${escapeValue(ClassDiscriminator.RichTextNode)} that has ${escapeValue(\"link.href\")} MUST also have a ${traitReference(\"linkStylePreset\")}. This is the only way to style links inside rich text.`,\n\t\t`- Reuse an existing ${escapeValue(ClassDiscriminator.LinkStylePresetNode)} when one fits the design, otherwise create a new one. Be logical and coherent \u2014 re-use link style presets where it makes sense, but create separate presets for links that have different styles (e.g. main navigation links vs. in-body links).`,\n\t\t`- Set ${escapeValue(\"link.textColor\")}, ${escapeValue(\"link.hover.textColor\")}, ${escapeValue(\"link.textDecoration\")}, etc. as needed on the ${escapeValue(ClassDiscriminator.LinkStylePresetNode)} so links match the site theme and have clear hover affordance.`,\n\t\t`- Assign the preset to the ${escapeValue(ClassDiscriminator.RichTextNode)} with ${traitValueReference(\"linkStylePreset\", \"<preset name>\")}.`,\n\t\t`- In multi-page sites, ${escapeValue(\"link.current.textColor\")}, ${escapeValue(\"link.current.textBackgroundColor\")}, and other ${escapeValue(\"link.current.*\")} traits, define styles applied only when a link points to the page currently being viewed. Use them on navigation links to visually distinguish the active page.`,\n\t\t`- Styles coming from ${traitReference(\"linkStylePreset\")} (e.g. ${escapeValue(\"link.textColor\")}, ${escapeValue(\"link.textDecoration\")}) always override normal styles set directly on the node (e.g. ${traitReference(\"textColor\")}, ${traitReference(\"textDecoration\")}). Avoid setting normal styles unnecessarily for the purpose of styling links.`,\n\t),\n\tMarkdown.section(\n\t\t`Styling ${escapeValue(TextRunClass)} links`,\n\t\t`- Links created on ${escapeValue(TextRunClass)} automatically receive the ${traitReference(\"linkStylePreset\")} of the parent ${escapeValue(ClassDiscriminator.RichTextNode)} if one is not set explicitly on the ${escapeValue(TextRunClass)}.`,\n\t\t`- Setting ${traitValueReference(\"linkStylePreset\", \"null\")} on a ${escapeValue(TextRunClass)}, resets it to the ${traitReference(\"linkStylePreset\")} of the parent ${escapeValue(ClassDiscriminator.RichTextNode)}, or clears it if one doesn't exist.`,\n\t),\n)\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"HxdvKnkyF\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"DGeJ9mIph\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"H0Bqn5xa_\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"pWbbUTaZk\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 225,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,PNKbO6dGnRRwEvctPlhddS3H2s.png?originalFilename=image.png&width=512&height=512\",\n\t\t\t\t\t\t\tfillImageOriginalName: \"QmNTzwBZQ6EPfUz3XoqzcmfACp91QrQjdsSs2jx4p6sxuT?auto=format&w=1200.jpg\",\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: 1200,\n\t\t\t\t\t\t\tfillImagePixelHeight: 904,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: 500,\n\t\t\t\t\t\t\tintrinsicHeight: 500,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 6,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.09130434782608718,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 30,\n\t\t\t\t\t\t\theight: 30,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 8,\n\t\t\t\t\t\t\tradiusTopRight: 8,\n\t\t\t\t\t\t\tradiusBottomRight: 8,\n\t\t\t\t\t\t\tradiusBottomLeft: 8,\n\t\t\t\t\t\t\tradius: 8,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"F1gjQsl58\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.23170731707317097,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 600; --font-selector: SW50ZXItU2VtaUJvbGQ=; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1em; --framer-text-alignment: left;\\\">Jurre</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"center\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"uokBzJ3zD\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.7621951219512197,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.1em; --framer-text-alignment: left;\\\">30m ago</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"bottom\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\t\t\tgap: 0,\n\t\t\t\t\t\t\tstackAlignment: \"start\",\n\t\t\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5304347826086959,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"g7SEOZB5u\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"OAwBT41Y7\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"uvowP6pU2\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"pzU4Tbvft\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"g7SEOZB5u\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathBoolean: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 13,\n\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tx: 1.5,\n\t\t\t\t\t\t\t\t\ty: 6.5,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\t\theight: 16,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9842604998,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"DGeJ9mIph\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"start\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.49356223175965686,\n\t\t\t\t\tcenterAnchorY: 0.13043478260869587,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 36,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"LnE_Ql896\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"LcDu3OaH2\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"LnE_Ql896\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.304878048780488,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 230,\n\t\t\t\t\t\t\theight: 50.5,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">I don\u2019t love this font here\u2026</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"DGeJ9mIph\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.6771653543307089,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 230,\n\t\t\t\t\theight: 82,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"Comment Row\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"12px\",\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.24858757062146916,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 177,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: true,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tisVariant: false,\n\t\t\tisBreakpoint: false,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"jHOXltPJI\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"aalz8mPeO\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hKMys739n\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"XiKKVdsh_\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 225,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,DuS3PzG579F2ZEegaew82gA.png?originalFilename=image.png&width=192&height=192\",\n\t\t\t\t\t\t\tfillImageOriginalName: \"QmNTzwBZQ6EPfUz3XoqzcmfACp91QrQjdsSs2jx4p6sxuT?auto=format&w=1200.jpg\",\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: 1200,\n\t\t\t\t\t\t\tfillImagePixelHeight: 904,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: 500,\n\t\t\t\t\t\t\tintrinsicHeight: 500,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 6,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.09130434782608718,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 30,\n\t\t\t\t\t\t\theight: 30,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 8,\n\t\t\t\t\t\t\tradiusTopRight: 8,\n\t\t\t\t\t\t\tradiusBottomRight: 8,\n\t\t\t\t\t\t\tradiusBottomLeft: 8,\n\t\t\t\t\t\t\tradius: 8,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"zBuKnEk35\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.23170731707317097,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 600; --font-selector: SW50ZXItU2VtaUJvbGQ=; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1em; --framer-text-alignment: left;\\\">Kaloyan</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"center\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"YKZ1p4NZH\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.7621951219512197,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.1em; --framer-text-alignment: left;\\\">5m ago</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"bottom\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\t\t\tgap: 0,\n\t\t\t\t\t\t\tstackAlignment: \"start\",\n\t\t\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5304347826086959,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"IlmbI3HE1\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"VA4L1m6F9\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"n1chyRGYK\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"znR4My42i\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"IlmbI3HE1\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathBoolean: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 13,\n\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tx: 1.5,\n\t\t\t\t\t\t\t\t\ty: 6.5,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\t\theight: 16,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9842604998,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"aalz8mPeO\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"start\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.49356223175965686,\n\t\t\t\t\tcenterAnchorY: 0.13043478260869587,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 36,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"H4P3JZL95\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ioORpJ2fa\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"H4P3JZL95\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.304878048780488,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 230,\n\t\t\t\t\t\t\theight: 50.5,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Could we try GT Walsheim?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"aalz8mPeO\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.6771653543307089,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 230,\n\t\t\t\t\theight: 82,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"Comment Row\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"12px\",\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.24858757062146916,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 177,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: true,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tisVariant: false,\n\t\t\tisBreakpoint: false,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"UIj8eJdLw\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#26f\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 60,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 27,\n\t\t\tcenterAnchorX: 0.22977346278317173,\n\t\t\tcenterAnchorY: 0.8317757009345796,\n\t\t\twidthType: 3,\n\t\t\theightType: 3,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"rXfEc_bfs\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"line above reply\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"D3EbvbO41\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"oKvehYADl\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"zlwz0XtkD\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"ctfMZDcpG\",\n\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\tparentid: \"zlwz0XtkD\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: -2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: -2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 10,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 1.25,\n\t\t\t\t\t\t\t\t\t\t\ty: 10,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: -0.6903559372876771,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 8.75,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0.6903559372885866,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: -2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"oKvehYADl\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"iZgGYBd5H\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"oKvehYADl\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Reply\u2026</p>\",\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"dPXNzHtNG\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"AnhIHNx5z\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"ttNQOJUaS\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"xB1xxqGeJ\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"ttNQOJUaS\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"AnhIHNx5z\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\t\t\tcontentHash: 10629349121,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"dPXNzHtNG\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"MlRqMdDNq\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"dPXNzHtNG\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Approve?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"6px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"XVVrA3uSM\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"NAiT0431Z\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"sQb7FBkBn\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: false,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgba(0,170,255,0.5)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\t\t\theight: 5,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 2,\n\t\t\t\t\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tlineJoin: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tlineCap: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"iaH_igToJ\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 8,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: false,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgba(0,170,255,0.5)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 2,\n\t\t\t\t\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tlineJoin: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tlineCap: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"NAiT0431Z\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"XVVrA3uSM\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 51,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 34,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.3652694610778445,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4400000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9336318606,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tboxShadows: [],\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(51, 51, 51)\",\n\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t},\n\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t},\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 8,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.9523809523809526,\n\t\t\t\t\tcenterAnchorY: 0.6666666666666669,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 20,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\tradius: 5,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"REPLY \",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 10,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.7727272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 20,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"YZSSSz9yF\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"BOTTOM LINE\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"TVDqWHlto\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"tBifBQrek\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ickfSOLl8\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"Oai05U5HI\",\n\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\tparentid: \"ickfSOLl8\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"tBifBQrek\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"MGCrYOlFT\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"tBifBQrek\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Resolve</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"TVDqWHlto\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tonTap: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tidentifier: \"fc7f2715-72cf-4028-b9b2-ce147d00a230\",\n\t\t\t\t\t\t\tactionIdentifier: \"framer/useSetVariant\",\n\t\t\t\t\t\t\tcontrols: {\n\t\t\t\t\t\t\t\ttype: {\n\t\t\t\t\t\t\t\t\ttype: \"enum\",\n\t\t\t\t\t\t\t\t\tvalue: \"set\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvariantId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\tvalue: \"yUpjhheup\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tpauseOffscreen: {\n\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\tvalue: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"hCF05ggJW\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"Sb381TaKu\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"r0uShZq82\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"GawuHgvwG\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"r0uShZq82\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"Sb381TaKu\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\t\t\tcontentHash: 10629349121,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hCF05ggJW\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"JlQYhlAnB\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"hCF05ggJW\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Approve?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"TVDqWHlto\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"6px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 10,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.7727272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 20,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Modal\",\n\tvisible: true,\n\taspectRatio: null,\n\tboxShadows: [\n\t\t{\n\t\t\ttype: \"box\",\n\t\t\tcolor: \"rgba(0, 0, 0, 0.2)\",\n\t\t\tx: 0,\n\t\t\ty: 4,\n\t\t\tinset: false,\n\t\t\tblur: 8,\n\t\t\tspread: 0,\n\t\t\tdiffusion: 0.5,\n\t\t\tfocus: 0.5,\n\t\t\tid: \"rn6vnVO_J\",\n\t\t},\n\t],\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"#111111\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"10px\",\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\tmoduleSourceRevision: 3837616980,\n\tmoduleSourceRevisionHint: 525,\n\tmoduleSourceRevisionCommittedHint: 525,\n\topacity: 1,\n\toverflow: \"hidden\",\n\tpadding: 10,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 10,\n\tpaddingBottom: 10,\n\tpaddingLeft: 10,\n\tconstraintsLocked: false,\n\tleft: 4618,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.6522727272727274,\n\tcenterAnchorY: 0.18631578947368443,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 260,\n\theight: 280,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 15,\n\tradiusTopRight: 15,\n\tradiusBottomRight: 15,\n\tradiusBottomLeft: 15,\n\tradius: 15,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\ttransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 400,\n\t\tdamping: 30,\n\t\tmass: 1,\n\t\tbounce: 0.3,\n\t\tdurationBasedSpring: true,\n\t\tstagger: 0,\n\t},\n\texportOptions: [],\n\tframePreset: null,\n\tzIndex: 1,\n}\n\nconst b = {\n\tid: \"HxdvKnkyF\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"DGeJ9mIph\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"H0Bqn5xa_\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"pWbbUTaZk\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 225,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,PNKbO6dGnRRwEvctPlhddS3H2s.png?originalFilename=image.png&width=512&height=512\",\n\t\t\t\t\t\t\tfillImageOriginalName: \"QmNTzwBZQ6EPfUz3XoqzcmfACp91QrQjdsSs2jx4p6sxuT?auto=format&w=1200.jpg\",\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: 1200,\n\t\t\t\t\t\t\tfillImagePixelHeight: 904,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: 500,\n\t\t\t\t\t\t\tintrinsicHeight: 500,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 6,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.09130434782608718,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 30,\n\t\t\t\t\t\t\theight: 30,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 100,\n\t\t\t\t\t\t\tradiusTopRight: 100,\n\t\t\t\t\t\t\tradiusBottomRight: 100,\n\t\t\t\t\t\t\tradiusBottomLeft: 100,\n\t\t\t\t\t\t\tradius: 100,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"F1gjQsl58\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.23170731707317097,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 600; --font-selector: SW50ZXItU2VtaUJvbGQ=; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1em; --framer-text-alignment: left;\\\">Jurre</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"center\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"uokBzJ3zD\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"VVP_P9KkI\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.7621951219512197,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.1em; --framer-text-alignment: left;\\\">30m ago</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"bottom\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\t\t\tgap: 0,\n\t\t\t\t\t\t\tstackAlignment: \"start\",\n\t\t\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5304347826086959,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"g7SEOZB5u\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"OAwBT41Y7\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"uvowP6pU2\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"pzU4Tbvft\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"pg11vNsSu\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"g7SEOZB5u\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathBoolean: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 13,\n\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tx: 1.5,\n\t\t\t\t\t\t\t\t\ty: 6.5,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"H0Bqn5xa_\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\t\theight: 16,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9842604998,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"DGeJ9mIph\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"start\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.49356223175965686,\n\t\t\t\t\tcenterAnchorY: 0.13043478260869587,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 36,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"LnE_Ql896\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"LcDu3OaH2\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"LnE_Ql896\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.304878048780488,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 230,\n\t\t\t\t\t\t\theight: 50.5,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">I don\u2019t love this font here\u2026</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"DGeJ9mIph\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.6771653543307089,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 230,\n\t\t\t\t\theight: 82,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"Comment Row\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"12px\",\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.24858757062146916,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 177,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: true,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tisVariant: false,\n\t\t\tisBreakpoint: false,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"jHOXltPJI\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"aalz8mPeO\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hKMys739n\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"XiKKVdsh_\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 225,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(286, 100%, 78%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(180, 100%, 66%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-a2SrtYH5D-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,DuS3PzG579F2ZEegaew82gA.png?originalFilename=image.png&width=192&height=192\",\n\t\t\t\t\t\t\tfillImageOriginalName: \"QmNTzwBZQ6EPfUz3XoqzcmfACp91QrQjdsSs2jx4p6sxuT?auto=format&w=1200.jpg\",\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: 1200,\n\t\t\t\t\t\t\tfillImagePixelHeight: 904,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: 500,\n\t\t\t\t\t\t\tintrinsicHeight: 500,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 6,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.09130434782608718,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 30,\n\t\t\t\t\t\t\theight: 30,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 100,\n\t\t\t\t\t\t\tradiusTopRight: 100,\n\t\t\t\t\t\t\tradiusBottomRight: 100,\n\t\t\t\t\t\t\tradiusBottomLeft: 100,\n\t\t\t\t\t\t\tradius: 100,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"zBuKnEk35\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.23170731707317097,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 600; --font-selector: SW50ZXItU2VtaUJvbGQ=; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1em; --framer-text-alignment: left;\\\">Kaloyan</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"center\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"YKZ1p4NZH\",\n\t\t\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t\tparentid: \"eI63RrXeS\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.7621951219512197,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.1em; --framer-text-alignment: left;\\\">5m ago</p>\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\t\t\ttextVerticalAlignment: \"bottom\",\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\t\t\tgap: 0,\n\t\t\t\t\t\t\tstackAlignment: \"start\",\n\t\t\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5304347826086959,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 3,\n\t\t\t\t\t\t\theightType: 3,\n\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"IlmbI3HE1\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"VA4L1m6F9\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"n1chyRGYK\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"znR4My42i\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"OQOIQkpuf\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 3,\n\t\t\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"IlmbI3HE1\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathBoolean: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 13,\n\t\t\t\t\t\t\t\t\theight: 3,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\tx: 1.5,\n\t\t\t\t\t\t\t\t\ty: 6.5,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hKMys739n\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\t\theight: 16,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9842604998,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"aalz8mPeO\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"start\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.49356223175965686,\n\t\t\t\t\tcenterAnchorY: 0.13043478260869587,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 36,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"H4P3JZL95\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ioORpJ2fa\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"H4P3JZL95\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.304878048780488,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 230,\n\t\t\t\t\t\t\theight: 50.5,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Could we try GT Walsheim?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"stylesPresetHeading1\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"aalz8mPeO\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 10,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.6771653543307089,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 230,\n\t\t\t\t\theight: 82,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"Comment Row\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"12px\",\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.24858757062146916,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 177,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: true,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tisVariant: false,\n\t\t\tisBreakpoint: false,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"UIj8eJdLw\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#26f\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 60,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 27,\n\t\t\tcenterAnchorX: 0.22977346278317173,\n\t\t\tcenterAnchorY: 0.8317757009345796,\n\t\t\twidthType: 3,\n\t\t\theightType: 3,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"rXfEc_bfs\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"line above reply\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"D3EbvbO41\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"oKvehYADl\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"zlwz0XtkD\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"ctfMZDcpG\",\n\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\tparentid: \"zlwz0XtkD\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: -2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: -2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 10,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 2.7614237491543463,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 1.25,\n\t\t\t\t\t\t\t\t\t\t\ty: 10,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: -0.6903559372876771,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 8.75,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0.6903559372885866,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"disconnected\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: -2.7614237491538915,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"oKvehYADl\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"iZgGYBd5H\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"oKvehYADl\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Reply\u2026</p>\",\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"dPXNzHtNG\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"AnhIHNx5z\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"ttNQOJUaS\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"xB1xxqGeJ\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"ttNQOJUaS\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"AnhIHNx5z\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\t\t\tcontentHash: 10629349121,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"dPXNzHtNG\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"MlRqMdDNq\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"dPXNzHtNG\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Approve?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"6px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"XVVrA3uSM\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"NAiT0431Z\",\n\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"sQb7FBkBn\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: false,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgba(0,170,255,0.5)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\t\t\theight: 5,\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 2,\n\t\t\t\t\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tlineJoin: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tlineCap: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"iaH_igToJ\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"tvMnH70jx\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 8,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: false,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgba(0,170,255,0.5)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 2,\n\t\t\t\t\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tlineJoin: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tlineCap: \"round\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"NAiT0431Z\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\twidth: 10,\n\t\t\t\t\t\t\t\t\theight: 10,\n\t\t\t\t\t\t\t\t\tx: 5,\n\t\t\t\t\t\t\t\t\ty: 5,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"XVVrA3uSM\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 51,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 34,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.3652694610778445,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4400000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\tcontentHash: 9336318606,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"D3EbvbO41\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tboxShadows: [],\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(51, 51, 51)\",\n\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t},\n\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t},\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: 8,\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.9523809523809526,\n\t\t\t\t\tcenterAnchorY: 0.6666666666666669,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 20,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\tradius: 5,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"REPLY \",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 10,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.7727272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 20,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"YZSSSz9yF\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: \"BOTTOM LINE\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255, 255, 255, 0.06)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 21,\n\t\t\tcenterAnchorX: 0.47826086956521763,\n\t\t\tcenterAnchorY: 0.8352272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"TVDqWHlto\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"tBifBQrek\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ickfSOLl8\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"Oai05U5HI\",\n\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\tparentid: \"ickfSOLl8\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"tBifBQrek\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"MGCrYOlFT\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"tBifBQrek\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Resolve</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"TVDqWHlto\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tonTap: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tidentifier: \"fc7f2715-72cf-4028-b9b2-ce147d00a230\",\n\t\t\t\t\t\t\tactionIdentifier: \"framer/useSetVariant\",\n\t\t\t\t\t\t\tcontrols: {\n\t\t\t\t\t\t\t\ttype: {\n\t\t\t\t\t\t\t\t\ttype: \"enum\",\n\t\t\t\t\t\t\t\t\tvalue: \"set\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvariantId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\tvalue: \"yUpjhheup\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tpauseOffscreen: {\n\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\tvalue: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"hCF05ggJW\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"Sb381TaKu\",\n\t\t\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"r0uShZq82\",\n\t\t\t\t\t\t\t\t\t__class: \"ShapeContainerNode\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"GawuHgvwG\",\n\t\t\t\t\t\t\t\t\t\t\t__class: \"PathNode\",\n\t\t\t\t\t\t\t\t\t\t\tparentid: \"r0uShZq82\",\n\t\t\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t\tpathSegments: [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 7.4347826086959685,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 10.565217391304031,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1.25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t__class: \"PathSegment\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\ty: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleMirroring: \"straight\",\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleOutY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInX: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleInY: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tradius: 1,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\tpathClosed: true,\n\t\t\t\t\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\t\t\tfillColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\t\t\t\t\theight: 18,\n\t\t\t\t\t\t\t\t\t\t\tx: 1,\n\t\t\t\t\t\t\t\t\t\t\ty: 1,\n\t\t\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tparentid: \"Sb381TaKu\",\n\t\t\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\t\t\tfillColor: \"#FFF\",\n\t\t\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\t\t\tsizeToFit: false,\n\t\t\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\t\t\texportIncludesBackground: false,\n\t\t\t\t\t\t\t\t\tcontentHash: 10629349121,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparentid: \"hCF05ggJW\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Enter Icon\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tborderEnabled: true,\n\t\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t\tborderColor: \"rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\t\t\tborderPerSide: false,\n\t\t\t\t\t\t\tborderTop: 1,\n\t\t\t\t\t\t\tborderRight: 1,\n\t\t\t\t\t\t\tborderBottom: 1,\n\t\t\t\t\t\t\tborderLeft: 1,\n\t\t\t\t\t\t\tboxShadows: [],\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(17, 17, 17)\",\n\t\t\t\t\t\t\tfillLinearGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"LinearGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillRadialGradient: {\n\t\t\t\t\t\t\t\talpha: 1,\n\t\t\t\t\t\t\t\twidthFactor: 0.5,\n\t\t\t\t\t\t\t\theightFactor: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorX: 0.5,\n\t\t\t\t\t\t\t\tcenterAnchorY: 0.5,\n\t\t\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"#fafafa\",\n\t\t\t\t\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-0\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t__class: \"GradientColorStop\",\n\t\t\t\t\t\t\t\t\t\tvalue: \"hsl(0, 0%, 100%)\",\n\t\t\t\t\t\t\t\t\t\tposition: 1,\n\t\t\t\t\t\t\t\t\t\tid: \"gradient-stop-WE1wAgTaj-1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t__class: \"RadialGradient\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tguidesX: [],\n\t\t\t\t\t\t\tguidesY: [],\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.0735294117647061,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t\theight: 20,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 5,\n\t\t\t\t\t\t\tradiusTopRight: 5,\n\t\t\t\t\t\t\tradiusBottomRight: 5,\n\t\t\t\t\t\t\tradiusBottomLeft: 5,\n\t\t\t\t\t\t\tradius: 5,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\tisMaster: false,\n\t\t\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tframePreset: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"JlQYhlAnB\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"hCF05ggJW\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0.5,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.772058823529412,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 61,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(255, 255, 255); --framer-font-size: 12px; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'tnum' on; --framer-line-height: 1.4em; --framer-text-alignment: left;\\\">Approve?</p>\",\n\t\t\t\t\t\t\tstylePresetHeading1: \"D3aHEjc1H\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"l2rmEhInC\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"iE6FmUPPG\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\t\t\tstylePresetLink: \"s4GcmWQLn\",\n\t\t\t\t\t\t\tisTarget: true,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"TVDqWHlto\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"6px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.32380952380952405,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 136,\n\t\t\t\t\theight: 20,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"HxdvKnkyF\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 10,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.7727272727272729,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 20,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Modal\",\n\tvisible: true,\n\taspectRatio: null,\n\tboxShadows: [\n\t\t{\n\t\t\ttype: \"box\",\n\t\t\tcolor: \"rgba(0, 0, 0, 0.2)\",\n\t\t\tx: 0,\n\t\t\ty: 4,\n\t\t\tinset: false,\n\t\t\tblur: 8,\n\t\t\tspread: 0,\n\t\t\tdiffusion: 0.5,\n\t\t\tfocus: 0.5,\n\t\t\tid: \"rn6vnVO_J\",\n\t\t},\n\t],\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"#111111\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"10px\",\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\tmoduleSourceRevision: 3837616980,\n\tmoduleSourceRevisionHint: 525,\n\tmoduleSourceRevisionCommittedHint: 525,\n\topacity: 1,\n\toverflow: \"hidden\",\n\tpadding: 10,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 10,\n\tpaddingBottom: 10,\n\tpaddingLeft: 10,\n\tconstraintsLocked: false,\n\tleft: 4618,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.6522727272727274,\n\tcenterAnchorY: 0.18631578947368443,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 260,\n\theight: 280,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 15,\n\tradiusTopRight: 15,\n\tradiusBottomRight: 15,\n\tradiusBottomLeft: 15,\n\tradius: 15,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\ttransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 400,\n\t\tdamping: 30,\n\t\tmass: 1,\n\t\tbounce: 0.3,\n\t\tdurationBasedSpring: true,\n\t\tstagger: 0,\n\t},\n\texportOptions: [],\n\tframePreset: null,\n\tzIndex: 1,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst desktop = {\n\tid: \"WQLkyLRf1\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: \"augiA20Il\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: \"Desktop\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\topacity: 1,\n\toverflow: \"clip\",\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1200,\n\theight: 1000,\n\tpreviewSettings: {\n\t\t__class: \"PreviewSettings\",\n\t\tresponsive: true,\n\t\ttouch: false,\n\t},\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: true,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\tisVariant: true,\n\tisBreakpoint: true,\n\tvariantTransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 500,\n\t\tdamping: 60,\n\t\tmass: 1,\n\t},\n\tviewportHeight: 800,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst tablet = {\n\tid: \"dz8fcT1Jy\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: \"augiA20Il\",\n\tduplicatedFrom: [\"WQLkyLRf1\"],\n\toriginalid: \"WQLkyLRf1\",\n\tname: \"Tablet\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\topacity: 1,\n\toverflow: \"clip\",\n\tconstraintsLocked: false,\n\tleft: 1300,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 810,\n\theight: 1000,\n\tpreviewSettings: {\n\t\t__class: \"PreviewSettings\",\n\t\tresponsive: true,\n\t\ttouch: false,\n\t},\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: {\n\t\tmaster: \"WQLkyLRf1\",\n\t\toverrides: {\n\t\t\tWQLkyLRf1: {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 1300,\n\t\t\t\tright: null,\n\t\t\t\tbottom: null,\n\t\t\t\tcenterAnchorX: 0,\n\t\t\t\tcenterAnchorY: 0,\n\t\t\t\tname: \"Tablet\",\n\t\t\t\tviewportHeight: 1080,\n\t\t\t\twidth: 810,\n\t\t\t\twidthType: 0,\n\t\t\t},\n\t\t},\n\t},\n\tisVariant: true,\n\tisBreakpoint: true,\n\tvariantTransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 500,\n\t\tdamping: 60,\n\t\tmass: 1,\n\t},\n\tviewportHeight: 1080,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tdesktop: canvasNodeFromValue(desktop)!,\n\ttablet: canvasNodeFromValue(tablet)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"LqZH79tnb\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"M1pajgcXQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"bZWHHHxFn\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"M1pajgcXQ\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Avatar\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"image\",\n\t\t\t\t\t\t\tfieldPath: \"Avatar Image\",\n\t\t\t\t\t\t\tfieldOptions: {\n\t\t\t\t\t\t\t\t\"\": \"data:framer/asset-reference,lk4lwfSeQMCxwTVOCqzwauSVvjQ.png?originalFilename=P42.png&width=2560&height=1440\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\tfillColor: \"rgb(0, 0, 0)\",\n\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\"data:framer/asset-reference,YJNBYfT7qFdRV7zfS9o1GlfuY.png?originalFilename=GEOAV_1557.png&width=400&height=400\",\n\t\t\t\t\tfillImageOriginalName: \"GEOAV_1557.png\",\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: 400,\n\t\t\t\t\tfillImagePixelHeight: 400,\n\t\t\t\t\tfillImageAlts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"UVud9Pyci\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,mGgVDEMVEz1Y9vBApD0rDqmENXE.png?originalFilename=GEOAV_1704.png&width=400&height=400\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"CV8EmGQkc\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,iePjwFmmdOppWQd5iQSbr8O4UQI.png?originalFilename=P48.png&width=2560&height=1440\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"kI5Qle7Wi\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,lk4lwfSeQMCxwTVOCqzwauSVvjQ.png?originalFilename=P42.png&width=2560&height=1440\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\timageRendering: \"auto\",\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradius: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor: \"var(--token-c8d5102d-c7bb-4f52-a844-7e4501c88bfe, rgba(255, 255, 255, 0.1))\",\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: false,\n\t\t\tborderTop: 1,\n\t\t\tborderRight: 1,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 1,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"var(--token-0ebe03cc-1b8a-41cc-81b4-5ac442c9491c, rgb(250, 250, 250))\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.050000000000000225,\n\t\t\tcenterAnchorY: 0.1129943502824861,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 100,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"U4rh_qV5a\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomCursorSmartComponentId: \"XZ7fLlOQ2\",\n\t\t\tcustomCursorFollow: true,\n\t\t\tcustomCursorOffsetX: 40,\n\t\t\tcustomCursorOffsetY: 40,\n\t\t\tcustomCursorAlignment: \"start\",\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Main Title\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tgridItemFillCellWidth: false,\n\t\t\tgridItemFillCellHeight: false,\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.0927835051546394,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 19,\n\t\t\thtml: \"<h1 style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-text-color: var(--token-caea32be-b178-4941-bdf1-3673b30acb2a, rgb(0, 0, 0)); --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'blwf' on, 'cv09' on, 'cv03' on, 'cv04' on, 'cv11' on, 'ss08' on; --framer-text-alignment: left;\\\">Daniela</h1>\",\n\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\tstylePresetParagraph: \"WzZ06kGTO\",\n\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: \"RcwZO5MGI\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Descriptive Paragraph\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 0,\n\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-text-color: var(--token-eabbb603-0b08-410e-abe1-075b528c3859, rgb(102, 102, 102)); --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'ss01' on, 'ss03' on, 'ss08' on, 'tnum' on; --framer-text-alignment: left;\\\">Designer, illustrator, and product engineer. Sharing my work, writing, and collaborations. Based in Porto, working globally. Welcome.</p>\",\n\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\tstylePresetHeading2: \"g5mBas0rL\",\n\t\t\tstylePresetHeading3: \"UJfs6M1yx\",\n\t\t\tstylePresetHeading4: \"Zq16D8pKi\",\n\t\t\tstylePresetHeading5: \"RWP_FL7Mv\",\n\t\t\tstylePresetHeading6: \"xRobnJ4fV\",\n\t\t\tstylePresetParagraph: \"rZ0z4rjfn\",\n\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\tstylePresetInlineCode: \"qK6j5CvIo\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\ttextWrapBalance: true,\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: \"h1bmS5nt3\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"p1Bexb_xV\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"h1bmS5nt3\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"Descriptive Paragraph\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0,\n\t\t\t\t\tcenterAnchorY: 0,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 0,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-text-color: rgb(255, 255, 255); --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'ss01' on, 'ss03' on, 'ss08' on, 'tnum' on; --framer-text-alignment: left;\\\">Reach out</p>\",\n\t\t\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\t\t\tstylePresetHeading2: \"g5mBas0rL\",\n\t\t\t\t\tstylePresetHeading3: \"UJfs6M1yx\",\n\t\t\t\t\tstylePresetHeading4: \"Zq16D8pKi\",\n\t\t\t\t\tstylePresetHeading5: \"RWP_FL7Mv\",\n\t\t\t\t\tstylePresetHeading6: \"xRobnJ4fV\",\n\t\t\t\t\tstylePresetParagraph: \"rZ0z4rjfn\",\n\t\t\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\t\t\tstylePresetInlineCode: \"qK6j5CvIo\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgb(0, 153, 255)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 6,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 6,\n\t\t\tpaddingRight: 6,\n\t\t\tpaddingBottom: 6,\n\t\t\tpaddingLeft: 6,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.12500000000000022,\n\t\t\tcenterAnchorY: 0.8924731182795701,\n\t\t\twidthType: 0,\n\t\t\theightType: 2,\n\t\t\twidth: 100,\n\t\t\theight: 38,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 100,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Header\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The layout incorporates rounded corners for the avatar image, creating a soft and approachable look. - Text elements use a combination of different font styles and weights, including 'Inter' and 'Geist Variable', for visual hierarchy and appeal. - A subtle border is applied to the avatar container, enhancing its visual definition without being overly prominent. - The design includes a clear link for interactions, styled with an underline and a distinct text color for visibility.\\n**Layout**\\n- The content is structured in a single column, with elements stacked vertically and aligned to the left. - There is consistent spacing between each block of content (avatar, name, description, and call to action). - The avatar is a fixed size, while text blocks are set to occupy the full available width within the container. - The overall width of the section is constrained to 400 pixels, providing a focused presentation.\\n**Placement**\\n- This section can be placed at the top of an 'About' page. - It can be featured as a prominent element on a personal portfolio homepage. - Suitable for a sidebar element on a blog or article page. - It can serve as an introductory panel in a larger professional profile.\\n**Usage**\\n- This section is suitable for an 'About Me' or 'Profile' page, introducing an individual with their photo, name, and a short bio. - It can be used to quickly convey a person's professional role and background. - Ideal for personal branding sections on websites or portfolios. - Effective for establishing a personal connection with the audience.\\n**Text Length**\\n- The name should be concise, ideally 1-2 words. - The descriptive text should be a short paragraph, up to 3-4 lines. - The call to action text should be brief, 1-2 words, such as \\\"Reach out\\\" or \\\"Contact me\\\".\",\n\tcustomizationsCategory: \"Hero\",\n\tkitSectionHash: 10037622584,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 2077510902,\n\tmoduleSourceRevisionHint: 194,\n\tmoduleSourceRevisionCommittedHint: 194,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.13750000000000023,\n\tcenterAnchorY: 0.13682092555332015,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 177,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"LqZH79tnb\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"M1pajgcXQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"bZWHHHxFn\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"M1pajgcXQ\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Avatar\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"image\",\n\t\t\t\t\t\t\tfieldPath: \"Avatar Image\",\n\t\t\t\t\t\t\tfieldOptions: {\n\t\t\t\t\t\t\t\t\"\": \"data:framer/asset-reference,lk4lwfSeQMCxwTVOCqzwauSVvjQ.png?originalFilename=P42.png&width=2560&height=1440\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\tfillColor: \"rgb(0, 0, 0)\",\n\t\t\t\t\tfillImage:\n\t\t\t\t\t\t\"data:framer/asset-reference,YJNBYfT7qFdRV7zfS9o1GlfuY.png?originalFilename=GEOAV_1557.png&width=400&height=400\",\n\t\t\t\t\tfillImageOriginalName: \"GEOAV_1557.png\",\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: 400,\n\t\t\t\t\tfillImagePixelHeight: 400,\n\t\t\t\t\tfillImageAlts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"UVud9Pyci\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,mGgVDEMVEz1Y9vBApD0rDqmENXE.png?originalFilename=GEOAV_1704.png&width=400&height=400\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"CV8EmGQkc\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,iePjwFmmdOppWQd5iQSbr8O4UQI.png?originalFilename=P48.png&width=2560&height=1440\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"kI5Qle7Wi\",\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"data:framer/asset-reference,lk4lwfSeQMCxwTVOCqzwauSVvjQ.png?originalFilename=P42.png&width=2560&height=1440\",\n\t\t\t\t\t\t\talt: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\timageRendering: \"auto\",\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradius: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor: \"var(--token-c8d5102d-c7bb-4f52-a844-7e4501c88bfe, rgba(255, 255, 255, 0.1))\",\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: false,\n\t\t\tborderTop: 1,\n\t\t\tborderRight: 1,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 1,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"var(--token-0ebe03cc-1b8a-41cc-81b4-5ac442c9491c, rgb(250, 250, 250))\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.050000000000000225,\n\t\t\tcenterAnchorY: 0.1129943502824861,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 100,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"U4rh_qV5a\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomCursorSmartComponentId: \"XZ7fLlOQ2\",\n\t\t\tcustomCursorFollow: true,\n\t\t\tcustomCursorOffsetX: 40,\n\t\t\tcustomCursorOffsetY: 40,\n\t\t\tcustomCursorAlignment: \"start\",\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Main Title\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tgridItemFillCellWidth: false,\n\t\t\tgridItemFillCellHeight: false,\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.0927835051546394,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 19,\n\t\t\thtml: \"<h1 style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-text-color: var(--token-caea32be-b178-4941-bdf1-3673b30acb2a, rgb(0, 0, 0)); --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'blwf' on, 'cv09' on, 'cv03' on, 'cv04' on, 'cv11' on, 'ss08' on; --framer-text-alignment: left;\\\">Daniela</h1>\",\n\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\tstylePresetParagraph: \"WzZ06kGTO\",\n\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: \"RcwZO5MGI\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Descriptive Paragraph\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 0,\n\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-text-color: var(--token-eabbb603-0b08-410e-abe1-075b528c3859, rgb(102, 102, 102)); --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'ss01' on, 'ss03' on, 'ss08' on, 'tnum' on; --framer-text-alignment: left;\\\">Designer, illustrator, and product engineer. Sharing my work, writing, and collaborations. Based in Porto, working globally. Welcome.</p>\",\n\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\tstylePresetHeading2: \"g5mBas0rL\",\n\t\t\tstylePresetHeading3: \"UJfs6M1yx\",\n\t\t\tstylePresetHeading4: \"Zq16D8pKi\",\n\t\t\tstylePresetHeading5: \"RWP_FL7Mv\",\n\t\t\tstylePresetHeading6: \"xRobnJ4fV\",\n\t\t\tstylePresetParagraph: \"rZ0z4rjfn\",\n\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\tstylePresetInlineCode: \"qK6j5CvIo\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\ttextWrapBalance: true,\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: \"h1bmS5nt3\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"p1Bexb_xV\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"h1bmS5nt3\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"Descriptive Paragraph\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0,\n\t\t\t\t\tcenterAnchorY: 0,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 0,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Geist Variable&quot;, &quot;Geist Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;wght&quot; 450; --font-selector: R0Y7R2Vpc3QtdmFyaWFibGUtcmVndWxhclZGPUluZG5hSFFpSURRMU1BPT0=; --framer-font-size: calc(var(--framer-root-font-size, 1rem) * 1); --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'ss01' on, 'ss03' on, 'ss08' on, 'tnum' on; --framer-text-alignment: left;\\\">Reach out</p>\",\n\t\t\t\t\tstylePresetHeading1: \"h0UVKC7py\",\n\t\t\t\t\tstylePresetHeading2: \"g5mBas0rL\",\n\t\t\t\t\tstylePresetHeading3: \"UJfs6M1yx\",\n\t\t\t\t\tstylePresetHeading4: \"Zq16D8pKi\",\n\t\t\t\t\tstylePresetHeading5: \"RWP_FL7Mv\",\n\t\t\t\t\tstylePresetHeading6: \"xRobnJ4fV\",\n\t\t\t\t\tstylePresetParagraph: \"rZ0z4rjfn\",\n\t\t\t\t\tstylePresetLink: \"ZdJh3ELRN\",\n\t\t\t\t\tstylePresetInlineCode: \"qK6j5CvIo\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\ttextWrapBalance: true,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"LqZH79tnb\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgb(255, 187, 0)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 6,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 6,\n\t\t\tpaddingRight: 6,\n\t\t\tpaddingBottom: 6,\n\t\t\tpaddingLeft: 6,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.12500000000000022,\n\t\t\tcenterAnchorY: 0.8924731182795701,\n\t\t\twidthType: 0,\n\t\t\theightType: 2,\n\t\t\twidth: 100,\n\t\t\theight: 38,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 100,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Header\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The layout incorporates rounded corners for the avatar image, creating a soft and approachable look. - Text elements use a combination of different font styles and weights, including 'Inter' and 'Geist Variable', for visual hierarchy and appeal. - A subtle border is applied to the avatar container, enhancing its visual definition without being overly prominent. - The design includes a clear link for interactions, styled with an underline and a distinct text color for visibility.\\n**Layout**\\n- The content is structured in a single column, with elements stacked vertically and aligned to the left. - There is consistent spacing between each block of content (avatar, name, description, and call to action). - The avatar is a fixed size, while text blocks are set to occupy the full available width within the container. - The overall width of the section is constrained to 400 pixels, providing a focused presentation.\\n**Placement**\\n- This section can be placed at the top of an 'About' page. - It can be featured as a prominent element on a personal portfolio homepage. - Suitable for a sidebar element on a blog or article page. - It can serve as an introductory panel in a larger professional profile.\\n**Usage**\\n- This section is suitable for an 'About Me' or 'Profile' page, introducing an individual with their photo, name, and a short bio. - It can be used to quickly convey a person's professional role and background. - Ideal for personal branding sections on websites or portfolios. - Effective for establishing a personal connection with the audience.\\n**Text Length**\\n- The name should be concise, ideally 1-2 words. - The descriptive text should be a short paragraph, up to 3-4 lines. - The call to action text should be brief, 1-2 words, such as \\\"Reach out\\\" or \\\"Contact me\\\".\",\n\tcustomizationsCategory: \"Hero\",\n\tkitSectionHash: 10037622584,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 2077510902,\n\tmoduleSourceRevisionHint: 194,\n\tmoduleSourceRevisionCommittedHint: 194,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.13750000000000023,\n\tcenterAnchorY: 0.13682092555332015,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 177,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"d0zuItEQC\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"qHgsNDPaB\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"SQ7cVI2Yw\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\tduplicatedFrom: [\"YwrjhuAtn\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: 60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"qS0q2CPx2\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\tduplicatedFrom: [\"XPhvf1E2D\", \"U4lI8OD4z\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: -60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ZeXSCrVvq\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\tduplicatedFrom: [\"zFp2eONDW\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 16,\n\t\t\t\t\ty: 16,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 8,\n\t\t\t\t\theight: 8,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"d0zuItEQC\",\n\t\t\tduplicatedFrom: [\"z3WMwbYcx\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Logo\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.020833333333333554,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"r8KWpd9ws\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kc0BgmOwu\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Gallery</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"yGd6oMgDm\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Blog</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Si8u8Y5Cc\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Updates</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ZUk3po84b\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\", \"R0p0ayBQq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Pricing</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"d0zuItEQC\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"end\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"djquwtRhj\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"space-between\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 32,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"d0zuItEQC\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"r8KWpd9ws\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kc0BgmOwu\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Gallery</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"yGd6oMgDm\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Blog</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"qHgsNDPaB\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"SQ7cVI2Yw\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"YwrjhuAtn\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 11,\n\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\trotation: 60,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\theight: 36,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"qS0q2CPx2\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"XPhvf1E2D\", \"U4lI8OD4z\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 11,\n\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\trotation: -60,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\theight: 36,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ZeXSCrVvq\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"zFp2eONDW\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 16,\n\t\t\t\t\t\t\ty: 16,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 8,\n\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"z3WMwbYcx\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Logo\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: -0.021739130434782386,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Si8u8Y5Cc\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Updates</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ZUk3po84b\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\", \"R0p0ayBQq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Pricing</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"d0zuItEQC\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 960,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"djquwtRhj\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 32,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst c = {\n\tid: \"d0zuItEQC\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"r8KWpd9ws\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kc0BgmOwu\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Gallery</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"yGd6oMgDm\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Blog</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"qHgsNDPaB\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"SQ7cVI2Yw\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"YwrjhuAtn\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 11,\n\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\trotation: 60,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\theight: 36,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"qS0q2CPx2\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"XPhvf1E2D\", \"U4lI8OD4z\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 11,\n\t\t\t\t\t\t\ty: 2,\n\t\t\t\t\t\t\trotation: -60,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 18,\n\t\t\t\t\t\t\theight: 36,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"ZeXSCrVvq\",\n\t\t\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\t\t\tparentid: \"qHgsNDPaB\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"zFp2eONDW\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tx: 16,\n\t\t\t\t\t\t\ty: 16,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 8,\n\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"z3WMwbYcx\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Logo\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: -0.021739130434782386,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Si8u8Y5Cc\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Updates</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ZUk3po84b\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"r8KWpd9ws\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\", \"R0p0ayBQq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 3,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Pricing</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"d0zuItEQC\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"djquwtRhj\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 32,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n\t// Make the wrapping stack fill the parent, make the text 1fr.\n\tfill: canvasNodeFromValue(c)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"BSYIFto6I\",\n\t__class: \"RichTextNode\",\n\tchildren: [],\n\tparentid: \"uY6cngHzI\",\n\tduplicatedFrom: [\"SEorABKqz\", \"cM83pCa9_\", \"TxO6xRdYp\", \"MiYEofHUI\"],\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tlinkTextColor: \"#09F\",\n\tlinkTextDecoration: \"underline\",\n\topacity: 1,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.7752808988764047,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 320,\n\theight: 79.5,\n\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Display&quot;, &quot;Inter Display Placeholder&quot;, sans-serif; --framer-font-weight: 500; --font-selector: RlI7SW50ZXJEaXNwbGF5LU1lZGl1bQ==; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 24px; --framer-font-open-type-features: 'cv05' on, 'cv09' on, 'cv01' on, 'ss03' on, 'cv11' on; --framer-line-height: 1.1em; --framer-text-alignment: left;\\\">Gain access to the world\u2019s best AI models, combined with a freeform canvas.</p>\",\n\trotation: 0,\n\tisTarget: false,\n\ttextVerticalAlignment: \"top\",\n\texportOptions: [],\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\n// Minimal frame to serve as scope context for creation tests\nconst minimalFrame = {\n\tid: \"minimalScope\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: null,\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: \"Minimal Scope\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(255, 255, 255)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 0,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1200,\n\theight: 800,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: true,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tminimalScope: canvasNodeFromValue(minimalFrame)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"c61UCZi5o\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Szuwj9DOQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"lIYVvZk0P\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"auhsIVdYj\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ptIMSxNqq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"fg4jnPM9D\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\", \"ptIMSxNqq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"c61UCZi5o\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Cards\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#9ef\",\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"grid\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\tgridColumnCount: 2,\n\t\t\tgridRowCount: 2,\n\t\t\tgridAlignment: \"center\",\n\t\t\tgridColumnWidthType: \"minmax\",\n\t\t\tgridColumnWidth: 200,\n\t\t\tgridColumnMinWidth: 50,\n\t\t\tgridRowHeightType: \"auto\",\n\t\t\tgridRowHeight: 200,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 1,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.4989361702127662,\n\t\t\tcenterAnchorY: 0.5320512820512823,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 229,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 1902271748,\n\tmoduleSourceRevisionHint: 34,\n\tmoduleSourceRevisionCommittedHint: 34,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 3997,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1000,\n\theight: 468,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"c61UCZi5o\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Szuwj9DOQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"lIYVvZk0P\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"auhsIVdYj\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ptIMSxNqq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"fg4jnPM9D\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\", \"ptIMSxNqq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"c61UCZi5o\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Cards\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#9ef\",\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"grid\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\tgridColumnCount: 2,\n\t\t\tgridRowCount: 2,\n\t\t\tgridAlignment: \"center\",\n\t\t\tgridColumnWidthType: \"minmax\",\n\t\t\tgridColumnWidth: 200,\n\t\t\tgridColumnMinWidth: 50,\n\t\t\tgridRowHeightType: \"auto\",\n\t\t\tgridRowHeight: 200,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.21382978723404278,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 500,\n\t\t\theight: 229,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 1525910391,\n\tmoduleSourceRevisionHint: 81,\n\tmoduleSourceRevisionCommittedHint: 81,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 3997,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1000,\n\theight: 468,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"c61UCZi5o\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Szuwj9DOQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"lIYVvZk0P\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"auhsIVdYj\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ptIMSxNqq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"fg4jnPM9D\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\", \"ptIMSxNqq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"c61UCZi5o\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Cards\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#9ef\",\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"grid\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\tgridColumnCount: 2,\n\t\t\tgridRowCount: 2,\n\t\t\tgridAlignment: \"center\",\n\t\t\tgridColumnWidthType: \"fixed\",\n\t\t\tgridColumnWidth: 500,\n\t\t\tgridColumnMinWidth: 50,\n\t\t\tgridRowHeightType: \"auto\",\n\t\t\tgridRowHeight: 200,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: -204,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.24787234042553213,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 229,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 2454724118,\n\tmoduleSourceRevisionHint: 162,\n\tmoduleSourceRevisionCommittedHint: 162,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 3997,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1000,\n\theight: 468,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"c61UCZi5o\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Szuwj9DOQ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"lIYVvZk0P\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"auhsIVdYj\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ptIMSxNqq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"fg4jnPM9D\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Szuwj9DOQ\",\n\t\t\t\t\tduplicatedFrom: [\"lIYVvZk0P\", \"auhsIVdYj\", \"ptIMSxNqq\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Card\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#4cf\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 50,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.11063829787234064,\n\t\t\t\t\tcenterAnchorY: 0.4847161572052404,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 109,\n\t\t\t\t\theight: 94,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"c61UCZi5o\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Cards\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#9ef\",\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"grid\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\tgridColumnCount: 2,\n\t\t\tgridRowCount: 2,\n\t\t\tgridAlignment: \"center\",\n\t\t\tgridColumnWidthType: \"fixed\",\n\t\t\tgridColumnWidth: 250,\n\t\t\tgridColumnMinWidth: 50,\n\t\t\tgridRowHeightType: \"auto\",\n\t\t\tgridRowHeight: 200,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: -204,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.24787234042553213,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 229,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 4263037125,\n\tmoduleSourceRevisionHint: 163,\n\tmoduleSourceRevisionCommittedHint: 163,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 5738,\n\tright: null,\n\ttop: 3997,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1000,\n\theight: 468,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"C5I7YkNuC\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"AJC5kOHh8\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"B4ILTU7MI\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"AJC5kOHh8\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Bird\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 22.541000000000004,\n\t\t\t\t\theight: 19.721,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 84,\n\t\t\t\t\ty: 45,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"aJJPMFNEN\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"VU3B_RwIt\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"aJJPMFNEN\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Dribbble\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 3.590909090909091,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 74.45454660584772,\n\t\t\t\t\theight: 21,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 102.08077239990234,\n\t\t\t\t\ty: 45.58780288696289,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 3,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"bkz8U8nti\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"ABl5q2qiH\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"bkz8U8nti\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Miro\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 27.483198042831248,\n\t\t\t\t\theight: 27.5,\n\t\t\t\t\tx: 187.2706556414396,\n\t\t\t\t\ty: 41.00855886936185,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 3,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"AiNzgkRab\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"HICulCh5Q\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"AiNzgkRab\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Whereby\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 82.71015747167193,\n\t\t\t\t\theight: 20.904843696594234,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 19,\n\t\t\t\t\ty: 5,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"bka_ZTDml\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"jkOPttawX\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"bka_ZTDml\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 3,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#666666\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 0.67,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 26.77510022929286,\n\t\t\t\t\theight: 26.775099059869053,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5750000000000002,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 530.5,\n\t\t\theight: 27,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"suoTnwttU\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"US4yXXBwd\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"suoTnwttU\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 33.468866794828614,\n\t\t\t\t\theight: 33.4688667917834,\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 340,\n\t\t\ttop: 0,\n\t\t\tbottom: -0.5,\n\t\t\tcenterAnchorX: 0.6281250000000003,\n\t\t\tcenterAnchorY: 0.5074626865671644,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 34,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"OWGzH17rf\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"linwV4NWh\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"X5Tb6HENH\",\n\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"linwV4NWh\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 0.59,\n\t\t\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 9.371283593687634,\n\t\t\t\t\t\t\theight: 14.056924015798756,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tx: 23.533352494239807,\n\t\t\t\t\t\t\ty: 3.070726603269577,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"QJe5oJ7Dh\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"linwV4NWh\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Layer Title\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 15,\n\t\t\t\t\t\t\theight: 9,\n\t\t\t\t\t\t\thtml: '<p style=\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 32, &quot;wght&quot; 760; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlETXlMQ0FpZDJkb2RDSWdOell3; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 8px; --framer-letter-spacing: 0px; --framer-line-height: 0.8em; --framer-text-alignment: left;\">CCPA</p>',\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tstylePresetHeading1: \"YAP816Y5n\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"fVxnimdqP\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"YckFIlg3V\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"XHuCPIQKc\",\n\t\t\t\t\t\t\tstylePresetLink: \"ro7OPezbn\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"OWGzH17rf\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255, 255, 255, 0.1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"4.4px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 2.67,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.4800000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 21.5,\n\t\t\t\t\theight: 25,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradius: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.6770833333333336,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 25,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"PwNXj4TG4\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"i_AC1qqT_\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"PwNXj4TG4\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1.4,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 26.929189899435812,\n\t\t\t\t\theight: 15.361356506691777,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 252,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7229166666666669,\n\t\t\tcenterAnchorY: 0.5074626865671644,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 16,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"EeY18lBk7\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"bSXgbYVRv\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"EeY18lBk7\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 50.99999730994341,\n\t\t\t\t\theight: 18.000000294646924,\n\t\t\t\t\tx: 0.5,\n\t\t\t\t\ty: 0.5,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 216,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7479166666666669,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 19,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"WZUZXGejw\",\n\toriginalid: null,\n\tname: \"Logos\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"20px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 40,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.7050997782705102,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 53,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"C5I7YkNuC\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"AJC5kOHh8\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"B4ILTU7MI\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"AJC5kOHh8\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Bird\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 22.541000000000004,\n\t\t\t\t\theight: 19.721,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 84,\n\t\t\t\t\ty: 45,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"aJJPMFNEN\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"VU3B_RwIt\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"aJJPMFNEN\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Dribbble\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 3.590909090909091,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 74.45454660584772,\n\t\t\t\t\theight: 21,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 102.08077239990234,\n\t\t\t\t\ty: 45.58780288696289,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 3,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"bkz8U8nti\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"ABl5q2qiH\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"bkz8U8nti\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Miro\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 27.483198042831248,\n\t\t\t\t\theight: 27.5,\n\t\t\t\t\tx: 187.2706556414396,\n\t\t\t\t\ty: 41.00855886936185,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 3,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"AiNzgkRab\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"HICulCh5Q\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"AiNzgkRab\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: \"Whereby\",\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 82.71015747167193,\n\t\t\t\t\theight: 20.904843696594234,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 19,\n\t\t\t\t\ty: 5,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"#3af\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: true,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: -1,\n\t\t\tcenterAnchorX: 0.5250000000000002,\n\t\t\tcenterAnchorY: 0.6764705882352944,\n\t\t\twidthType: 2,\n\t\t\theightType: 0,\n\t\t\twidth: 124,\n\t\t\theight: 30,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"bka_ZTDml\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"jkOPttawX\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"bka_ZTDml\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 3,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#666666\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 0.67,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 26.77510022929286,\n\t\t\t\t\theight: 26.775099059869053,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5750000000000002,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 530.5,\n\t\t\theight: 27,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"suoTnwttU\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"US4yXXBwd\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"suoTnwttU\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 33.468866794828614,\n\t\t\t\t\theight: 33.4688667917834,\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 340,\n\t\t\ttop: 0,\n\t\t\tbottom: -0.5,\n\t\t\tcenterAnchorX: 0.6281250000000003,\n\t\t\tcenterAnchorY: 0.5074626865671644,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 34,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"OWGzH17rf\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"linwV4NWh\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"X5Tb6HENH\",\n\t\t\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"linwV4NWh\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\t\t\tstrokeWidth: 0.59,\n\t\t\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\t\t\twidth: 9.371283593687634,\n\t\t\t\t\t\t\theight: 14.056924015798756,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tx: 23.533352494239807,\n\t\t\t\t\t\t\ty: 3.070726603269577,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"QJe5oJ7Dh\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"linwV4NWh\",\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: \"Layer Title\",\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 15,\n\t\t\t\t\t\t\theight: 9,\n\t\t\t\t\t\t\thtml: '<p style=\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 32, &quot;wght&quot; 760; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlETXlMQ0FpZDJkb2RDSWdOell3; --framer-text-color: rgb(102, 102, 102); --framer-font-size: 8px; --framer-letter-spacing: 0px; --framer-line-height: 0.8em; --framer-text-alignment: left;\">CCPA</p>',\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\tstylePresetHeading1: \"YAP816Y5n\",\n\t\t\t\t\t\t\tstylePresetHeading2: \"fVxnimdqP\",\n\t\t\t\t\t\t\tstylePresetHeading3: \"YckFIlg3V\",\n\t\t\t\t\t\t\tstylePresetParagraph: \"XHuCPIQKc\",\n\t\t\t\t\t\t\tstylePresetLink: \"ro7OPezbn\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"OWGzH17rf\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255, 255, 255, 0.1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"4.4px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 2.67,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.4800000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 21.5,\n\t\t\t\t\theight: 25,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradius: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.6770833333333336,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 25,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"PwNXj4TG4\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"i_AC1qqT_\",\n\t\t\t\t\t__class: \"BooleanShapeNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"PwNXj4TG4\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tpathBoolean: 4,\n\t\t\t\t\tfillEnabled: true,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgb(102, 102, 102)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: false,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1.4,\n\t\t\t\t\tstrokeColor: \"rgba(0,0,0,1)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 10,\n\t\t\t\t\tstrokeDashArray: \"\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 26.929189899435812,\n\t\t\t\t\theight: 15.361356506691777,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 252,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7229166666666669,\n\t\t\tcenterAnchorY: 0.5074626865671644,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 16,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"EeY18lBk7\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"bSXgbYVRv\",\n\t\t\t\t\t__class: \"ShapeGroupNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"EeY18lBk7\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\twidth: 50.99999730994341,\n\t\t\t\t\theight: 18.000000294646924,\n\t\t\t\t\tx: 0.5,\n\t\t\t\t\ty: 0.5,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"C5I7YkNuC\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: 216,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7479166666666669,\n\t\t\tcenterAnchorY: 0.4776119402985077,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 19,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"WZUZXGejw\",\n\toriginalid: null,\n\tname: \"Logos\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"grid\",\n\tgap: \"20px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tgridColumnCount: 3,\n\tgridRowCount: 3,\n\tgridAlignment: \"center\",\n\tgridColumnWidthType: \"minmax\",\n\tgridColumnWidth: 200,\n\tgridColumnMinWidth: 50,\n\tgridRowHeightType: \"auto\",\n\tgridRowHeight: 200,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 40,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.7050997782705102,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 300,\n\theight: 53,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"aTvxkkXRO\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"m_VV5hFP2\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 1\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,rzuzdl6mLdEFGfQt1oTOemq2B6s.png?originalFilename=Petal_1423_0000.png&width=5120&height=2880\",\n\t\t\tfillImageOriginalName: \"Petal_1423_0000.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.147058823529412,\n\t\t\twidthType: 3,\n\t\t\theightType: 3,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tgridItemColumnSpan: 1,\n\t\t\tgridItemRowSpan: 1,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"hyQafgEx3\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"teXIBgiDh\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: 102.5,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.6275000000000002,\n\t\t\tcenterAnchorY: 0.1132897603485841,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"g4mV751CJ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.8529411764705884,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"LA99BoBZi\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: -0.5,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.8850000000000002,\n\t\t\tcenterAnchorY: 0.1132897603485841,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Banner\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizations: [\n\t\t{\n\t\t\ttype: \"content\",\n\t\t\tproperty: \"textContent\",\n\t\t\tfieldType: \"text\",\n\t\t\tfieldPath: \"Banner\",\n\t\t},\n\t],\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The section features images with slightly rounded corners.\\n**Layout**\\n- The section displays three image components in a horizontal row. - The images are evenly spaced with a small gap between them.\\n**Placement**\\n- This section can be placed within any content area where a visual grid is desired.\\n**Usage**\\n- This section is ideal for showcasing multiple images or a gallery of related visuals.\\n**Text Length**\\n- No text is present in this section.\",\n\tcustomizationsCategory: \"Visual\",\n\tkitSectionHash: 4327225444,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"grid\",\n\tgap: \"5px 5px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tgridColumnCount: 4,\n\tgridRowCount: 2,\n\tgridAlignment: \"center\",\n\tgridColumnWidthType: \"minmax\",\n\tgridColumnWidth: 200,\n\tgridColumnMinWidth: 50,\n\tgridRowHeightType: \"auto\",\n\tgridRowHeight: 200,\n\tmoduleSourceRevision: 791400573,\n\tmoduleSourceRevisionHint: 186,\n\tmoduleSourceRevisionCommittedHint: 186,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7138,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.5881383855024714,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 230,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"aTvxkkXRO\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"m_VV5hFP2\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 1\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,rzuzdl6mLdEFGfQt1oTOemq2B6s.png?originalFilename=Petal_1423_0000.png&width=5120&height=2880\",\n\t\t\tfillImageOriginalName: \"Petal_1423_0000.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.147058823529412,\n\t\t\twidthType: 3,\n\t\t\theightType: 3,\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tgridItemColumnSpan: 2,\n\t\t\tgridItemRowSpan: 2,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"hyQafgEx3\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"teXIBgiDh\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: 102.5,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.6275000000000002,\n\t\t\tcenterAnchorY: 0.1132897603485841,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"g4mV751CJ\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.8529411764705884,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"LA99BoBZi\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"aTvxkkXRO\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: -0.5,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.8850000000000002,\n\t\t\tcenterAnchorY: 0.1132897603485841,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Banner\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizations: [\n\t\t{\n\t\t\ttype: \"content\",\n\t\t\tproperty: \"textContent\",\n\t\t\tfieldType: \"text\",\n\t\t\tfieldPath: \"Banner\",\n\t\t},\n\t],\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The section features images with slightly rounded corners.\\n**Layout**\\n- The section displays three image components in a horizontal row. - The images are evenly spaced with a small gap between them.\\n**Placement**\\n- This section can be placed within any content area where a visual grid is desired.\\n**Usage**\\n- This section is ideal for showcasing multiple images or a gallery of related visuals.\\n**Text Length**\\n- No text is present in this section.\",\n\tcustomizationsCategory: \"Visual\",\n\tkitSectionHash: 4327225444,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"grid\",\n\tgap: \"5px 5px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tgridColumnCount: 4,\n\tgridRowCount: 2,\n\tgridAlignment: \"center\",\n\tgridColumnWidthType: \"minmax\",\n\tgridColumnWidth: 200,\n\tgridColumnMinWidth: 50,\n\tgridRowHeightType: \"auto\",\n\tgridRowHeight: 200,\n\tmoduleSourceRevision: 791400573,\n\tmoduleSourceRevisionHint: 186,\n\tmoduleSourceRevisionCommittedHint: 186,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7138,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.5881383855024714,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 230,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"UbQBb6aHu\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"iNth2fBii\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"QLF8QkFxh\", \"KoguiuFfz\", \"Z4Julf3fe\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 42,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"M4bviiwpE\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\", \"ysK77n23N\", \"QSM9HhG80\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 42,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"VmWeyP0kF\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kd_ZVoq7n\",\n\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"VmWeyP0kF\",\n\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\", \"TxEJgYVa9\", \"F_iUR8zUK\", \"xugTvF3Bj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\", \"ds4ZzM3Fq\", \"yRTJZ1Vko\", \"nbBxohFnV\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"id0bS0Jsg\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\", \"MSVHqAvSr\", \"LnSklArGg\", \"z7dwT9brf\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 42,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"gznTFn0cs\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\", \"rHTeE1IDk\", \"vW3d6m7LD\", \"rIBHn0769\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 42,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t],\n\tparentid: \"Beh3L_FOs\",\n\tduplicatedFrom: [\"eAjFKmWd8\", \"kLrMLQamK\", \"OnbW7cmCl\", \"hcg0KkN8T\"],\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"15px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.7385416666666669,\n\tcenterAnchorY: 0.5000000000000002,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 22,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"UbQBb6aHu\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"iNth2fBii\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"QLF8QkFxh\", \"KoguiuFfz\", \"Z4Julf3fe\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"M4bviiwpE\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\", \"ysK77n23N\", \"QSM9HhG80\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-alignment: center; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"VmWeyP0kF\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kd_ZVoq7n\",\n\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"VmWeyP0kF\",\n\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\", \"TxEJgYVa9\", \"F_iUR8zUK\", \"xugTvF3Bj\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\", \"ds4ZzM3Fq\", \"yRTJZ1Vko\", \"nbBxohFnV\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"id0bS0Jsg\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\", \"MSVHqAvSr\", \"LnSklArGg\", \"z7dwT9brf\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-alignment: center; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t\t{\n\t\t\tid: \"gznTFn0cs\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"UbQBb6aHu\",\n\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\", \"rHTeE1IDk\", \"vW3d6m7LD\", \"rIBHn0769\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 0.5,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 21,\n\t\t\tpointerEvents: \"none\",\n\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-alignment: center; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tzIndex: 1,\n\t\t},\n\t],\n\tparentid: \"Beh3L_FOs\",\n\tduplicatedFrom: [\"eAjFKmWd8\", \"kLrMLQamK\", \"OnbW7cmCl\", \"hcg0KkN8T\"],\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"15px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.7385416666666669,\n\tcenterAnchorY: 0.5000000000000002,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 22,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\trotation: 0,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import type { AnyComponentLoader, ReactComponentDefinition } from \"@framerjs/framer-runtime\"\nimport type { GlobalModuleId, ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { WebPageNode } from \"document/models/CanvasTree/index.ts\"\nimport { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\nimport type { Loaded } from \"document/models/CanvasTree/traits/WithScopeLoader.ts\"\nimport { prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { TreeResolver } from \"../../TreeResolver.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { Collections } from \"../../context/collections.ts\"\nimport { Components } from \"../../context/components.ts\"\nimport { DeferredOps } from \"../../context/deferred.ts\"\nimport { DynamicValues } from \"../../context/dynamicValues.ts\"\nimport { VirtualText } from \"../../context/richtext/virtualText.ts\"\nimport { type VectorSetDefinition, VectorSets } from \"../../context/vectors.ts\"\nimport { createMockTreeStore } from \"../../traits/types.ts\"\n\nconst meteorModuleId = \"meteor-icons\" as GlobalModuleId\nconst identifier = \"local-module:canvasComponent/Xx_2f0XsX:default\"\n\nconst source = {\n\tid: \"WQLkyLRf1\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: \"augiA20Il\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: \"Desktop\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1200,\n\theight: 1000,\n\tpreviewSettings: {\n\t\t__class: \"PreviewSettings\",\n\t\tresponsive: true,\n\t\ttouch: false,\n\t},\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: true,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\tisVariant: true,\n\tisBreakpoint: true,\n\tvariantTransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 500,\n\t\tdamping: 60,\n\t\tmass: 1,\n\t},\n\tviewportHeight: 800,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst target = {\n\tid: \"WQLkyLRf1\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"N6LAMmsxZ\",\n\t\t\t__class: \"CodeComponentNode\",\n\t\t\tchildren: [],\n\t\t\t$control__n_nWXmRNl: {\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: \"Download\",\n\t\t\t},\n\t\t\t$control__DPfFuVWIJ: {\n\t\t\t\ttype: \"vectorsetitem\",\n\t\t\t\tvalue: \"module:oFfLU540gbIVzBnmW0sf/8UMtH3ooLYgJkylt0fsx/dVDRVB9mh.js:default\",\n\t\t\t},\n\t\t\tparentid: \"WQLkyLRf1\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeComponentIdentifier: \"local-module:canvasComponent/Xx_2f0XsX:default\",\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 627,\n\t\t\tright: null,\n\t\t\ttop: 478,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 131,\n\t\t\theight: 44,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\texportOptions: [],\n\t\t\tcodeComponentPackageVersion: null,\n\t\t\tslotsAreChildNodes: false,\n\t\t},\n\t],\n\tparentid: \"augiA20Il\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: \"Desktop\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"white\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 1200,\n\theight: 1000,\n\tpreviewSettings: {\n\t\t__class: \"PreviewSettings\",\n\t\tresponsive: true,\n\t\ttouch: false,\n\t},\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: true,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\tisVariant: true,\n\tisBreakpoint: true,\n\tvariantTransition: {\n\t\ttype: \"spring\",\n\t\tease: [0.44, 0, 0.56, 1],\n\t\tduration: 0.3,\n\t\tdelay: 0,\n\t\tstiffness: 500,\n\t\tdamping: 60,\n\t\tmass: 1,\n\t},\n\tviewportHeight: 800,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst definitions: Record<ModuleExportIdentifierString, Pick<ReactComponentDefinition, \"name\" | \"properties\">> = {\n\t[identifier]: {\n\t\tname: \"Button\",\n\t\tproperties: {\n\t\t\tn_nWXmRNl: {\n\t\t\t\ttype: ControlType.String,\n\t\t\t\ttitle: \"Title\",\n\t\t\t},\n\t\t\tDPfFuVWIJ: {\n\t\t\t\ttype: ControlType.VectorSetItem,\n\t\t\t\ttitle: \"Icon\",\n\t\t\t\tsetModuleId: meteorModuleId,\n\t\t\t\tdefaultValue: {\n\t\t\t\t\tidentifier: \"local-module:vector/xKp2R4mT1:default\",\n\t\t\t\t\tmoduleId: meteorModuleId,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n}\n\nconst loader = {\n\treactComponentForIdentifier: (id: ModuleExportIdentifierString) => {\n\t\treturn definitions?.[id]\n\t},\n\tcomponentForIdentifier: (id: ModuleExportIdentifierString) => {\n\t\treturn definitions?.[id]\n\t},\n} as AnyComponentLoader\n\nconst namesByModuleId = new Map<GlobalModuleId, string>([[meteorModuleId, \"Meteor\"]])\n\nconst vectorsByIdentifier = new Map<ModuleExportIdentifierString, { name: string; setName: string }>([\n\t[\n\t\t\"local-module:vector/xKp2R4mT1:default\",\n\t\t{\n\t\t\tname: \"Globe\",\n\t\t\tsetName: \"Meteor\",\n\t\t},\n\t],\n\t[\n\t\t\"local-module:vector/dVDRVB9mh:default\",\n\t\t{\n\t\t\tname: \"Download\",\n\t\t\tsetName: \"Meteor\",\n\t\t},\n\t],\n\t[\n\t\t// This is the published module identifier that maps to the local \"Download\" icon\n\t\t\"module:oFfLU540gbIVzBnmW0sf/8UMtH3ooLYgJkylt0fsx/dVDRVB9mh.js:default\",\n\t\t{\n\t\t\tname: \"Download\",\n\t\t\tsetName: \"Meteor\",\n\t\t},\n\t],\n])\n\nconst ctx = async () => {\n\tconst meteorDefinition: VectorSetDefinition = {\n\t\tcontrolPropKeysByControlName: new Map(),\n\t\tcontrolPropNamesByKeys: new Map(),\n\t\tcontrols: {\n\t\t\t[prefixControlPropKey(\"icon\")]: { type: \"icon\", options: [\"Globe\", \"Download\"] },\n\t\t},\n\t\ticons: new Map([\n\t\t\t[\"Globe\", \"local-module:vector/xKp2R4mT1:default\"],\n\t\t\t[\"Download\", \"local-module:vector/dVDRVB9mh:default\"],\n\t\t]),\n\t\tproperties: {},\n\t\tintrinsicSize: { width: 24, height: 24 },\n\t}\n\n\tconst vectorDefinitions = new Map([[\"Meteor\", meteorDefinition]])\n\n\tconst vectorSets = new VectorSets(vectorDefinitions, namesByModuleId, vectorsByIdentifier)\n\tconst scope = new WebPageNode() as Loaded<WebPageNode>\n\tconst treeStore = createMockTreeStore()\n\tconst collections = new Collections(treeStore, loader, new DynamicValues())\n\tconst virtualText = new VirtualText()\n\tconst components = await Components.fromIdentifiers(\n\t\tnew Set([identifier]),\n\t\tnew TreeResolver(treeStore, scope, loader, collections, virtualText),\n\t\ttreeStore,\n\t\tvectorSets,\n\t\tloader,\n\t\tnew DeferredOps(),\n\t)\n\treturn {\n\t\tvectorSets,\n\t\tcomponents,\n\t\tcomponentLoader: loader,\n\t} satisfies Partial<AgentContext>\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(source)!,\n\tto: canvasNodeFromValue(target)!,\n\tctx,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"WRcwDmcLi\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"A51CDaA9L\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 1\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,rzuzdl6mLdEFGfQt1oTOemq2B6s.png?originalFilename=Petal_1423_0000.png&width=5120&height=2880\",\n\t\t\tfillImageOriginalName: \"Petal_1423_0000.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.147058823529412,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"s3n9I3Sgu\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"jeAVHMDlS\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.8529411764705884,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 5,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Banner\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizations: [\n\t\t{\n\t\t\ttype: \"content\",\n\t\t\tproperty: \"textContent\",\n\t\t\tfieldType: \"text\",\n\t\t\tfieldPath: \"Banner\",\n\t\t},\n\t],\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The section features images with slightly rounded corners.\\n**Layout**\\n- The section displays three image components in a horizontal row. - The images are evenly spaced with a small gap between them.\\n**Placement**\\n- This section can be placed within any content area where a visual grid is desired.\\n**Usage**\\n- This section is ideal for showcasing multiple images or a gallery of related visuals.\\n**Text Length**\\n- No text is present in this section.\",\n\tcustomizationsCategory: \"Visual\",\n\tkitSectionHash: 4327225444,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"5px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tmoduleSourceRevision: 945963531,\n\tmoduleSourceRevisionHint: 139,\n\tmoduleSourceRevisionCommittedHint: 139,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 3000,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.5881383855024714,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 73,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"WRcwDmcLi\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"A51CDaA9L\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 1\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,rzuzdl6mLdEFGfQt1oTOemq2B6s.png?originalFilename=Petal_1423_0000.png&width=5120&height=2880\",\n\t\t\tfillImageOriginalName: \"Petal_1423_0000.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.147058823529412,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 10,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"s3n9I3Sgu\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 2\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,dZJrqYeeXvHHeI6SwBOa1TLMA.png?originalFilename=P36.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P36.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 10,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"jeAVHMDlS\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"WRcwDmcLi\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tcustomizations: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"content\",\n\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\tfieldPath: \"Image 3\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tdraggable: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"#4cf\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,F6r0R7hjDbkeN9dcMAHkbJyUg9s.png?originalFilename=P17.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"P17.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.8529411764705884,\n\t\t\twidthType: 3,\n\t\t\theightType: 5,\n\t\t\twidth: 1,\n\t\t\theight: 120,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 10,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\tuserSelect: \"none\",\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\toriginalid: null,\n\tname: \"Banner\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tcustomizations: [\n\t\t{\n\t\t\ttype: \"content\",\n\t\t\tproperty: \"textContent\",\n\t\t\tfieldType: \"text\",\n\t\t\tfieldPath: \"Banner\",\n\t\t},\n\t],\n\tcustomizationsDescription:\n\t\t\"**Design**\\n- The section features images with slightly rounded corners.\\n**Layout**\\n- The section displays three image components in a horizontal row. - The images are evenly spaced with a small gap between them.\\n**Placement**\\n- This section can be placed within any content area where a visual grid is desired.\\n**Usage**\\n- This section is ideal for showcasing multiple images or a gallery of related visuals.\\n**Text Length**\\n- No text is present in this section.\",\n\tcustomizationsCategory: \"Visual\",\n\tkitSectionHash: 4327225444,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"grid\",\n\tgap: \"10px 10px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\tgridColumnCount: 2,\n\tgridRowCount: 2,\n\tgridAlignment: \"center\",\n\tgridColumnWidthType: \"minmax\",\n\tgridColumnWidth: 200,\n\tgridColumnMinWidth: 50,\n\tgridRowHeightType: \"auto\",\n\tgridRowHeight: 200,\n\tmoduleSourceRevision: 945963531,\n\tmoduleSourceRevisionHint: 139,\n\tmoduleSourceRevisionCommittedHint: 139,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 3000,\n\tright: null,\n\ttop: 0,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.5881383855024714,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 400,\n\theight: 73,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"wRth9YEGr\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"ds4ZzM3Fq\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"TxEJgYVa9\",\n\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"ds4ZzM3Fq\",\n\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"kLrMLQamK\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"QLF8QkFxh\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"UKgM27RI6\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"MSVHqAvSr\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"rHTeE1IDk\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"start\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 100,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"40\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"space-between\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7838,\n\tright: null,\n\ttop: 1300,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 64,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\n// Left Aligned Vertical Layout\nconst b = {\n\tid: \"wRth9YEGr\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"ds4ZzM3Fq\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"TxEJgYVa9\",\n\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"ds4ZzM3Fq\",\n\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"hidden\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"kLrMLQamK\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"QLF8QkFxh\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"UKgM27RI6\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"MSVHqAvSr\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"rHTeE1IDk\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"5px\",\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"vertical\",\n\t\t\tstackDistribution: \"start\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 100,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"20px\",\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7838,\n\tright: null,\n\ttop: 1300,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 2,\n\twidth: 960,\n\theight: 64,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst c = {\n\tid: \"wRth9YEGr\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"kLrMLQamK\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"QLF8QkFxh\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"UKgM27RI6\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ds4ZzM3Fq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"TxEJgYVa9\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"ds4ZzM3Fq\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 40,\n\t\t\t\t\t\t\theight: 40,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: -0.08196721311475387,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"MSVHqAvSr\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"rHTeE1IDk\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"start\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 100,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"40\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7838,\n\tright: null,\n\ttop: 1300,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 64,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\n// Spread out b to be space-between\nconst d = {\n\tid: \"wRth9YEGr\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"kLrMLQamK\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"QLF8QkFxh\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.04183266932270938,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Prompt</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"UKgM27RI6\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Design</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"ds4ZzM3Fq\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"TxEJgYVa9\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"ds4ZzM3Fq\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"cZ46d1E0k\", \"Fkstb4su7\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"module:8tZWMMXkR1Z9T9ch0kOb/EKEFfRkrxG16QZJtks8g/rU5t_xA0X.js:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: 40,\n\t\t\t\t\t\t\tintrinsicHeight: 40,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 40,\n\t\t\t\t\t\t\theight: 40,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"sZF2NgvIr\", \"lM76IgFSF\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: -0.08196721311475387,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 0,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 40,\n\t\t\t\t\theight: 40,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"MSVHqAvSr\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"UKgM27RI6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Write</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"rHTeE1IDk\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kLrMLQamK\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: var(--token-553feb38-2637-4ec9-835b-4a57fbd49b50, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Measure</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"wRth9YEGr\",\n\t\t\tduplicatedFrom: [\"eAjFKmWd8\"],\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\trotation: 0,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"HpRj2nl3J\",\n\tduplicatedFrom: [\"wFH8tPpEn\", \"OWYhvLxM_\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"40\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 7838,\n\tright: null,\n\ttop: 1300,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 64,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n\tc: canvasNodeFromValue(c)!,\n\td: canvasNodeFromValue(d)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst buttonId = \"yl6L_LGRF\"\nexport const overlayId = \"DfghyUQhH\"\n\nconst a = {\n\tid: buttonId,\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Z_1gISHPp\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: buttonId,\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 86,\n\t\t\tright: null,\n\t\t\ttop: 35,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\thtml: '<p dir=\"auto\" style=\"--framer-text-color: rgb(255, 255, 255);\">Open</p>',\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\texportOptions: [],\n\t\t},\n\t],\n\tparentid: \"WQLkyLRf1\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 20,\n\tpaddingPerSide: true,\n\tpaddingTop: 10,\n\tpaddingRight: 20,\n\tpaddingBottom: 10,\n\tpaddingLeft: 20,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: 106,\n\tbottom: null,\n\tcenterAnchorX: 0.4850000000000002,\n\tcenterAnchorY: 0.14800000000000021,\n\twidthType: 2,\n\theightType: 2,\n\twidth: 200,\n\theight: 85,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradius: 20,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: buttonId,\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Z_1gISHPp\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: buttonId,\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 86,\n\t\t\tright: null,\n\t\t\ttop: 35,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\thtml: '<p dir=\"auto\" style=\"--framer-text-color: rgb(255, 255, 255);\">Open</p>',\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: overlayId,\n\t\t\t__class: \"OverlayNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: buttonId,\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\tbackdropFill: \"rgba(0, 0, 0, 0.8)\",\n\t\t\tbackdropDismissible: true,\n\t\t\tbackdropFillEnabled: true,\n\t\t\tbackdropEnterTransition: {\n\t\t\t\ttype: \"tween\",\n\t\t\t\tease: [0.5, 0, 0.88, 0.77],\n\t\t\t\tduration: 0,\n\t\t\t\tdelay: 0,\n\t\t\t\tstiffness: 400,\n\t\t\t\tdamping: 30,\n\t\t\t\tmass: 1,\n\t\t\t\tdurationBasedSpring: true,\n\t\t\t\tbounce: 0.2,\n\t\t\t},\n\t\t\tbackdropExitTransition: {\n\t\t\t\ttype: \"tween\",\n\t\t\t\tease: [0.12, 0.23, 0.5, 1],\n\t\t\t\tduration: 0,\n\t\t\t\tdelay: 0,\n\t\t\t\tstiffness: 400,\n\t\t\t\tdamping: 30,\n\t\t\t\tmass: 1,\n\t\t\t\tdurationBasedSpring: true,\n\t\t\t\tbounce: 0.2,\n\t\t\t},\n\t\t\tbackdropTransitionLocked: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t},\n\t],\n\tparentid: \"WQLkyLRf1\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tonTap: [\n\t\t{\n\t\t\tidentifier: \"af188384-a2b4-412f-abe9-e102cd020011\",\n\t\t\tactionIdentifier: \"framer/useShowOverlay\",\n\t\t\tcontrols: {\n\t\t\t\toverlay: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: overlayId,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t],\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 20,\n\tpaddingPerSide: true,\n\tpaddingTop: 10,\n\tpaddingRight: 20,\n\tpaddingBottom: 10,\n\tpaddingLeft: 20,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: 106,\n\tbottom: null,\n\tcenterAnchorX: 0.4850000000000002,\n\tcenterAnchorY: 0.14800000000000021,\n\twidthType: 2,\n\theightType: 2,\n\twidth: 200,\n\theight: 85,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradius: 20,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst c = {\n\tid: \"yl6L_LGRF\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"Z_1gISHPp\",\n\t\t\t__class: \"RichTextNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"yl6L_LGRF\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tgridItemFillCellWidth: true,\n\t\t\tgridItemFillCellHeight: true,\n\t\t\tlinkTextColor: \"#09F\",\n\t\t\tlinkTextDecoration: \"underline\",\n\t\t\topacity: 1,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 86,\n\t\t\tright: null,\n\t\t\ttop: 35,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 2,\n\t\t\theightType: 2,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\thtml: '<p dir=\"auto\" class=\"framer-styles-preset-1bcdf5s\" data-styles-preset=\"NZsT2_0lR\">Open</p>',\n\t\t\tstylePresetParagraph: \"NZsT2_0lR\",\n\t\t\tisTarget: false,\n\t\t\ttextVerticalAlignment: \"top\",\n\t\t\texportOptions: [],\n\t\t},\n\t\t{\n\t\t\tid: \"F5C4uM4r2\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"yl6L_LGRF\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tboxShadows: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"box\",\n\t\t\t\t\tcolor: \"rgba(0,0,0,0.05)\",\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 10,\n\t\t\t\t\tinset: false,\n\t\t\t\t\tblur: 20,\n\t\t\t\t\tspread: 0,\n\t\t\t\t\tdiffusion: 0.5,\n\t\t\t\t\tfocus: 0.5,\n\t\t\t\t\tid: \"d5c46kBQB\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfloatingPositionEnabled: true,\n\t\t\tfloatingPlacement: \"bottom\",\n\t\t\tfloatingAlignment: \"center\",\n\t\t\tfloatingOffsetX: 0,\n\t\t\tfloatingOffsetY: 10,\n\t\t\tfloatingCollisionDetection: true,\n\t\t\tfloatingCollisionPadding: 20,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0,\n\t\t\tcenterAnchorY: 0,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 200,\n\t\t\theight: 150,\n\t\t\tposition: \"absolute\",\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 10,\n\t\t\tradiusIsRelative: false,\n\t\t\tstyleAppearEffectEnabled: true,\n\t\t\tstyleAppearEffectLocked: true,\n\t\t\tstyleAppearEffectTrigger: \"onMount\",\n\t\t\tenterEffectEnabled: true,\n\t\t\tenterEffectOpacity: 0,\n\t\t\tenterEffectX: 0,\n\t\t\tenterEffectY: 0,\n\t\t\tenterEffectScale: 1,\n\t\t\tenterEffectTransition: {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tease: [0.44, 0, 0.56, 1],\n\t\t\t\tduration: 0.4,\n\t\t\t\tdelay: 0,\n\t\t\t\tstiffness: 400,\n\t\t\t\tdamping: 30,\n\t\t\t\tmass: 1,\n\t\t\t\tdurationBasedSpring: true,\n\t\t\t\tbounce: 0.2,\n\t\t\t\tstagger: 0,\n\t\t\t},\n\t\t\tenterEffectRotate3d: false,\n\t\t\tenterEffectRotate: 0,\n\t\t\tenterEffectRotateX: 0,\n\t\t\tenterEffectRotateY: 0,\n\t\t\tenterEffectSkewX: 0,\n\t\t\tenterEffectSkewY: 0,\n\t\t\texitEffectEnabled: true,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t\tzIndex: 11,\n\t\t},\n\t],\n\tparentid: \"WQLkyLRf1\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tonTap: [],\n\tonMouseEnter: [\n\t\t{\n\t\t\tidentifier: \"67c1e0f1-e176-4be0-bda9-76ca0ebfc8a0\",\n\t\t\tactionIdentifier: \"framer/useShowRelativeOverlay\",\n\t\t\tcontrols: {\n\t\t\t\toverlay: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"F5C4uM4r2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t],\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(0, 0, 0)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"clip\",\n\tpadding: 20,\n\tpaddingPerSide: true,\n\tpaddingTop: 10,\n\tpaddingRight: 20,\n\tpaddingBottom: 10,\n\tpaddingLeft: 20,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: 106,\n\tbottom: null,\n\tcenterAnchorX: 0.4850000000000002,\n\tcenterAnchorY: 0.14800000000000021,\n\twidthType: 2,\n\theightType: 2,\n\twidth: 200,\n\theight: 85,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradius: 20,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\twithFixedOverlay: canvasNodeFromValue(b)!,\n\twithRelativeOverlay: canvasNodeFromValue(c)!,\n}\n", "import type { AnyComponentLoader, ReactComponentDefinition } from \"@framerjs/framer-runtime\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { WebPageNode } from \"document/models/CanvasTree/index.ts\"\nimport { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\nimport type { Loaded } from \"document/models/CanvasTree/traits/WithScopeLoader.ts\"\nimport { prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { TreeResolver } from \"../../TreeResolver.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { Collections } from \"../../context/collections.ts\"\nimport { Components } from \"../../context/components.ts\"\nimport { DeferredOps } from \"../../context/deferred.ts\"\nimport { DynamicValues } from \"../../context/dynamicValues.ts\"\nimport { VirtualText } from \"../../context/richtext/virtualText.ts\"\nimport { type VectorSetDefinition, VectorSets } from \"../../context/vectors.ts\"\nimport { createMockTreeStore } from \"../../traits/types.ts\"\n\nconst a = {\n\tid: \"OWYhvLxM_\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"z3WMwbYcx\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"YwrjhuAtn\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: 60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"U4lI8OD4z\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: [\"XPhvf1E2D\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: -60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"zFp2eONDW\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 16,\n\t\t\t\t\ty: 16,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 8,\n\t\t\t\t\theight: 8,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"OWYhvLxM_\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Logo\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9791666666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"eAjFKmWd8\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"YiXvu39Zm\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"mVuB_Yu54\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t$control__n2nHSaXfp: {\n\t\t\t\t\t\t\t\ttype: \"color\",\n\t\t\t\t\t\t\t\tvalue: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparentid: \"YiXvu39Zm\",\n\t\t\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"local-module:vector/tMBpPBLJ8:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: -1.5,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.10256410256410278,\n\t\t\t\t\t\t\tcenterAnchorY: 0.33333333333333354,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t\tslotsAreChildNodes: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"AJWSq37t6\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"YiXvu39Zm\",\n\t\t\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 51,\n\t\t\t\t\t\t\theight: 21,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Gallery</p>\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"10px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.7706521739130437,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 100,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"jdTNgUKN1\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.831521739130435,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 31.5,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Blog</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Pr41ZOzh8\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Updates</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"R0p0ayBQq\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.9581673306772911,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 42,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Pricing</p>\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"OWYhvLxM_\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"end\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"Exr6EnK2l\",\n\tduplicatedFrom: [\"wFH8tPpEn\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"space-between\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 32,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"OWYhvLxM_\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"z3WMwbYcx\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"YwrjhuAtn\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: 60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"U4lI8OD4z\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: [\"XPhvf1E2D\"],\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 11,\n\t\t\t\t\ty: 2,\n\t\t\t\t\trotation: -60,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 18,\n\t\t\t\t\theight: 36,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"zFp2eONDW\",\n\t\t\t\t\t__class: \"OvalShapeNode\",\n\t\t\t\t\tparentid: \"z3WMwbYcx\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tx: 16,\n\t\t\t\t\ty: 16,\n\t\t\t\t\trotation: 0,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"#CCC\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tstrokeEnabled: true,\n\t\t\t\t\tstrokeAlignment: \"center\",\n\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\tstrokeColor: \"rgb(255, 255, 255)\",\n\t\t\t\t\tlineJoin: \"miter\",\n\t\t\t\t\tlineCap: \"butt\",\n\t\t\t\t\tstrokeMiterLimit: 4,\n\t\t\t\t\tstrokeDashArray: \"0\",\n\t\t\t\t\tstrokeDashOffset: 0,\n\t\t\t\t\twidth: 8,\n\t\t\t\t\theight: 8,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"OWYhvLxM_\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: \"Logo\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.9791666666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 0,\n\t\t\theightType: 0,\n\t\t\twidth: 40,\n\t\t\theight: 40,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"eAjFKmWd8\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"YiXvu39Zm\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"mVuB_Yu54\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t$control__n2nHSaXfp: {\n\t\t\t\t\t\t\t\ttype: \"color\",\n\t\t\t\t\t\t\t\tvalue: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparentid: \"YiXvu39Zm\",\n\t\t\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"local-module:vector/z1fS8xIq9:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: -1.5,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.10256410256410278,\n\t\t\t\t\t\t\tcenterAnchorY: 0.33333333333333354,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t\tslotsAreChildNodes: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"AJWSq37t6\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"YiXvu39Zm\",\n\t\t\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 51,\n\t\t\t\t\t\t\theight: 21,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Gallery</p>\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"10px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackWrapEnabled: false,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.7706521739130437,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 100,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"LR6qrmbKC\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"fRQWQVsfx\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t$control__n2nHSaXfp: {\n\t\t\t\t\t\t\t\ttype: \"color\",\n\t\t\t\t\t\t\t\tvalue: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparentid: \"LR6qrmbKC\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"mVuB_Yu54\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"local-module:vector/z1fS8xIq9:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 1.1562500000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t\tslotsAreChildNodes: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"jdTNgUKN1\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"LR6qrmbKC\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 31.5,\n\t\t\t\t\t\t\theight: 21,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Blog</p>\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"10px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.831521739130435,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 32,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"LavXhaJ90\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"IEQ48MU_m\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t$control__n2nHSaXfp: {\n\t\t\t\t\t\t\t\ttype: \"color\",\n\t\t\t\t\t\t\t\tvalue: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparentid: \"LavXhaJ90\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"mVuB_Yu54\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"local-module:vector/YoCOOiZdy:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 1.0833333333333335,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t\tslotsAreChildNodes: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"Pr41ZOzh8\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"LavXhaJ90\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 60,\n\t\t\t\t\t\t\theight: 21,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Updates</p>\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"10px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.897826086956522,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 60,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"mYOaQUeNw\",\n\t\t\t\t\t__class: \"FrameNode\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"lcq2jOOTf\",\n\t\t\t\t\t\t\t__class: \"CodeComponentNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t$control__n2nHSaXfp: {\n\t\t\t\t\t\t\t\ttype: \"color\",\n\t\t\t\t\t\t\t\tvalue: \"rgb(153, 153, 153)\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparentid: \"mYOaQUeNw\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"mVuB_Yu54\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\t\t\tcodeComponentIdentifier: \"local-module:vector/VkLDSS0k0:default\",\n\t\t\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\t\t\tfillImage: null,\n\t\t\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 1.1020408163265307,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 0,\n\t\t\t\t\t\t\theightType: 0,\n\t\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tcodeComponentPackageVersion: null,\n\t\t\t\t\t\t\tslotsAreChildNodes: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"R0p0ayBQq\",\n\t\t\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\tparentid: \"mYOaQUeNw\",\n\t\t\t\t\t\t\tduplicatedFrom: [\"AJWSq37t6\", \"jdTNgUKN1\", \"Pr41ZOzh8\"],\n\t\t\t\t\t\t\toriginalid: null,\n\t\t\t\t\t\t\tname: null,\n\t\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\t\taspectRatio: null,\n\t\t\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\t\t\tgridItemFillCellWidth: true,\n\t\t\t\t\t\t\tgridItemFillCellHeight: true,\n\t\t\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\t\t\tleft: null,\n\t\t\t\t\t\t\tright: null,\n\t\t\t\t\t\t\ttop: null,\n\t\t\t\t\t\t\tbottom: null,\n\t\t\t\t\t\t\tcenterAnchorX: 0.48979591836734715,\n\t\t\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\t\t\twidthType: 2,\n\t\t\t\t\t\t\theightType: 2,\n\t\t\t\t\t\t\twidth: 49,\n\t\t\t\t\t\t\theight: 21,\n\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\thtml: \"<p style=\\\"--framer-font-weight: 500; --font-selector: SW50ZXItTWVkaXVt; --framer-text-color: rgb(153, 153, 153); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv05' on, 'cv11' on; --framer-line-height: 1.4em; --framer-text-alignment: center;\\\">Pricing</p>\",\n\t\t\t\t\t\t\tisTarget: false,\n\t\t\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\t\t\tuserSelect: \"none\",\n\t\t\t\t\t\t\texportOptions: [],\n\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tparentid: \"eAjFKmWd8\",\n\t\t\t\t\tduplicatedFrom: null,\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tfillEnabled: false,\n\t\t\t\t\tfillType: \"color\",\n\t\t\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\t\t\tfillImage: null,\n\t\t\t\t\tfillImageOriginalName: null,\n\t\t\t\t\tfillImageResize: \"fill\",\n\t\t\t\t\tfillImagePixelWidth: null,\n\t\t\t\t\tfillImagePixelHeight: null,\n\t\t\t\t\tguidesX: [],\n\t\t\t\t\tguidesY: [],\n\t\t\t\t\tintrinsicWidth: null,\n\t\t\t\t\tintrinsicHeight: null,\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tgap: \"10px\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\toverflow: \"clip\",\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tpaddingPerSide: false,\n\t\t\t\t\tpaddingTop: 0,\n\t\t\t\t\tpaddingRight: 0,\n\t\t\t\t\tpaddingBottom: 0,\n\t\t\t\t\tpaddingLeft: 0,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.972826086956522,\n\t\t\t\t\tcenterAnchorY: 0.4761904761904764,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 0,\n\t\t\t\t\twidth: 49,\n\t\t\t\t\theight: 21,\n\t\t\t\t\tpreviewSettings: null,\n\t\t\t\t\tradiusPerCorner: false,\n\t\t\t\t\tradiusTopLeft: 0,\n\t\t\t\t\tradiusTopRight: 0,\n\t\t\t\t\tradiusBottomRight: 0,\n\t\t\t\t\tradiusBottomLeft: 0,\n\t\t\t\t\tradiusIsRelative: false,\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\tisMaster: false,\n\t\t\t\t\tisExternalMaster: null,\n\t\t\t\t\treplicaInfo: null,\n\t\t\t\t\texportOptions: [],\n\t\t\t\t\tframePreset: null,\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"OWYhvLxM_\",\n\t\t\tduplicatedFrom: null,\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: \"15px\",\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"end\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: 0,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.7385416666666669,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 2,\n\t\t\twidth: 1,\n\t\t\theight: 22,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"Exr6EnK2l\",\n\tduplicatedFrom: [\"wFH8tPpEn\"],\n\toriginalid: null,\n\tname: \"Top\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: 10,\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"space-between\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.16000000000000023,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 960,\n\theight: 32,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\nconst definition: Pick<ReactComponentDefinition, \"name\" | \"properties\"> = {\n\tname: \"Icon\",\n\tproperties: { n2nHSaXfp: { type: ControlType.Color } },\n}\n\nconst definitions: Record<ModuleExportIdentifierString, Pick<ReactComponentDefinition, \"name\" | \"properties\">> = {\n\t\"local-module:vector/LSOzECuus:default\": definition,\n\t\"local-module:vector/tMBpPBLJ8:default\": definition,\n\t\"local-module:vector/z1fS8xIq9:default\": definition,\n\t\"local-module:vector/YoCOOiZdy:default\": definition,\n\t\"local-module:vector/VkLDSS0k0:default\": definition,\n}\n\nconst loader = {\n\treactComponentForIdentifier: (identifier: ModuleExportIdentifierString) => {\n\t\treturn definitions?.[identifier]\n\t},\n\tcomponentForIdentifier: (identifier: ModuleExportIdentifierString) => {\n\t\treturn definitions?.[identifier]\n\t},\n} as AnyComponentLoader\n\nconst meteorDefinitions: VectorSetDefinition = {\n\tcontrolPropKeysByControlName: new Map([[\"color\", \"n2nHSaXfp\"]]),\n\tcontrolPropNamesByKeys: new Map([[\"n2nHSaXfp\", \"color\"]]),\n\tcontrols: {\n\t\t[prefixControlPropKey(\"icon\")]: { type: \"icon\", options: [\"Globe\", \"Blogger\", \"Gift\", \"Circle Exclamation\"] },\n\t\t[prefixControlPropKey(\"color\")]: { type: ControlType.Color },\n\t},\n\ticons: new Map([\n\t\t[\"Globe\", \"local-module:vector/tMBpPBLJ8:default\"],\n\t\t[\"Blogger\", \"local-module:vector/z1fS8xIq9:default\"],\n\t\t[\"Circle Exclamation\", \"local-module:vector/YoCOOiZdy:default\"],\n\t\t[\"Gift\", \"local-module:vector/VkLDSS0k0:default\"],\n\t]),\n\tproperties: {},\n\tintrinsicSize: { width: 24, height: 24 },\n}\n\nconst vectorDefinitions = new Map([[\"Meteor\", meteorDefinitions]])\n\nconst namesByModuleId = new Map()\n\nconst vectorsByIdentifier = new Map<ModuleExportIdentifierString, { name: string; setName: string }>([\n\t[\"local-module:vector/tMBpPBLJ8:default\", { name: \"Globe\", setName: \"Meteor\" }],\n\t[\"local-module:vector/z1fS8xIq9:default\", { name: \"Blogger\", setName: \"Meteor\" }],\n\t[\"local-module:vector/VkLDSS0k0:default\", { name: \"Gift\", setName: \"Meteor\" }],\n\t[\"local-module:vector/YoCOOiZdy:default\", { name: \"Circle Exclamation\", setName: \"Meteor\" }],\n])\n\nconst vectorSets = new VectorSets(vectorDefinitions, namesByModuleId, vectorsByIdentifier)\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n\tctx: async () => {\n\t\tconst scope = new WebPageNode() as Loaded<WebPageNode>\n\t\tconst treeStore = createMockTreeStore()\n\t\tconst collections = new Collections(treeStore, loader, new DynamicValues())\n\t\tconst virtualText = new VirtualText()\n\t\tconst components = await Components.fromIdentifiers(\n\t\t\tnew Set(Object.keys(definitions) as ModuleExportIdentifierString[]),\n\t\t\tnew TreeResolver(treeStore, scope, loader, collections, virtualText),\n\t\t\ttreeStore,\n\t\t\tvectorSets,\n\t\t\tloader,\n\t\t\tnew DeferredOps(),\n\t\t)\n\n\t\treturn {\n\t\t\tvectorSets,\n\t\t\tcomponents,\n\t\t\tcomponentLoader: loader,\n\t\t} satisfies Partial<AgentContext>\n\t},\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"nkhDrUX0W\",\n\t__class: \"RichTextNode\",\n\tchildren: [],\n\tparentid: \"augiA20Il\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tlinkTextColor: \"#09F\",\n\tlinkTextDecoration: \"underline\",\n\topacity: 1,\n\tconstraintsLocked: false,\n\tleft: -779,\n\tright: null,\n\ttop: -97,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 2,\n\theightType: 2,\n\twidth: 0,\n\theight: 0,\n\thtml: '<p dir=\"auto\">Born on March 14, 1879 in Ulm, Germany, Einstein revolutionized our understanding of space, time, and gravity.</p>',\n\tisTarget: false,\n\ttextVerticalAlignment: \"top\",\n\texportOptions: [],\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst source = {\n\tid: \"WHKr22AAm\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"WeoMMVJ7w\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"UMYmnM_Xf\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"WeoMMVJ7w\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03229166666666689,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 62,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">Portfolio Website</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"AbTv1z6H3\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"WeoMMVJ7w\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2020</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor:\n\t\t\t\t'var(--token-d084cbd4-b115-44e5-81d9-5657e7d17569, rgb(25, 25, 25)) /* {\"name\":\"Buttons and Borders\"} */',\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: true,\n\t\t\tborderTop: 0,\n\t\t\tborderRight: 0,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 0,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: 0,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.058333333333333556,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"qo0lasyg9\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"kkqSmZfSj\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"qo0lasyg9\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03125000000000022,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 61,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">Design System Launch</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"iIfnlW4q1\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"qo0lasyg9\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2021</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor:\n\t\t\t\t'var(--token-d084cbd4-b115-44e5-81d9-5657e7d17569, rgb(25, 25, 25)) /* {\"name\":\"Buttons and Borders\"} */',\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: true,\n\t\t\tborderTop: 0,\n\t\t\tborderRight: 0,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 0,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: 35,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.3500000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"Qp6bS1FEr\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"NC7F3Uesg\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Qp6bS1FEr\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03229166666666689,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 62.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">Dark Mode Dashboard</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"qaLf3tBKU\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"Qp6bS1FEr\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2022</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor:\n\t\t\t\t'var(--token-d084cbd4-b115-44e5-81d9-5657e7d17569, rgb(25, 25, 25)) /* {\"name\":\"Buttons and Borders\"} */',\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: true,\n\t\t\tborderTop: 0,\n\t\t\tborderRight: 0,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 0,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 35,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.6416666666666669,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"t0NXGFENs\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"uzDaBqqRn\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"t0NXGFENs\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle4\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03229166666666689,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 62,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">API Builder</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"tpa9m9idy\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"t0NXGFENs\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle4\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2023</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor:\n\t\t\t\t'var(--token-d084cbd4-b115-44e5-81d9-5657e7d17569, rgb(25, 25, 25)) /* {\"name\":\"Buttons and Borders\"} */',\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: true,\n\t\t\tborderTop: 0,\n\t\t\tborderRight: 0,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 0,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.9333333333333336,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"kI0IciQcN\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"IpmIYgJ1E\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kI0IciQcN\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle5\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03125000000000022,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">AI Illustration Tool</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"gGdabyqv3\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"kI0IciQcN\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle5\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2024</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tborderEnabled: true,\n\t\t\tborderWidth: 1,\n\t\t\tborderColor:\n\t\t\t\t'var(--token-d084cbd4-b115-44e5-81d9-5657e7d17569, rgb(25, 25, 25)) /* {\"name\":\"Buttons and Borders\"} */',\n\t\t\tborderStyle: \"solid\",\n\t\t\tborderPerSide: true,\n\t\t\tborderTop: 0,\n\t\t\tborderRight: 0,\n\t\t\tborderBottom: 1,\n\t\t\tborderLeft: 0,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.9333333333333336,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"yenvhiBsT\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tid: \"jYhwDOz_Y\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"yenvhiBsT\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"projectTitle6\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: null,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: null,\n\t\t\t\t\tcenterAnchorX: 0.03125000000000022,\n\t\t\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 550; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVFV3; --framer-text-color: var(--token-8961fb69-0ea3-46ab-8b8e-1f9187ebd1a9, rgb(255, 255, 255)); --framer-font-size: 15px; --framer-letter-spacing: -0.01em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on; --framer-line-height: 1em; --framer-text-alignment: center;\\\">Realtime Collaboration Suite</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"r9IcROMQY\",\n\t\t\t\t\t__class: \"RichTextNode\",\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tparentid: \"yenvhiBsT\",\n\t\t\t\t\toriginalid: null,\n\t\t\t\t\tname: null,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\taspectRatio: null,\n\t\t\t\t\tcodeOverrideEnabled: false,\n\t\t\t\t\tcustomizations: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"content\",\n\t\t\t\t\t\t\tproperty: \"textContent\",\n\t\t\t\t\t\t\tfieldType: \"text\",\n\t\t\t\t\t\t\tfieldPath: \"yearTitle6\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tgridItemFillCellWidth: false,\n\t\t\t\t\tgridItemFillCellHeight: false,\n\t\t\t\t\tlinkTextColor: \"#09F\",\n\t\t\t\t\tlinkTextDecoration: \"underline\",\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: null,\n\t\t\t\t\ttop: null,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcenterAnchorX: 0.4687500000000002,\n\t\t\t\t\tcenterAnchorY: 0.7333333333333335,\n\t\t\t\t\twidthType: 2,\n\t\t\t\t\theightType: 2,\n\t\t\t\t\twidth: 60.5,\n\t\t\t\t\theight: 15,\n\t\t\t\t\thtml: \"<p style=\\\"--framer-font-family: &quot;Inter Variable&quot;, &quot;Inter Variable Placeholder&quot;, sans-serif; --framer-font-variation-axes: &quot;opsz&quot; 24, &quot;wght&quot; 500; --font-selector: SW50ZXItVmFyaWFibGVWRj1JbTl3YzNvaUlESTBMQ0FpZDJkb2RDSWdOVEF3; --framer-text-color: var(--token-d3650bef-13f5-49bd-88f0-8a82034ef0d6, rgb(119, 119, 119)); --framer-font-size: 15px; --framer-letter-spacing: -0.05em; --framer-font-open-type-features: 'cv01' on, 'cv09' on, 'cv11' on, 'cv05' on, 'tnum' on; --framer-line-height: 1em; --framer-text-alignment: right;\\\">2025</p>\",\n\t\t\t\t\tstylePresetHeading1: \"iaBy7WzBo\",\n\t\t\t\t\tstylePresetHeading2: \"stylesPresetHeading2\",\n\t\t\t\t\tstylePresetHeading3: \"stylesPresetHeading3\",\n\t\t\t\t\tstylePresetParagraph: \"stylesPresetParagraph\",\n\t\t\t\t\tstylePresetLink: \"stylesPresetLink\",\n\t\t\t\t\tisTarget: false,\n\t\t\t\t\ttextVerticalAlignment: \"top\",\n\t\t\t\t\texportOptions: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\tparentid: \"WHKr22AAm\",\n\t\t\toriginalid: null,\n\t\t\tname: null,\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: false,\n\t\t\tfillType: \"color\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage: null,\n\t\t\tfillImageOriginalName: null,\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: null,\n\t\t\tfillImagePixelHeight: null,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tlayout: \"stack\",\n\t\t\tgap: 5,\n\t\t\tstackAlignment: \"center\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"space-between\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"visible\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 5,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 5,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: 0,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.9333333333333336,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 50,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradiusIsRelative: false,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"D9F_k6a1o\",\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"0px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: 0,\n\tright: null,\n\ttop: 115,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.3500000000000002,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 120,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const node = canvasNodeFromValue(source)!\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"G76q2ibR5\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: \"WQLkyLRf1\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tboxShadows: [],\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(255, 255, 255)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"0px\",\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.3191666666666669,\n\tcenterAnchorY: 0.5000000000000002,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 480,\n\theight: 150,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 20,\n\tradiusTopRight: 20,\n\tradiusBottomRight: 20,\n\tradiusBottomLeft: 20,\n\tradius: 20,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"G76q2ibR5\",\n\t__class: \"FrameNode\",\n\tchildren: [],\n\tparentid: \"WQLkyLRf1\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tboxShadows: [\n\t\t{\n\t\t\ttype: \"box\",\n\t\t\tcolor: \"rgba(0, 0, 0, 0.04)\",\n\t\t\tx: 0,\n\t\t\ty: 2,\n\t\t\tinset: false,\n\t\t\tblur: 4,\n\t\t\tspread: 0,\n\t\t\tdiffusion: 0.5,\n\t\t\tfocus: 0.5,\n\t\t\tid: \"lWNDp2eIv\",\n\t\t},\n\t\t{\n\t\t\ttype: \"box\",\n\t\t\tcolor: \"rgba(0, 0, 0, 0.03)\",\n\t\t\tx: 0,\n\t\t\ty: 4,\n\t\t\tinset: false,\n\t\t\tblur: 8,\n\t\t\tspread: 0,\n\t\t\tdiffusion: 0.5,\n\t\t\tfocus: 0.5,\n\t\t\tid: \"q_81QA4qL\",\n\t\t},\n\t\t{\n\t\t\ttype: \"box\",\n\t\t\tcolor: \"rgba(0, 0, 0, 0.04)\",\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tinset: false,\n\t\t\tblur: 0,\n\t\t\tspread: 1,\n\t\t\tdiffusion: 0.5,\n\t\t\tfocus: 0.5,\n\t\t\tid: \"w6tSQSTzH\",\n\t\t},\n\t],\n\tcodeOverrideEnabled: false,\n\tfillEnabled: true,\n\tfillType: \"color\",\n\tfillColor: \"rgb(255, 255, 255)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tgridItemFillCellWidth: true,\n\tgridItemFillCellHeight: true,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"0px\",\n\tstackAlignment: \"start\",\n\tstackDirection: \"vertical\",\n\tstackDistribution: \"start\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"visible\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0.3191666666666669,\n\tcenterAnchorY: 0.5000000000000002,\n\twidthType: 0,\n\theightType: 0,\n\twidth: 480,\n\theight: 150,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 20,\n\tradiusTopRight: 20,\n\tradiusBottomRight: 20,\n\tradiusBottomLeft: 20,\n\tradius: 20,\n\tradiusIsRelative: false,\n\tmaxWidth: \"100%\",\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"YitSYGaAL\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"AzqEAmjRl\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Hs61hEJBe\", \"eGvf9jQ5G\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,w5MNnmJQOUYpCEeuTCGz0DwiSI.png?originalFilename=Blues_164327_0001.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"Blues_164327_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 628,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"end\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"end\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.16875000000000023,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"KDbTNPVHf\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Jo7V_pVQp\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,lk4lwfSeQMCxwTVOCqzwauSVvjQ.png?originalFilename=P42.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"Blues_140858_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 626,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"start\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.8312500000000003,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"v9mCJDnM7\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Hs61hEJBe\", \"ZrzxcX07D\", \"owDMvKmn5\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,s8BeAyI8piHlqw0JII7c1ohlBM.png?originalFilename=Blues_141408_0001.png&width=2560&height=1440\",\n\t\t\tfillImageOriginalName: \"Blues_141408_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 626,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"djquwtRhj\",\n\tduplicatedFrom: [\"TeIgmOBN8\", \"TYxvpcu4Y\"],\n\toriginalid: null,\n\tname: \"Header Images\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"5px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"hidden\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: 554,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.41737955875731675,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 747,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nconst b = {\n\tid: \"YitSYGaAL\",\n\t__class: \"FrameNode\",\n\tchildren: [\n\t\t{\n\t\t\tid: \"AzqEAmjRl\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Hs61hEJBe\", \"eGvf9jQ5G\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,9nfnlHB3O5VQP9oeRwyvi7ztrE.png?originalFilename=Card+1%402x.png&width=628&height=1120\",\n\t\t\tfillImageOriginalName: \"Blues_164327_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 628,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"end\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"end\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.16875000000000023,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"KDbTNPVHf\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Jo7V_pVQp\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,ApXnpSn7KTqRCzLmeQs9psd1fSU.png?originalFilename=Card+2%402x.png&width=626&height=1120\",\n\t\t\tfillImageOriginalName: \"Blues_140858_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 626,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"start\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.8312500000000003,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t\t{\n\t\t\tid: \"v9mCJDnM7\",\n\t\t\t__class: \"FrameNode\",\n\t\t\tchildren: [],\n\t\t\tparentid: \"YitSYGaAL\",\n\t\t\tduplicatedFrom: [\"OjAEIe0FN\", \"Hs61hEJBe\", \"ZrzxcX07D\", \"owDMvKmn5\"],\n\t\t\toriginalid: null,\n\t\t\tname: \"Card\",\n\t\t\tvisible: true,\n\t\t\taspectRatio: null,\n\t\t\tcodeOverrideEnabled: false,\n\t\t\tfillEnabled: true,\n\t\t\tfillType: \"image\",\n\t\t\tfillColor: \"rgba(255,255,255,1)\",\n\t\t\tfillImage:\n\t\t\t\t\"data:framer/asset-reference,ArrUzY8CZC2i6zL1BT8FMm3Mg1k.png?originalFilename=Card+3%402x.png&width=626&height=1120\",\n\t\t\tfillImageOriginalName: \"Blues_141408_0001.png\",\n\t\t\tfillImageResize: \"fill\",\n\t\t\tfillImagePixelWidth: 626,\n\t\t\tfillImagePixelHeight: 1120,\n\t\t\tguidesX: [],\n\t\t\tguidesY: [],\n\t\t\tintrinsicWidth: null,\n\t\t\tintrinsicHeight: null,\n\t\t\tgap: 10,\n\t\t\tstackAlignment: \"start\",\n\t\t\tstackDirection: \"horizontal\",\n\t\t\tstackDistribution: \"center\",\n\t\t\tstackWrapEnabled: false,\n\t\t\topacity: 1,\n\t\t\toverflow: \"clip\",\n\t\t\tpadding: 0,\n\t\t\tpaddingPerSide: false,\n\t\t\tpaddingTop: 0,\n\t\t\tpaddingRight: 0,\n\t\t\tpaddingBottom: 0,\n\t\t\tpaddingLeft: 0,\n\t\t\tconstraintsLocked: false,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t\tcenterAnchorX: 0.5000000000000002,\n\t\t\tcenterAnchorY: 0.5000000000000002,\n\t\t\twidthType: 3,\n\t\t\theightType: 0,\n\t\t\twidth: 1,\n\t\t\theight: 560,\n\t\t\tpreviewSettings: null,\n\t\t\tradiusPerCorner: false,\n\t\t\tradiusTopLeft: 0,\n\t\t\tradiusTopRight: 0,\n\t\t\tradiusBottomRight: 0,\n\t\t\tradiusBottomLeft: 0,\n\t\t\tradius: 40,\n\t\t\tradiusIsRelative: false,\n\t\t\tcornerShape: 1.5,\n\t\t\tisTarget: false,\n\t\t\tisMaster: false,\n\t\t\tisExternalMaster: null,\n\t\t\treplicaInfo: null,\n\t\t\texportOptions: [],\n\t\t\tframePreset: null,\n\t\t},\n\t],\n\tparentid: \"djquwtRhj\",\n\tduplicatedFrom: [\"TeIgmOBN8\", \"TYxvpcu4Y\"],\n\toriginalid: null,\n\tname: \"Header Images\",\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\tfillEnabled: false,\n\tfillType: \"color\",\n\tfillColor: \"rgba(255,255,255,1)\",\n\tfillImage: null,\n\tfillImageOriginalName: null,\n\tfillImageResize: \"fill\",\n\tfillImagePixelWidth: null,\n\tfillImagePixelHeight: null,\n\tguidesX: [],\n\tguidesY: [],\n\tintrinsicWidth: null,\n\tintrinsicHeight: null,\n\tlayout: \"stack\",\n\tgap: \"5px\",\n\tstackAlignment: \"center\",\n\tstackDirection: \"horizontal\",\n\tstackDistribution: \"center\",\n\tstackWrapEnabled: false,\n\topacity: 1,\n\toverflow: \"hidden\",\n\tpadding: 0,\n\tpaddingPerSide: false,\n\tpaddingTop: 0,\n\tpaddingRight: 0,\n\tpaddingBottom: 0,\n\tpaddingLeft: 0,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: 554,\n\tbottom: null,\n\tcenterAnchorX: 0.5000000000000002,\n\tcenterAnchorY: 0.41737955875731675,\n\twidthType: 3,\n\theightType: 2,\n\twidth: 1,\n\theight: 747,\n\tpreviewSettings: null,\n\tradiusPerCorner: false,\n\tradiusTopLeft: 0,\n\tradiusTopRight: 0,\n\tradiusBottomRight: 0,\n\tradiusBottomLeft: 0,\n\tradiusIsRelative: false,\n\tisTarget: false,\n\tisMaster: false,\n\tisExternalMaster: null,\n\treplicaInfo: null,\n\texportOptions: [],\n\tframePreset: null,\n}\n\nexport const attachments = [\n\t\"https://framerusercontent.com/assets/9nfnlHB3O5VQP9oeRwyvi7ztrE.png\",\n\t\"https://framerusercontent.com/assets/ApXnpSn7KTqRCzLmeQs9psd1fSU.png\",\n\t\"https://framerusercontent.com/assets/ArrUzY8CZC2i6zL1BT8FMm3Mg1k.png\",\n]\n\nexport const nodes = {\n\tfrom: canvasNodeFromValue(a)!,\n\tto: canvasNodeFromValue(b)!,\n}\n", "import { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\n\nconst a = {\n\tid: \"J29QInxOS\",\n\t__class: \"RichTextNode\",\n\tchildren: [],\n\tparentid: \"DHxuYvYpU\",\n\tduplicatedFrom: null,\n\toriginalid: null,\n\tname: null,\n\tvisible: true,\n\taspectRatio: null,\n\tcodeOverrideEnabled: false,\n\topacity: 1,\n\tconstraintsLocked: false,\n\tleft: null,\n\tright: null,\n\ttop: null,\n\tbottom: null,\n\tcenterAnchorX: 0,\n\tcenterAnchorY: 0,\n\twidthType: 1,\n\theightType: 2,\n\twidth: 1,\n\theight: 200,\n\thtml: '<p dir=\"auto\" style=\"--framer-font-family: &quot;Geist Mono&quot;, monospace; --framer-font-weight: 700; --font-selector: R0Y7R2Vpc3QgTW9uby03MDA=; --framer-text-color: var(--token-c00b7b48-c65e-4fb5-b6c3-52b57e235a2e, rgb(15, 15, 15)); --framer-font-size: 32px; --framer-letter-spacing: -0.03em; --framer-text-stroke-width: 0px; --framer-line-height: 1.15em;\"><strong>Frequently asked questions</strong></p>',\n\tisTarget: false,\n\ttextVerticalAlignment: \"top\",\n\texportOptions: [],\n}\n\nexport const node = canvasNodeFromValue(a)!\n", "import type { ReadProjectQuery } from \"../tools/readProject.ts\"\nimport { READ_PROJECT_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nfunction tool(toolName: string, input: Record<string, unknown>): string {\n\treturn escapeValue(\n\t\tJSON.stringify({\n\t\t\ttool_name: toolName,\n\t\t\targuments: input,\n\t\t}),\n\t)\n}\n\nexport function formatReadProjectCall(query: ReadProjectQuery): string {\n\treturn tool(READ_PROJECT_TOOL_NAME, { queries: [query] })\n}\n\nexport function formatReadProjectCallFromQueries(queries: ReadProjectQuery[]): string {\n\treturn tool(READ_PROJECT_TOOL_NAME, { queries })\n}\n", "import { SCRIPT_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nexport function formatScriptCall(script: string): string {\n\treturn escapeValue(\n\t\tJSON.stringify({\n\t\t\ttool_name: SCRIPT_TOOL_NAME,\n\t\t\targuments: { script },\n\t\t}),\n\t)\n}\n", "import type { ReactComponentDefinition } from \"@framerjs/framer-runtime\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { assert, emptyArray } from \"@framerjs/shared\"\nimport { type CanvasNode, RichTextNode, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { withBoxShadow } from \"document/models/CanvasTree/traits/WithBoxShadow.ts\"\nimport { withPadding } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport { isPinnable } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport {\n\tstyleAppearEffectEnabledDefaults,\n\twithStyleAppearPageEffect,\n} from \"document/models/CanvasTree/traits/WithStyleAppearEffect.ts\"\nimport { isBoxShadowList } from \"document/models/Shadow.ts\"\nimport { ControlType, DimensionType } from \"library/index.ts\"\nimport { singleBoxShadowToCSS } from \"utils/boxShadowToCSS.ts\"\nimport { join } from \"utils/join.ts\"\nimport { isArray, isFunction, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { PROJECT_UPDATE_LABEL, formatLabeledProjectUpdateBlock, formatProjectUpdateBlock } from \"../DocumentParser.ts\"\nimport { AgentContext } from \"../context/AgentContext.ts\"\nimport { Files } from \"../context/files.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { createSelectedNodesContextMessage, transformToAiNode } from \"../context/nodes.ts\"\nimport {\n\ttype Command,\n\tCommandType,\n\tComponentInstanceNodeClass,\n\tComponentNodeClass,\n\tEventHandlerControlName,\n\tEventHandlerVariableAliasNodeClass,\n\tIconNodeClass,\n\tRelativeOverlayNodeClass,\n\tSetVariantActionName,\n\tShowOverlayActionName,\n\tTextBlockClass,\n\tTextComponentInstanceClass,\n\tTextLineBreakClass,\n\tTextRunClass,\n\tTriggerEventActionName,\n\tVariableNodeClass,\n} from \"../dsl.ts\"\nimport { nodes as avatars } from \"../evals/examples/avatars.ts\"\nimport { nodes as breakpoints } from \"../evals/examples/breakpoints.ts\"\nimport { nodes as card } from \"../evals/examples/card.ts\"\nimport { nodes as centreNavNodes } from \"../evals/examples/centreNav.ts\"\nimport { nodes as contextNodes } from \"../evals/examples/context.ts\"\nimport { nodes as createNodesContext } from \"../evals/examples/createNodes.ts\"\nimport { nodes as denseNodes } from \"../evals/examples/dense.ts\"\nimport { nodes as denseFixedColNodes } from \"../evals/examples/denseFixedCol.ts\"\nimport { nodes as denseGrid } from \"../evals/examples/denseGrid.ts\"\nimport { nodes as featureGrid } from \"../evals/examples/featureGrid.ts\"\nimport { nodes as fraction } from \"../evals/examples/fraction.ts\"\nimport { nodes as iconControlsNodes } from \"../evals/examples/iconControls.ts\"\nimport { nodes as imageGrid } from \"../evals/examples/imageGrid.ts\"\nimport { nodes as nav } from \"../evals/examples/nav.ts\"\nimport { nodes as overlayNodes } from \"../evals/examples/overlay.ts\"\nimport { nodes as replicateIcons } from \"../evals/examples/replicateIcons.ts\"\nimport { nodes as richTextNode } from \"../evals/examples/richTextNode.ts\"\nimport { node as row } from \"../evals/examples/row.ts\"\nimport { nodes as shadowNodes } from \"../evals/examples/shadow.ts\"\nimport { attachments, nodes as swapImages } from \"../evals/examples/swapImages.ts\"\nimport { node as textStylePresetNode } from \"../evals/examples/textStylePreset.ts\"\nimport { commandToDSL, nodeToDSLCommands, transformNodesToCommands } from \"../nodeToDSLCommands.ts\"\nimport type { Source } from \"../source.ts\"\nimport {\n\tCOMPONENT_DEFINITION_QUERY,\n\tFONT_SEARCH_QUERY,\n\tIMPLEMENTATION_GUIDE_FROM_INDEX_QUERY,\n} from \"../tools/readProjectQueryTypes.ts\"\nimport { formatReadProjectCallFromQueries } from \"./formatReadProjectCall.ts\"\nimport { formatScriptCall } from \"./formatScriptCall.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource, scriptReference } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport {\n\tcommandReference,\n\tescapeBlock,\n\tescapeValue,\n\tkeyValueReference,\n\ttraitReference,\n\ttraitValueReference,\n} from \"./utils.ts\"\n\ninterface Example {\n\tprompt: string\n\tcategory?: Category[]\n\tdescription?: string | ((source: Source) => string)\n\tcontextTree?: CanvasNode\n\tincludeTreeInPrompt?: boolean\n\tcontextImages?: string[]\n\tdefinitions?: Record<ModuleExportIdentifierString, Partial<ReactComponentDefinition>>\n\tctx?: Partial<AgentContext> | (() => Promise<Partial<AgentContext>>)\n\ttargetTree?: () => CanvasNode\n\texpectedOutput?: ((target?: CanvasNode) => Command[]) | Command[] | (string | Command)[]\n\texpectedNativeToolCalls?: string[]\n\tonlyFor?: Source[\"prompt\"]\n}\n\nenum Category {\n\tEffect = \"effect\",\n\tLayout = \"layout\",\n\tUpdate = \"update\",\n\tText = \"text\",\n\tCreate = \"create\",\n\tToken = \"token\",\n\tReplicas = \"replicas\",\n\tStylePreset = \"stylePreset\",\n}\n\n// @TODO: We are sending the entire \"selection\" tree as context for the example. When we are able to\n// use an initial model to send only the necessary context, we should use the same heuristics here\n// to put less JSON in the system prompt while also mimicking real input/output precisely.\nconst examples = (source: Source): Example[] => [\n\t{\n\t\tprompt: \"Make the layout less dense\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: row,\n\t\ttargetTree: () => {\n\t\t\tconst target = row.cloneWithIds({ gap: 10 })\n\t\t\ttarget.children?.forEach(child => {\n\t\t\t\tassert(withPadding(child) && isPinnable(child), \"Child must have padding\")\n\t\t\t\tchild.set({\n\t\t\t\t\tpaddingPerSide: true,\n\t\t\t\t\tpaddingTop: 10,\n\t\t\t\t\tpaddingBottom: 10,\n\t\t\t\t\theightType: DimensionType.Auto,\n\t\t\t\t})\n\t\t\t})\n\t\t\treturn target\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Turn into 2x2 Grid with double the spacing and rounder images\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: imageGrid.from,\n\t\ttargetTree: () => {\n\t\t\treturn imageGrid.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make accent color a nice bright yellow\",\n\t\tcategory: [Category.Text, Category.Update],\n\t\tcontextTree: card.from,\n\t\ttargetTree: () => {\n\t\t\treturn card.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Try with round avatars?\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: avatars.from,\n\t\ttargetTree: () => {\n\t\t\treturn avatars.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Feature the first image by making it span 2 rows and 2 cols\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: featureGrid.from,\n\t\ttargetTree: () => {\n\t\t\treturn featureGrid.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make logos a small, (dense | narrow), 3x3 grid\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: denseGrid.from,\n\t\ttargetTree: () => {\n\t\t\treturn denseGrid.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Can we try a left aligned vertical navbar layout?\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: nav.from,\n\t\ttargetTree: () => {\n\t\t\treturn nav.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make symmetrical and place icon in middle of links\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: nav.from,\n\t\ttargetTree: () => {\n\t\t\treturn nav.c\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Have links span full width\",\n\t\tdescription: `Since it's unclear if the links should be centred or not, just update the ${traitReference(\"stackDistribution\")}.`,\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: nav.c,\n\t\ttargetTree: () => {\n\t\t\treturn nav.d\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make the links evenly occupy all available space\",\n\t\tdescription: `Because we don't want the links to touch the edges of the parent, we don't use ${traitValueReference(\"stackDistribution\", \"space-between\")}, instead we use ${traitValueReference(\"width\", \"1fr\")} on each item to make them evenly occupy all available space. Since the text is already centred, we don't need any other modifications.`,\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: fraction.from,\n\t\ttargetTree: () => {\n\t\t\treturn fraction.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make this grid (denser | narrower)\",\n\t\tdescription: `When the input grid node is ${traitValueReference(\"width\", \"auto\")}, has ${traitValueReference(\"gridColumnMinWidth\", \"50\")} and filling it's parent which has ${traitValueReference(\"width\", \"1000px\")}, we need to reduce the width of the grid by setting a concrete size to make the columns narrower.`,\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: denseNodes.from,\n\t\tincludeTreeInPrompt: true,\n\t\ttargetTree: () => {\n\t\t\treturn denseNodes.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make this grid (denser | narrower)\",\n\t\tdescription: `When the input grid node is ${traitValueReference(\"width\", \"auto\")}, has ${traitValueReference(\"gridColumnWidth\", \"500\")} and filling it's parent which has ${traitValueReference(\"width\", \"1000px\")}, we need to reduce the width of the grid by reducing the width of the columns.`,\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: denseFixedColNodes.from,\n\t\tincludeTreeInPrompt: true,\n\t\ttargetTree: () => {\n\t\t\treturn denseFixedColNodes.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Center layout and put logo in middle of links\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: centreNavNodes.from,\n\t\ttargetTree: () => {\n\t\t\treturn centreNavNodes.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Make the links fill the space\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: centreNavNodes.to,\n\t\ttargetTree: () => {\n\t\t\treturn centreNavNodes.fill\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Replace the images with my images\",\n\t\tdescription: `No updates other than ${traitReference(\"fill\")} are required since the prompt is a specific instruction.`,\n\t\tcategory: [Category.Update],\n\t\tcontextTree: swapImages.from,\n\t\tcontextImages: attachments,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"AzqEAmjRl\",\n\t\t\t\t\tfill: attachments[0],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"KDbTNPVHf\",\n\t\t\t\t\tfill: attachments[1],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"v9mCJDnM7\",\n\t\t\t\t\tfill: attachments[2],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Update the other links to match Gallery\",\n\t\tcategory: [Category.Layout, Category.Update, Category.Create],\n\t\tcontextTree: replicateIcons.from,\n\t\tctx: replicateIcons.ctx,\n\t\ttargetTree: () => {\n\t\t\treturn replicateIcons.to\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Recreate this footer on my page\",\n\t\tcategory: [Category.Layout, Category.Create],\n\t\tcontextTree: createNodesContext.minimalScope,\n\t\tcontextImages: [\"https://example.com/footer-reference.png\"],\n\t\tdescription: (source: Source) =>\n\t\t\t`The user is asking to recreate the footer from the attached image. In recreate/match intent, maximum visual and layout accuracy to the reference is the top priority. First infer hierarchy: top-level sections -> section containers -> child groups -> leaf elements. Determine parent-child relationships from shared bounds, alignment, and visual containment (backgrounds, borders, wrappers), then place children relative to parents (parent gap controls sibling spacing, parent padding controls internal spacing; use absolute only for intentional overlap). Preserve spacing ratios across levels (outer margin vs section padding vs internal gaps) so distinctive whitespace is not flattened. After structure is set, match typography, spacing, and color palette, then request ${AgentSystemPromptDictionary.ImplementationGuidanceDocumentation}, fonts to match typography, ${forSource(source, { \"in-app\": `${escapeValue(metadataTags.selectedNodes)} context`, local: \"and node context\" })} to continue the build.`,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: createNodesContext.minimalScope.id,\n\t\t\t\t\tfill: \"linear-gradient(180deg, rgb(12, 18, 33) 0%, rgb(28, 37, 65) 100%)\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\texpectedNativeToolCalls: [\n\t\t\tformatReadProjectCallFromQueries([\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Typography\" },\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Buttons\" },\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Forms\" },\n\t\t\t\t{ type: FONT_SEARCH_QUERY, query: \"modern clean sans-serif\", limit: 5 },\n\t\t\t]),\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add a Tablet breakpoint, add a label in each breakpoint with corresponding text\",\n\t\tdescription: `Create a new Variant from the existing Breakpoint. Insert a single node, then modify it in each replica to have the corresponding text.`,\n\t\tcategory: [Category.Replicas],\n\t\tcontextTree: breakpoints.desktop,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.CreateVariant,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tablet\",\n\t\t\t\t\tfrom: breakpoints.desktop.id,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tablet\",\n\t\t\t\t\tname: \"Tablet\",\n\t\t\t\t\twidth: \"810px\",\n\t\t\t\t\tleft: \"1240px\",\n\t\t\t\t\ttop: \"0px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tparent: breakpoints.desktop.id,\n\t\t\t\t\tid: \"label\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"label\",\n\t\t\t\t\ttext: \"Desktop\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tabletlabel\",\n\t\t\t\t\ttext: \"Tablet\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add text here that says 'Tablet'\",\n\t\tdescription: `Since the selection is a Replica Variant, we MUST add the text in the Primary Variant, then modify it in the Replica Variant to make it visible.`,\n\t\tcategory: [Category.Replicas],\n\t\tcontextTree: breakpoints.tablet,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tparent: (() => {\n\t\t\t\t\t\tassert(breakpoints.tablet.replicaInfo, \"Expected tablet replica info\")\n\t\t\t\t\t\treturn breakpoints.tablet.replicaInfo.master\n\t\t\t\t\t})(),\n\t\t\t\t\tid: \"label\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"label\",\n\t\t\t\t\ttext: \"Tablet\",\n\t\t\t\t\tvisible: \"false\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: `${breakpoints.tablet.id}label`,\n\t\t\t\t\tvisible: \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Make the title text better reflect the content of this subheading\",\n\t\tcategory: [Category.Update],\n\t\tcontextTree: contextNodes.from,\n\t\texpectedNativeToolCalls: [formatScriptCall(\"return api.serialize('<ground-node-id>');\")],\n\t},\n\t// {\n\t// \tprompt: \"Make a button squarer\",\n\t// \tcategory: [Category.Layout, Category.Update],\n\t// \tcontextTree: clarifyNodes.from,\n\t// \texpectedOutput: [\n\t// \t\t{\n\t// \t\t\ttype: CommandType.Clarify,\n\t// \t\t\tattributes: {\n\t// \t\t\t\ttype: .Node,\n\t// \t\t\t\toptions: [\"LHqG2Zsh0\", \"wXvhpURpr\"],\n\t// \t\t\t},\n\t// \t\t},\n\t// \t],\n\t// },\n\t{\n\t\tcategory: [Category.Layout, Category.Create],\n\t\tprompt: \"Add 3 product feature cards here\",\n\t\tcontextTree: undefined,\n\t\tdescription: `When the request requires certain features to be implemented that don't already exist on the page, request similar ${AgentSystemPromptDictionary.ImplementationGuidanceDocumentation}.`,\n\t\texpectedNativeToolCalls: [\n\t\t\tformatReadProjectCallFromQueries([\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Cards\" },\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Grids\" },\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Typography\" },\n\t\t\t]),\n\t\t],\n\t},\n\t{\n\t\tcategory: [Category.Layout, Category.Create],\n\t\tprompt: \"Add a testimonials section with 3 customer reviews\",\n\t\tcontextTree: undefined,\n\t\tdescription: `Even when specific content is provided (e.g. '3 customer reviews'), always request the necessary ${AgentSystemPromptDictionary.ImplementationGuidanceDocumentation}.`,\n\t\texpectedNativeToolCalls: [\n\t\t\tformatReadProjectCallFromQueries([\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Cards\" },\n\t\t\t\t{ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: \"Typography\" },\n\t\t\t]),\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Make the card blue and increase the padding\",\n\t\tonlyFor: \"in-app\",\n\t\tdescription: `Emit step messages before each logical group of changes inside the ${escapeValue(PROJECT_UPDATE_LABEL)} block.`,\n\t\tcategory: [Category.Update],\n\t\tcontextTree: createNodesContext.minimalScope,\n\t\texpectedOutput: [\n\t\t\tformatLabeledProjectUpdateBlock([\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Updating color\u2026\",\n\t\t\t\t\tcontent: commandToDSL({\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\tattributes: { id: createNodesContext.minimalScope.id, fill: \"rgb(59, 130, 246)\" },\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Adding padding\u2026\",\n\t\t\t\t\tcontent: commandToDSL({\n\t\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\t\t// TODO: Ensure these attributes are type checked.\n\t\t\t\t\t\tattributes: { id: createNodesContext.minimalScope.id, padding: \"24px\" },\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t]),\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create a button component\",\n\t\tdescription: `Create the label variable first and bind the ${escapeValue(ClassDiscriminator.RichTextNode)} label to its variable reference.`,\n\t\tcategory: [Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ComponentNodeClass,\n\t\t\t\t\tid: \"component-button\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"Button\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"frame-button\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"component-button\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"frame-button\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tpadding: \"10px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: VariableNodeClass,\n\t\t\t\t\tid: \"cNtr1abcd\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"Content\",\n\t\t\t\t\ttype: ControlType.String,\n\t\t\t\t\tinitialValue: \"Click me\",\n\t\t\t\t\tscope: \"component-button\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"text-button\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"frame-button\",\n\t\t\t\t\tname: \"Content\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"text-button\",\n\t\t\t\t\ttext: \"var(--variable-cNtr1abcd)\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: `Create a ${escapeValue(ComponentNodeClass)} with a button that triggers an event handler variable`,\n\t\tdescription: `Use the minimal ${escapeValue(EventHandlerControlName)} pattern: add ${commandReference(CommandType.Add, ComponentNodeClass)}, create ${commandReference(CommandType.Add, EventHandlerVariableAliasNodeClass)} on the component scope, place the button directly under the component as its primary variant, and wire the button with ${escapeValue(`onTap.0.action=\"${TriggerEventActionName}\"`)} plus ${escapeValue('onTap.0.controls.id=\"var(--variable-<event-handler-variable-id>)\"')}.`,\n\t\tcategory: [Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ComponentNodeClass,\n\t\t\t\t\tid: \"test-trigger-comp\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"Test Trigger\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"fire-btn\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"test-trigger-comp\",\n\t\t\t\t\tname: \"Fire Button\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"fire-btn\",\n\t\t\t\t\thtmlTag: \"button\",\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tgap: \"6px\",\n\t\t\t\t\tpadding: \"10px 18px\",\n\t\t\t\t\twidth: \"auto\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t\tfill: \"rgba(239, 68, 68, 1)\",\n\t\t\t\t\tradius: \"8px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: EventHandlerVariableAliasNodeClass,\n\t\t\t\t\tid: \"var-on-fire\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"On Fire\",\n\t\t\t\t\tscope: \"test-trigger-comp\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"fire-btn\",\n\t\t\t\t\t\"onTap.0.action\": TriggerEventActionName,\n\t\t\t\t\t\"onTap.0.controls.id\": \"var(--variable-var-on-fire)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"fire-label\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"fire-btn\",\n\t\t\t\t\tname: \"Label\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"fire-label\",\n\t\t\t\t\ttext: \"Fire\",\n\t\t\t\t\twidth: \"auto\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t\ttextColor: \"rgba(255,255,255,1)\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create an interactive FAQ component\",\n\t\tdescription: `For accordion/disclosure components with two variants (Open/Closed), hide the answer in the Closed variant with ${keyValueReference(\"visible\", \"false\")}. Use ${escapeValue(SetVariantActionName)} with cycle for two-variant toggles.`,\n\t\tcategory: [Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ComponentNodeClass,\n\t\t\t\t\tid: \"faq-component\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"FAQ/Question\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"faq-open\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-component\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-open\",\n\t\t\t\t\tname: \"Open\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"faq-row\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-open\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-row\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"space-between\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: VariableNodeClass,\n\t\t\t\t\tid: \"var-question\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"Question\",\n\t\t\t\t\ttype: ControlType.String,\n\t\t\t\t\tinitialValue: \"What services do you offer?\",\n\t\t\t\t\tscope: \"faq-component\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"faq-question-text\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-row\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-question-text\",\n\t\t\t\t\ttext: \"var(--variable-var-question)\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: IconNodeClass,\n\t\t\t\t\tid: \"faq-icon\",\n\t\t\t\t\tset: \"Lucide\",\n\t\t\t\t\t$control__icon: \"Minus\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-row\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"faq-answer\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-open\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-answer\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: VariableNodeClass,\n\t\t\t\t\tid: \"var-answer\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"Answer\",\n\t\t\t\t\ttype: ControlType.String,\n\t\t\t\t\tinitialValue: \"We offer a full range of design and development services.\",\n\t\t\t\t\tscope: \"faq-component\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"faq-answer-text\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"faq-answer\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-answer-text\",\n\t\t\t\t\ttext: \"var(--variable-var-answer)\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-row\",\n\t\t\t\t\t\"onTap.0.action\": SetVariantActionName,\n\t\t\t\t\t\"onTap.0.controls.variant\": \"cycle\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.CreateVariant,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-closed\",\n\t\t\t\t\tfrom: \"faq-open\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-closed\",\n\t\t\t\t\tname: \"Closed\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-closedfaq-icon\",\n\t\t\t\t\t$control__icon: \"Plus\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"faq-closedfaq-answer\",\n\t\t\t\t\tvisible: \"false\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create a fixed overlay from this button with a dimmed dismissible backdrop\",\n\t\tdescription: `Create a fixed overlay that opens from the tapped button, then configure the dimmed dismissible backdrop with ${traitReference(\"backdrop\")} attributes.`,\n\t\tcategory: [Category.Create, Category.Update],\n\t\tcontextTree: overlayNodes.from,\n\t\ttargetTree: () => overlayNodes.withFixedOverlay,\n\t},\n\t{\n\t\tprompt: \"Create a dropdown menu that opens below this button on hover\",\n\t\tdescription: `Create a ${commandReference(CommandType.Add, RelativeOverlayNodeClass)} and configure ${traitReference(\"floatingPlacement\")} and ${traitReference(\"floatingAlignment\")} for a relative overlay anchored to the hovered button.`,\n\t\tcategory: [Category.Create, Category.Update],\n\t\tcontextTree: overlayNodes.from,\n\t\ttargetTree: () => overlayNodes.withRelativeOverlay,\n\t},\n\t{\n\t\tprompt: \"When clicking on this button show an overlay\",\n\t\tdescription: `For an existing ${escapeValue(ComponentInstanceNodeClass)} whose ${escapeValue(\"component\")} is listed under Current Project in ${escapeValue(`<${metadataTags.availableComponents}>`)}, first request both ${escapeValue(`\"component-definition\"`)} and retrieve the node with ${scriptReference(source)} so the local ${escapeValue(ComponentNodeClass)} is in context. If the source does not already expose a suitable ${escapeValue(EventHandlerControlName)} control for this interaction, add ${commandReference(CommandType.Add, EventHandlerVariableAliasNodeClass)} on the component scope, wire the source trigger node with ${escapeValue(`onTap.0.action=\"${TriggerEventActionName}\"`)} plus ${escapeValue('onTap.0.controls.id=\"var(--variable-<event-handler-variable-id>)\"')}, then create the overlay and bind ${escapeValue(ShowOverlayActionName)} to the instance's exposed ${escapeValue(\"eventKey\")} (for example ${escapeValue(\"onClick\")}).`,\n\t\tcategory: [Category.Create, Category.Update],\n\t\texpectedNativeToolCalls: [\n\t\t\tformatReadProjectCallFromQueries([{ type: COMPONENT_DEFINITION_QUERY, id: \"button-component\" }]),\n\t\t\tformatScriptCall(\"return api.serialize('<button-component-id>');\"),\n\t\t],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: EventHandlerVariableAliasNodeClass,\n\t\t\t\t\tid: \"var-on-click\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tname: \"On Click\",\n\t\t\t\t\tscope: \"button-component\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"source-trigger-node\",\n\t\t\t\t\t\"onTap.0.action\": TriggerEventActionName,\n\t\t\t\t\t\"onTap.0.controls.id\": \"var(--variable-var-on-click)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: RelativeOverlayNodeClass,\n\t\t\t\t\tid: \"menu-overlay\",\n\t\t\t\t\tparent: \"button-instance\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"menu-overlay\",\n\t\t\t\t\tfloatingPlacement: \"bottom\",\n\t\t\t\t\tfloatingAlignment: \"start\",\n\t\t\t\t\tfloatingOffsetY: \"8px\",\n\t\t\t\t\twidth: \"220px\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t\tfill: \"rgba(18,18,18,1)\",\n\t\t\t\t\tradius: \"12px\",\n\t\t\t\t\tpadding: \"8px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button-instance\",\n\t\t\t\t\t\"onClick.0.action\": ShowOverlayActionName,\n\t\t\t\t\t\"onClick.0.controls.overlay\": \"menu-overlay\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"I want the overlay to be shown on hover\",\n\t\tdescription: `If that overlay currently opens because the source component fires ${escapeValue(TriggerEventActionName)} from ${escapeValue(\"onTap\")} and the instance definition exposes only ${escapeValue(\"onClick\")}, first request both ${escapeValue(`\"component-definition\"`)} and retrieve the node with ${scriptReference(source)}. Then switch the internal source trigger from ${escapeValue(\"onTap\")} to ${escapeValue(\"onMouseEnter\")}, keep the instance ${escapeValue(ShowOverlayActionName)} action on ${escapeValue(\"onClick\")}, and do not rewrite the instance handler to ${escapeValue(\"onMouseEnter\")}.`,\n\t\tcategory: [Category.Update],\n\t\texpectedNativeToolCalls: [\n\t\t\tformatReadProjectCallFromQueries([{ type: COMPONENT_DEFINITION_QUERY, id: \"button-component\" }]),\n\t\t\tformatScriptCall(\"return api.serialize('<button-component-id>');\"),\n\t\t],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"source-trigger-node\",\n\t\t\t\t\t\"onTap.0\": \"null\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"source-trigger-node\",\n\t\t\t\t\t\"onMouseEnter.0.action\": TriggerEventActionName,\n\t\t\t\t\t\"onMouseEnter.0.controls.id\": \"var(--variable-var-on-click)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button-instance\",\n\t\t\t\t\t\"onClick.0.action\": ShowOverlayActionName,\n\t\t\t\t\t\"onClick.0.controls.overlay\": \"menu-overlay\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Switch to Variant 2 when the overlay is open\",\n\t\tdescription: `When a ${escapeValue(ComponentInstanceNodeClass)} already has ${traitReference(\"whileOpen\")} and an overlay wired, prefer ${traitReference(\"whileOpen\")} to switch variants while the overlay is open. Do not add a ${escapeValue(SetVariantActionName)} action to the event handler.`,\n\t\tcategory: [Category.Update],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button-instance\",\n\t\t\t\t\twhileOpen: \"Variant 2\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add some buttons\",\n\t\tcategory: [Category.Create, Category.Update],\n\t\tdescription: `When inserting a ${escapeValue(ComponentInstanceNodeClass)} that has icon controls, always set the icon control to an appropriate icon for the button. It should always be on the first ${commandReference(CommandType.Update)} that configures the instance.`,\n\t\tctx: () => iconControlsNodes.ctx(),\n\t\tcontextTree: iconControlsNodes.from,\n\t\ttargetTree: () => iconControlsNodes.to,\n\t},\n\t{\n\t\tprompt: \"Add a fade in animation on appear\",\n\t\tcategory: [Category.Effect, Category.Update],\n\t\tcontextTree: row,\n\t\ttargetTree: () => {\n\t\t\tconst target = row.cloneWithIds()\n\t\t\tif (withStyleAppearPageEffect(target)) {\n\t\t\t\ttarget.set(styleAppearEffectEnabledDefaults)\n\t\t\t}\n\t\t\treturn target\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Add a shadow to the card\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: shadowNodes.from,\n\t\ttargetTree: () => shadowNodes.to,\n\t},\n\t{\n\t\tprompt: \"Make the shadows red\",\n\t\tcategory: [Category.Layout, Category.Update],\n\t\tcontextTree: shadowNodes.to,\n\t\ttargetTree: () => {\n\t\t\tconst target = shadowNodes.to.cloneWithIds()\n\t\t\tassert(withBoxShadow(target))\n\t\t\tconst boxShadows = target.boxShadows\n\t\t\tassert(!isUndefined(boxShadows) && !isDynamicValue(boxShadows), \"Box shadows are required\")\n\t\t\tfor (const boxShadow of boxShadows) {\n\t\t\t\tboxShadow.color = \"red\"\n\t\t\t}\n\t\t\ttarget.set({ boxShadows })\n\t\t\treturn target\n\t\t},\n\t\texpectedOutput: (target: CanvasNode) => {\n\t\t\tassert(withBoxShadow(target), \"Shadow nodes must support the WithShadow trait\")\n\t\t\tassert(isBoxShadowList(target.boxShadows), \"Shadow nodes must have box shadows\")\n\t\t\tconst boxShadows = target.boxShadows.map(shadow => singleBoxShadowToCSS(shadow))\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\ttype: CommandType.Update,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: shadowNodes.to.id,\n\t\t\t\t\t\t\"boxShadows.0\": boxShadows[0],\n\t\t\t\t\t\t\"boxShadows.1\": boxShadows[1],\n\t\t\t\t\t\t\"boxShadows.2\": boxShadows[2],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t},\n\t{\n\t\tprompt: \"Add 3 color styles: Primary Blue, Background White, and Text Black\",\n\t\tcategory: [Category.Token, Category.Create],\n\t\tcontextTree: createNodesContext.minimalScope,\n\t\tdescription:\n\t\t\t\"Primary Blue has different values for light and dark modes, while Background and Text only specify light mode (dark is optional)\",\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.ColorStyleTokenNode,\n\t\t\t\t\tname: \"Primary Blue\",\n\t\t\t\t\tid: \"color-style-token-1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"color-style-token-1\",\n\t\t\t\t\tlight: \"#0099FF\",\n\t\t\t\t\tdark: \"#0066CC\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.ColorStyleTokenNode,\n\t\t\t\t\tname: \"Background White\",\n\t\t\t\t\tid: \"color-style-token-2\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"color-style-token-2\",\n\t\t\t\t\tlight: \"#FFFFFF\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.ColorStyleTokenNode,\n\t\t\t\t\tname: \"Text Black\",\n\t\t\t\t\tid: \"color-style-token-3\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"color-style-token-3\",\n\t\t\t\t\tlight: \"#000000\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create a style preset for button text\",\n\t\tcategory: [Category.StylePreset, Category.Create],\n\t\tdescription: \"Button text typically uses medium weight, slightly increased letter spacing, and uppercase transform\",\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.TextStylePresetNode,\n\t\t\t\t\tname: \"Button Text\",\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\tfontSize: \"14px\",\n\t\t\t\t\tfontWeight: \"500\",\n\t\t\t\t\tletterSpacing: \"0.5px\",\n\t\t\t\t\ttextTransform: \"uppercase\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button-text\",\n\t\t\t\t\ttextStylePreset: \"Button Text\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Convert this FAQ title into a reusable text style\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription:\n\t\t\t\"When converting existing text into a reusable preset, preserve the current visible color by copying it into the preset unless the user explicitly asked to restyle the theme.\",\n\t\tcontextTree: textStylePresetNode,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.TextStylePresetNode,\n\t\t\t\t\tname: \"FAQ Title\",\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\tfontName: \"Geist Mono\",\n\t\t\t\t\tfontWeight: \"700\",\n\t\t\t\t\tfontSize: \"32px\",\n\t\t\t\t\tletterSpacing: \"-0.03em\",\n\t\t\t\t\tlineHeight: \"1.15em\",\n\t\t\t\t\ttextColor: \"rgb(15, 15, 15)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: textStylePresetNode.id,\n\t\t\t\t\ttextStylePreset: \"FAQ Title\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Detach the text style preset from the button text\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription:\n\t\t\t\"Unassigns the text style preset from the button text, automatically inlining the preset styles into the text (pre-existing inline styles win). The text remains visually unchanged, but no longer linked to the preset.\",\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button-text\",\n\t\t\t\t\ttextStylePreset: \"null\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Make the heading smaller on tablet and mobile\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription:\n\t\t\t\"Multiple breakpoint style additions can go in one command. Setting style attributes on a non-existent label creates the slot.\",\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.medium.fontSize\": \"36px\",\n\t\t\t\t\t\"breakpoint.small.fontSize\": \"28px\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt:\n\t\t\t\"The heading style has medium, small, and extraSmall breakpoints. Update medium to 32px and add a large breakpoint at 48px.\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription: `Update existing slots first. The ${escapeValue(\"large\")} slot must be in its own ${commandReference(CommandType.Update)} because it triggers label relabeling.`,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.medium.fontSize\": \"32px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.large.fontSize\": \"48px\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Update the medium breakpoint of the heading style to 32px\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription: \"Use breakpoint.<label>.<property> to update an existing breakpoint slot property.\",\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.medium.fontSize\": \"32px\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt:\n\t\t\t\"The heading style has medium, small, and extraSmall breakpoints. Update medium to 32px and remove the extraSmall breakpoint.\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription: `Update existing slots first. Each removal must be in its own ${commandReference(CommandType.Update)} because it shifts labels.`,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.medium.fontSize\": \"32px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.extraSmall\": \"null\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt:\n\t\t\t\"The heading style has medium and small breakpoints. Update medium to 32px, remove small, and add an extraSmall breakpoint at 24px.\",\n\t\tcategory: [Category.StylePreset, Category.Update],\n\t\tdescription: `Update existing slots first, then remove (own ${commandReference(CommandType.Update)}), then add remaining slots.`,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.medium.fontSize\": \"32px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.small\": \"null\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"style-preset-1\",\n\t\t\t\t\t\"breakpoint.extraSmall.fontSize\": \"24px\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Set text size to fit\",\n\t\tcategory: [Category.Create, Category.Text],\n\t\tcontextTree: new RichTextNode({ id: \"text\", html: \"<p>Hello</p>\" }),\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"text\",\n\t\t\t\t\tfontSize: \"auto-fit(100%)\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add a link to the text\",\n\t\tdescription: `Setting ${traitReference(\"link.href\")} on a ${escapeValue(ClassDiscriminator.RichTextNode)} applies the link to all its text content.`,\n\t\tcategory: [Category.Update, Category.Text],\n\t\tcontextTree: new RichTextNode({ id: \"text\", html: \"<p>Open example.com in new tab</p>\" }),\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"text\",\n\t\t\t\t\t\"link.href\": \"https://example.com\",\n\t\t\t\t\t\"link.openInNewTab\": \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt:\n\t\t\t\"Update the existing Getting Started item Content rich text field by adding a CodeBlock after the intro paragraph with code `npm run dev` and language `shell`. Style the CodeBlock with the dark theme and background #111827.\",\n\t\tdescription:\n\t\t\t`When embedding a Code Block in CMS rich text, keep content controls (` +\n\t\t\t`${escapeValue(\"$control__code\")}, ${escapeValue(\"$control__language\")}` +\n\t\t\t`) on the ${escapeValue(TextComponentInstanceClass)} and move preset-only visual controls to a ` +\n\t\t\t`${escapeValue(ClassDiscriminator.ComponentPresetNode)} assigned through ${traitReference(\"componentPreset.codeBlock\")}.`,\n\t\tcategory: [Category.Update, Category.Text],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.ComponentPresetNode,\n\t\t\t\t\tid: \"codePreset\",\n\t\t\t\t\tcomponent: \"codeBlock\",\n\t\t\t\t\tname: \"Shell Dark\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"codePreset\",\n\t\t\t\t\t$control__theme: \"Static\",\n\t\t\t\t\t$control__theme1: \"atomDark\",\n\t\t\t\t\t$control__fill: \"#111827\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextComponentInstanceClass,\n\t\t\t\t\tid: \"codeEmbed\",\n\t\t\t\t\tcomponent: \"codeBlock\",\n\t\t\t\t\tparent: \"<itemId>/<richTextVarId>\",\n\t\t\t\t\tposition: 2,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"codeEmbed\",\n\t\t\t\t\t$control__code: \"npm run dev\",\n\t\t\t\t\t$control__language: \"Shell\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"<richTextNodeId>\",\n\t\t\t\t\t\"componentPreset.codeBlock\": \"Shell Dark\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Remove the hover effect from the button\",\n\t\tdescription: \"Most effects can be removed by setting the effect to null\",\n\t\tcategory: [Category.Update, Category.Effect],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"button\",\n\t\t\t\t\thoverEffect: \"null\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add a heading with 'Hello' in red and 'World' in yellow\",\n\t\tdescription: `Use ${escapeValue(TextBlockClass)} and ${escapeValue(TextRunClass)} to apply different inline styles per word.`,\n\t\tcategory: [Category.Text, Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"heading\",\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb1\",\n\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\tparent: \"heading\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\ttext: \"Hello \",\n\t\t\t\t\tfontWeight: \"700\",\n\t\t\t\t\ttextColor: \"rgb(255, 0, 0)\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\ttext: \"World\",\n\t\t\t\t\tfontWeight: \"700\",\n\t\t\t\t\ttextColor: \"rgb(255, 221, 0)\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add a heading and a paragraph below it\",\n\t\tdescription: `Use multiple ${escapeValue(TextBlockClass)} nodes with different tags to create multi-paragraph rich text within a single ${escapeValue(ClassDiscriminator.RichTextNode)}.`,\n\t\tcategory: [Category.Text, Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"heading\",\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb1\",\n\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\tparent: \"heading\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\ttext: \"Welcome\",\n\t\t\t\t\tfontWeight: \"700\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb2\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tparent: \"heading\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\tparent: \"tb2\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\ttext: \"This is a paragraph of text below the heading.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Add a short paragraph with an inline line break after the first sentence\",\n\t\tdescription: `Use a ${escapeValue(TextLineBreakClass)} node for inline line breaks inside one paragraph instead of using newline characters.`,\n\t\tcategory: [Category.Text, Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"paragraph\",\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb1\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tparent: \"paragraph\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\ttext: \"First sentence.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextLineBreakClass,\n\t\t\t\t\tid: \"tr-break\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\ttext: \"Second sentence on a new line.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Write two paragraphs with whitespace between them\",\n\t\tdescription: `Use an empty ${escapeValue(TextBlockClass)} (containing only a ${escapeValue(TextLineBreakClass)}) between content ${escapeValue(TextBlockClass)} nodes to create visible vertical whitespace between paragraphs.`,\n\t\tcategory: [Category.Text, Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.RichTextNode,\n\t\t\t\t\tid: \"content\",\n\t\t\t\t\tparent: undefined,\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb1\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tparent: \"content\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\ttext: \"This is the first paragraph.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"spacer\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tparent: \"content\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextLineBreakClass,\n\t\t\t\t\tid: \"spacer-br\",\n\t\t\t\t\tparent: \"spacer\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextBlockClass,\n\t\t\t\t\tid: \"tb2\",\n\t\t\t\t\ttag: \"p\",\n\t\t\t\t\tparent: \"content\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\tparent: \"tb2\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\ttext: \"This is the second paragraph.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Make only the word Einstein red in this paragraph\",\n\t\tdescription: `When the user asks for an inline edit to one word, rewrite the existing ${escapeValue(TextRunClass)} in place: keep run order stable, split only at styling boundaries, and style just the inserted target run.`,\n\t\tcategory: [Category.Text, Category.Update],\n\t\tcontextTree: richTextNode.from,\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr1\",\n\t\t\t\t\ttext: \"Born in Ulm, Germany, \",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr-einstein\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr-einstein\",\n\t\t\t\t\ttext: \"Einstein\",\n\t\t\t\t\ttextColor: \"rgb(239, 68, 68)\",\n\t\t\t\t\tfontWeight: \"700\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: TextRunClass,\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\tparent: \"tb1\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"tr2\",\n\t\t\t\t\ttext: \" revolutionized modern physics.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create a layout template with a navigation and footer\",\n\t\tdescription: `Create the ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} and immediately create and ${commandReference(CommandType.Update)} its primary breakpoint ${escapeValue(ClassDiscriminator.FrameNode)} before setting layout-template properties or adding shared elements. The generated placeholder will occupy the page-content position, so place shared elements around it.`,\n\t\tcategory: [Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.LayoutTemplateNode,\n\t\t\t\t\tid: \"layout-template\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tname: \"Product Layout\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"layout-desktop\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"layout-template\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"layout-desktop\",\n\t\t\t\t\tfill: \"#ffffff\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"vertical\",\n\t\t\t\t\tstackDistribution: \"start\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\tgap: \"0px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"nav\",\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tparent: \"layout-desktop\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"nav\",\n\t\t\t\t\tname: \"Navigation\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"space-between\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"footer\",\n\t\t\t\t\tposition: 2,\n\t\t\t\t\tparent: \"layout-desktop\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"footer\",\n\t\t\t\t\tname: \"Footer\",\n\t\t\t\t\tlayout: \"stack\",\n\t\t\t\t\tstackDirection: \"horizontal\",\n\t\t\t\t\tstackDistribution: \"center\",\n\t\t\t\t\tstackAlignment: \"center\",\n\t\t\t\t\twidth: \"1fr\",\n\t\t\t\t\theight: \"auto\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tprompt: \"Create a features page\",\n\t\tdescription: `Create the ${escapeValue(ClassDiscriminator.WebPageNode)} and immediately create and ${commandReference(CommandType.Update)} its primary breakpoint ${escapeValue(ClassDiscriminator.FrameNode)} before adding any other page content.`,\n\t\tcategory: [Category.Create],\n\t\texpectedOutput: [\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.WebPageNode,\n\t\t\t\t\tid: \"features-page\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tname: \"Features\",\n\t\t\t\t\tpath: \"/features\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Add,\n\t\t\t\tattributes: {\n\t\t\t\t\tnode: ClassDiscriminator.FrameNode,\n\t\t\t\t\tid: \"features-root\",\n\t\t\t\t\tposition: undefined,\n\t\t\t\t\tparent: \"features-page\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: CommandType.Update,\n\t\t\t\tattributes: {\n\t\t\t\t\tid: \"features-root\",\n\t\t\t\t\tfill: \"#ffffff\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t},\n]\n\nfunction formatDslBlock(dsl: string, source: Source): string {\n\treturn forSource(source, {\n\t\t\"in-app\": formatProjectUpdateBlock(dsl),\n\t\tlocal: `${APPLY_AGENT_CHANGES_API_METHOD}(${JSON.stringify(dsl)}, { pagePath })`,\n\t})\n}\n\nfunction formatExpectedOutput(input: string | Command[] | (string | Command)[], source: Source): string {\n\tconst output: string[] = []\n\tconst pendingCommands: string[] = []\n\n\tfunction flush() {\n\t\tif (pendingCommands.length === 0) return\n\t\toutput.push(formatDslBlock(pendingCommands.join(\" \"), source))\n\t\tpendingCommands.length = 0\n\t}\n\n\tfor (const entry of input) {\n\t\tif (isString(entry)) {\n\t\t\tflush()\n\t\t\toutput.push(entry)\n\t\t\tcontinue\n\t\t}\n\n\t\tpendingCommands.push(commandToDSL(entry))\n\t}\n\n\tflush()\n\n\treturn join.linesFrom(output)\n}\n\nasync function buildCommands(example: Example, ctx: AgentContext, source: Source): Promise<string | undefined> {\n\tconst { expectedOutput, contextTree, targetTree } = example\n\tif (expectedOutput) {\n\t\tif (isArray(expectedOutput)) {\n\t\t\tif (expectedOutput.length === 0) return\n\t\t\treturn formatExpectedOutput(expectedOutput, source)\n\t\t}\n\n\t\tassert(targetTree, \"Target tree is required\")\n\n\t\tconst commands = expectedOutput(targetTree()).map(command => commandToDSL(command))\n\t\tif (commands.length === 0) return\n\t\treturn formatDslBlock(commands.join(\" \"), source)\n\t}\n\n\tif (!targetTree) return\n\n\tif (contextTree) {\n\t\tconst commands = await transformNodesToCommands(contextTree, targetTree(), ctx)\n\t\tif (commands.length === 0) return\n\t\treturn formatDslBlock(commands.join(\" \"), source)\n\t}\n\n\tconst string = await nodeToDSLCommands(targetTree(), null, ctx)\n\treturn formatDslBlock(string, source)\n}\n\n/*\n * TODO: maybe simplify to just\n * ```\n<user-selection>\n# Selection Scope\n{scope context JSON}\n# Selection Nodes\n[nodes JSON]\n</user-selection>\n```\n(literally - so without an actual example content, just the structure)\n */\nasync function createExampleContextMessage(\n\tcontextTree: CanvasNode,\n\tctx: AgentContext,\n\tsource: Source,\n): Promise<string> {\n\tconst selectedNode = contextTree.cloneWithIds()\n\tif (isScopeNode(selectedNode)) {\n\t\tctx.treeStore.tree.insertNode(selectedNode)\n\t} else {\n\t\tctx.treeStore.tree.insertNode(selectedNode, ctx.scopeNode.id)\n\t}\n\tctx.treeStore.tree = ctx.treeStore.tree.commit(ctx.componentLoader)\n\tconst node = ctx.treeStore.tree.get(selectedNode.id)\n\tassert(node, \"Expected inserted example context node\")\n\treturn forSource(source, {\n\t\t\"in-app\": await createSelectedNodesContextMessage(new Map([[node.id, false]]), ctx),\n\t\tlocal: JSON.stringify(await transformToAiNode([node], ctx)),\n\t})\n}\n\nasync function buildExampleOutput(example: Example, source: Source) {\n\tconst {\n\t\tprompt,\n\t\tcategory,\n\t\tcontextTree,\n\t\tincludeTreeInPrompt = false,\n\t\tcontextImages,\n\t\tdescription,\n\t\texpectedNativeToolCalls = emptyArray(),\n\t} = example\n\t// Make the ids stable.\n\tconst ids = { scopeId: \"scope-id\", primaryVariantId: \"primary-variant-id\" }\n\tconst exampleCtx = !example.ctx ? undefined : isFunction(example.ctx) ? await example.ctx() : example.ctx\n\tconst ctx = AgentContext.createForTest(exampleCtx, undefined, ids)\n\tconst commands = await buildCommands(example, ctx, source)\n\tconst resolvedDescription = typeof description === \"function\" ? description(source) : description\n\n\treturn join.lines(\n\t\t`${AgentSystemPromptDictionary.ExamplePrompt}: \"${prompt}\".`,\n\t\t`Category: ${category?.join(\", \")}`,\n\t\tresolvedDescription && `Example Explanation: \"${resolvedDescription}\".`,\n\t\tincludeTreeInPrompt &&\n\t\t\tcontextTree &&\n\t\t\t`Example Context: ${escapeBlock(await createExampleContextMessage(contextTree, ctx, source))}`,\n\t\tcontextImages &&\n\t\t\t`Example Images: <${Files.imageMetadataTag}>${JSON.stringify(contextImages)}</${Files.imageMetadataTag}>`,\n\t\tcommands ? `Expected Output: ${commands}` : \"\",\n\t\tsource.prompt === \"in-app\" && expectedNativeToolCalls.length > 0\n\t\t\t? `Expected Native Tool/Function Calls: ${expectedNativeToolCalls.join(\"\\n\")}`\n\t\t\t: \"\",\n\t)\n}\n\n// @TODO: In the future filter out unnecessary categories of examples.\nexport async function buildCoreExamples(source: Source) {\n\tconst applicable = examples(source).filter(\n\t\texample => example.onlyFor === undefined || example.onlyFor === source.prompt,\n\t)\n\t// @TODO: Build examples with the real context.\n\tconst lines = await Promise.all(\n\t\tapplicable.map(async example => join.lines(`---`, await buildExampleOutput(example, source))),\n\t)\n\n\treturn join.linesFrom(lines)\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { serializeVirtualMetadata } from \"../context/nodes.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource, scriptReference } from \"./promptEnv.ts\"\nimport { commandReference, escapeValue, traitReference, traitValueReference } from \"./utils.ts\"\n\nexport function buildCorePrinciples(source: Source) {\n\treturn [\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`**If the initial request includes ${escapeValue(`<${metadataTags.selectedNodeIds}>`)}:** always lookup the full nodes with ${scriptReference(source)}.`,\n\t\t\t\t`**If the request references elements not visible in ${escapeValue(`<${metadataTags.selectedNodes}>`)}** (e.g. \"the title\", \"the parent\", \"the card\"), use ${scriptReference(source)} to fetch the surrounding context via ${serializeVirtualMetadata(\"$groundNodeId\")}, ${serializeVirtualMetadata(\"$scopeId\")}, or ${serializeVirtualMetadata(\"$parentId\")} before making changes.`,\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\t`**No fake success:** Never imply you completed an action, applied a change, reviewed a result, or used a capability unless it actually happened. If a request is unsupported, blocked, or outside your capabilities, say that plainly instead of pretending it worked.`,\n\t\t`**Always precisely reference IDs from the context:** ${forSource(source, {\n\t\t\t\"in-app\": `IDs in ${escapeValue(`<${metadataTags.selectedNodes}>`)}`,\n\t\t\tlocal: `IDs returned from ${escapeValue(\"readProjectForAgent\")}`,\n\t\t})} must be referenced exactly as provided. E.g. if the id of the node in the context is ${escapeValue(\"C5I7YkNuC\")}, you must reference it as ${escapeValue(\"C5I7YkNuC\")} in your output.`,\n\t\t`**Escape quotes in attribute values:** Attribute values are delimited by double quotes. If the value itself contains a double quote, escape it with a backslash (${escapeValue('\\\\\"')}). Never emit unescaped nested quotes like ${escapeValue('text=\"\"hello\"\"')}; instead write ${escapeValue('text=\"\\\\\"hello\\\\\"\"')}.`,\n\t\t`**Determinism first:** Prefer stacks or grids over absolute positioning and stick to the available attributes.`,\n\t\t`**Container setup comes first:** Before inserting new or dynamic content into an existing breakpoint/frame/container, ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": `first emit a ${escapeValue(PROJECT_UPDATE_LABEL)} block that configures`,\n\t\t\t\tlocal: `first configure (via ${escapeValue(`${APPLY_AGENT_CHANGES_API_METHOD}(dsl, { pagePath })`)})`,\n\t\t\t},\n\t\t)} the target container's ${traitReference(\"layout\")} and purpose-driven axis sizing/direction.`,\n\t\t`**Section max-width:** When creating a ${escapeValue(\"FrameNode\")} that is a direct child of the breakpoint using a fill-width ${traitReference(\"width\")} setting (such as ${traitValueReference(\"width\", \"100%\")} or ${traitValueReference(\"width\", \"1fr\")}), always include ${traitReference(\"maxWidth\")} (e.g. ${traitValueReference(\"maxWidth\", \"1080px\")}) in the same ${escapeValue(\"SET\")} command \u2014 unless the layout is full-bleed or the user explicitly requested edge-to-edge. Do not set ${traitReference(\"maxWidth\")} on the breakpoint node itself. Horizontal ${traitReference(\"padding\")} alone is NOT a substitute: a section with only padding still spans the full viewport width on large screens.`,\n\t\t`**Semantic structure:** IDs and names describe purpose (e.g., ${escapeValue(\"cta-button\")}, ${escapeValue(\"user-profile\")}).`,\n\t\t`**Named layouts:** Every container includes a descriptive ${traitReference(\"name\")} leave it blank or generic.`,\n\t\t// `**Respect the provided root:** Metadata or explicit instructions will name the root page/frame you must use. Unless you are explicitly ordered to create a new page, component, or design page, never emit \\`+PAGE\\`, \\`+COMPONENT\\`, \\`+DESIGN_PAGE\\`, or any other root-creation command\u2014build inside the supplied root. For detailed rules on root vs sections vs wrappers, follow **0c Authoritative Width Rules**.`,\n\t\t// `**DRY styles:** Use \\`=style\\` only when an attribute set appears **3 or more times**. For 1\u20132 repeats, keep attributes inline. Fewer lines wins.`,\n\t\t`**Strict spacing discipline:** Parents control sibling spacing with ${traitReference(\"gap\")}; ${traitReference(\"padding\")} only controls the internal padding of the container.`,\n\t\t`**Height sizing for spacing adjustments:** When adjusting padding or spacing on container children, set ${traitValueReference(\"height\", \"auto\")} so the element sizes to its content plus padding. Never recalculate fixed heights\u2014let auto-sizing handle the adjustment.`,\n\t\t`**Compact controls:** Buttons, pills, badges use ${traitValueReference(\"width\", \"auto\")} on both wrapper and label unless the design explicitly stretches them.`,\n\t\t`**Universal padding rule:** Text nodes cannot have padding\u2014only their parent containers can. **Never set ${traitReference(\"padding\")} on ${commandReference(CommandType.Add, ClassDiscriminator.RichTextNode)} nodes under any circumstances.** The **outermost visible container** whose edges are visually relevant (sections, cards, buttons, wrappers with visible boundaries) must have horizontal padding when it contains text. Inner layout-only frames (purely structural, no visual edge) don't need padding. When creating a container with visible edges that will hold text, immediately add both horizontal padding (never only vertical padding). Text flush with visible container edges is always wrong.`,\n\t\t// `**Typographic hierarchy:** Match the weight you see. Headings and CTA labels usually live at ${traitValueReference(\"fontWeight\", \"600-800\")}, navigation and badges at ${traitValueReference(\"fontWeight\", \"500-600\")}, body copy around ${traitValueReference(\"fontWeight\", \"400\")}, and light captions can drop to ${traitValueReference(\"fontWeight\", \"300\")}. Set ${traitReference(\"fontWeight\")} explicitly on every style instead of defaulting everything to one weight.`,\n\t\t// `**Text contrast rule:** Set \\`fc\\` only when inherited color would fail contrast (dark-on-dark or light-on-light). Otherwise skip it.`,\n\t\t`**Fill inheritance:** When ${traitValueReference(\"fill\", \"null\")} is set (or fill is omitted), the node is transparent and children visually appear on top of the parent's fill. Do NOT set a fill on containers that should remain transparent\u2014only set ${traitReference(\"fill\")} when the node needs its own distinct background color.`,\n\t\t// `**Scope discipline:** After creating any \\`+PAGE\\`, \\`+COMPONENT\\`, \\`+DESIGN_PAGE\\`, or component root, target it by that ID for subsequent \\`~\\` updates\u2014never keep the prompt's context identifier.`,\n\t\t// `**Root layout assurance:** Never mutate \\`+PAGE\\` or \\`+COMPONENT\\` width after creation.`,\n\t\t`**Vertical text prevention:** To prevent single-character wrapping, ensure multi-line text has sufficient horizontal space. Use ${traitValueReference(\"width\", \"100%\")} inside bounded containers (cards, sections) rather than narrow fixed widths or ${traitValueReference(\"width\", \"auto\")} for multi-line text.`,\n\t\t`**Border fidelity:** Apply ${traitReference(\"border\")} to the node that visually owns the stroke. Measure the thickness (usually 1px), capture the style (\\`solid\\`, \\`dashed\\`, etc.), and sample the color.`,\n\t\t`**Surface hierarchy:** Mirror layered surfaces with the correct ${traitReference(\"fill\")} value and pair with the matching ${traitReference(\"border\")} or separator so edges match the reference.`,\n\t\t// `**Visible insertions:** Before appending new sections or cards to a provided root or any existing frame, inspect that parent's layout direction. Vertical stacks must free the height axis (bump the measured ${escapeValue(\"height\")} or use ${keyValueReference(\"height\", \"auto\")}/${keyValueReference(\"height\", \"1fr\")}); horizontal stacks must free the width axis (increase ${escapeValue(\"width\")} or use ${keyValueReference(\"width\", \"auto\")}/${keyValueReference(\"width\", \"1fr\")}) so the new children render on-canvas instead of being clipped.`,\n\t\t// `**Single text ownership:** Continuous copy (paragraphs, tweets, testimonials, multi-line quotes, article bodies) must live in exactly one \\`+TEXT\\` node\u2014never split semantic text blocks across multiple text nodes or wrapper frames. Multi-paragraph tweets, blog posts, or testimonials are single text blocks. Use the append syntax (\\`>nodeId \"text\" [attr val]\\`) to add inline styled spans (mentions, emphasis, links) within that text. To modify text with nested styles, use \\`~textNodeId text \"first part\"\\` to reset the content, then append remaining segments (see \"${TEXT_EDIT_EXAMPLE_NAME}\" example). Only create separate text nodes when content is structurally distinct (heading vs body, label vs description).`,\n\t\t// `**Text truncation:** When card titles, list items, or table cells show ellipsis (\"...\") for overflow text, use \\`ttl 1\\` for single-line truncation. The system auto-applies \\`ov clip\\`, \\`mx 100%\\`, and \\`mn 50px\\` when \\`ttl\\` is set\u2014**do NOT set these attributes explicitly when using \\`ttl\\`**.`,\n\t\t`**Z-index layering:** Use it strictly when elements overlap and natural stacking fails. Typical tiering: decorative glows/gradients stay at ${traitValueReference(\"zIndex\", \"0\")}, hero/editor mockups or other foreground cards use ${traitValueReference(\"zIndex\", \"1\")}, sticky headers/toolbars live around ${traitValueReference(\"zIndex\", \"5\")}, dropdowns/overlays sit near ${traitValueReference(\"zIndex\", \"8\")}, and modals or top-most shells use ${traitValueReference(\"zIndex\", \"9-10\")}. Keep glows at ${traitValueReference(\"zIndex\", \"0\")} so they remain visible and bump the foreground preview to ${traitValueReference(\"zIndex\", \"1\")} when needed; reserve ${traitValueReference(\"zIndex\", \"-1\")} for rare cases where a surface must tuck behind another visual while still visible. Skip ${traitReference(\"zIndex\")} entirely when the document order already renders the correct stacking.`,\n\t\t`**Overflow control:** Default is ${traitValueReference(\"overflow\", \"visible\")}. Use ${traitValueReference(\"overflow\", \"clip\")} to clip children (common for card images, rounded containers with content that shouldn't bleed). Use ${traitValueReference(\"overflow\", \"scroll\")} or ${traitValueReference(\"overflowY\", \"scroll\")} for scrollable containers (chat messages, long content areas, mobile menus). Use ${traitValueReference(\"overflowX\", \"hidden\")} ${traitValueReference(\"overflowY\", \"scroll\")} for vertical-only scrolling. Pair scrollable containers with explicit height constraints (${traitValueReference(\"height\", \"400px\")} or ${traitValueReference(\"height\", \"600px\")}) so overflow triggers correctly.`,\n\t\t`**Nodes default to auto-sizing:** When adding ${commandReference(CommandType.Add, ClassDiscriminator.RichTextNode)}, ${commandReference(CommandType.Add, \"ComponentInstanceNode\")}, or ${commandReference(CommandType.Add, \"IconNode\")}, you can omit ${traitReference(\"width\")} and ${traitReference(\"height\")} because they default to auto and will be automatically sized to fit their intrinsic content. Set explicit sizes when needed to match the design (e.g., resizing icons). Avoid guessing pixel widths when the design intent is unclear.`,\n\t\t`**Auto-sizing requires layout:** On ${escapeValue(\"FrameNode\")} nodes ${traitValueReference(\"width\", \"auto\")} and ${traitValueReference(\"height\", \"auto\")} only work when the node has ${traitValueReference(\"layout\", \"stack\")} or ${traitValueReference(\"layout\", \"grid\")} enabled. Never set auto-sizing on a ${escapeValue(\"FrameNode\")} without first enabling layout. Before inserting content into existing containers, free the primary axis based on layout purpose (vertical stack: ${traitValueReference(\"height\", \"auto\")} or ${traitValueReference(\"height\", \"1fr\")}; horizontal stack: ${traitValueReference(\"width\", \"auto\")} or ${traitValueReference(\"width\", \"1fr\")}). When preparing a selected or target page breakpoint, including blank breakpoints, set ${traitValueReference(\"layout\", \"stack\")} and ${traitValueReference(\"height\", \"auto\")} before inserting children. Emit this as the first setup command on that breakpoint (use ${traitValueReference(\"stackDirection\", \"vertical\")} unless the user explicitly requests horizontal).`,\n\t\t`**Breakpoint effect rule:** On page breakpoints, only ${traitReference(\"flowEffect\")} is allowed. Never set other effect attributes on a breakpoint.`,\n\t]\n}\n", "import { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { Components } from \"../context/components.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport { commandToDSL } from \"../nodeToDSLCommands.ts\"\nimport type { FormVariantsTraitAttributes } from \"../traits/formVariants.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { commandReference, escapeValue, keyValueReference } from \"./utils.ts\"\n\nexport const formRules = Markdown.section(\n\t\"Forms\",\n\t`- When creating a form, set ${keyValueReference(\"htmlTag\", \"form\")} on a ${escapeValue(ClassDiscriminator.FrameNode)} to make it a form container.`,\n\t`- Every form **requires** a submit button to function. Without one, the form cannot be submitted.`,\n\tMarkdown.section(\n\t\t\"Labels\",\n\t\t`- When adding labels to form inputs ensure the input and text are wrapped inside a ${escapeValue(ClassDiscriminator.FrameNode)} with ${keyValueReference(\"htmlTag\", \"label\")}`,\n\t),\n\tMarkdown.section(\n\t\t\"Form Submit Button\",\n\t\t`- The submit button MUST be a ${escapeValue(\"ComponentInstanceNode\")}.`,\n\t\t`- To create a working submit button, **always** follow these steps:`,\n\t\t`1. Create the button component: ${escapeValue(withoutPosition(commandToDSL({ type: CommandType.Add, attributes: { node: \"ComponentNode\", position: 0, id: \"<component-id>\", name: \"<Submit Button>\" } })))}`,\n\t\t`2. Add the primary variant: ${escapeValue(withoutPosition(commandToDSL({ type: CommandType.Add, attributes: { node: ClassDiscriminator.FrameNode, position: 0, id: \"<variant-id>\", parent: \"<component-id>\" } })))}`,\n\t\t`3. Style the variant: ${escapeValue(commandToDSL({ type: CommandType.Update, attributes: { id: \"<variant-id>\", htmlTag: \"button\", width: \"100%\", height: \"auto\" } }))} \u2014 style as appropriate.`,\n\t\t`4. Add button label: ${commandReference(CommandType.Add, ClassDiscriminator.RichTextNode)} inside the variant with a text variable.`,\n\t\t`5. Insert instance into the form: ${escapeValue(withoutPosition(commandToDSL({ type: CommandType.Add, attributes: { node: \"ComponentInstanceNode\", position: 0, id: \"<instance-id>\", parent: \"<form-id>\", component: \"<Submit Button>\" } })))}`,\n\t\t`6. Link to form: ${escapeValue(commandToDSL({ type: CommandType.Update, attributes: { id: \"<form-id>\", formSubmitButtonId: \"<instance-id>\" } }))}`,\n\t\t`- Place the submit button instance as the **last child** of the form, after all input nodes.`,\n\t\t`- If a suitable button component already exists in ${escapeValue(`<${Components.metadataTag}>`)}, skip steps 1\u20134 and insert an instance of that component instead.`,\n\t),\n\tMarkdown.section(\n\t\t\"Form Submit Button Variants\",\n\t\t`- Form submit button instances can be configured to change variant based on the form state.`,\n\t\t`- Assign variant ids to ${escapeValue<FormVariantsTraitAttributes>(\"formButtonSuccessVariant\")}, ${escapeValue<FormVariantsTraitAttributes>(\"formButtonPendingVariant\")}, ${escapeValue<FormVariantsTraitAttributes>(\"formButtonErrorVariant\")}, and ${escapeValue<FormVariantsTraitAttributes>(\"formButtonIncompleteVariant\")} to configure the variant that shows for each state.`,\n\t\t`- The variant id must point to a valid variant of the source button component, if one does not exist then create it and style it as appropriate before assigning it to the form submit button instance.`,\n\t),\n\tMarkdown.section(\n\t\t\"Updating Existing Forms\",\n\t\t`- When an existing form already has ${escapeValue(\"formSubmitButtonId\")} set, modify the referenced button directly instead of creating a new one.`,\n\t\t`- If an existing form has no ${escapeValue(\"formSubmitButtonId\")}, follow the form submit button instructions.`,\n\t),\n)\n\nfunction withoutPosition(addCommand: string) {\n\treturn addCommand.replace(`position=\"0\" `, \"\")\n}\n", "import { Components } from \"../context/components.ts\"\nimport { VectorSets } from \"../context/vectors.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { createQuery } from \"../tools/readProject.ts\"\nimport { COMPONENT_DEFINITION_QUERY, ICON_SET_DEFINITION_QUERY } from \"../tools/readProjectQueryTypes.ts\"\nimport { READ_PROJECT_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { forSource, toolReference } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { commandReference, escapeValue } from \"./utils.ts\"\n\nexport function buildIconRules(source: Source) {\n\treturn `\n- **Before** adding or modifying any icon, including icon variables, the ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} for the relevant set **must** be in context \u2014 see ${AgentSystemPromptDictionary.ReadProject} for how to request it.\n- Never guess or infer icon control names. Only use exact control names reported in the ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} for that set.\n- If a user requests icons or an example recommends icons that are not available in any currently provided ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)}, request additional sets based on the most likely set name until you find an appropriate set.\n- All available icon sets are provided in the ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)} metadata tag.\n- Icons available in a set are provided in the ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} metadata tag OR in response to a ${toolReference(source, READ_PROJECT_TOOL_NAME)} query.\n- Each set has a unique name and properties (controls).\n- The ${escapeValue(\"$control__icon\")} control in ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} lists the available icons for the set as an ${escapeValue(\"options\")} array.\n- Always insert icons with ${commandReference(CommandType.Add, \"IconNode\")}. Never use text nodes with Unicode symbols (arrows, chevrons, etc.) as substitutes for icons, unless explicitly requested by the user.\n- Only modify ${escapeValue(\"ComponentInstanceNode\")} icons by setting ${escapeValue(\"$control__<property-name>\")} values.\n\nTo determine the set:\n- ${escapeValue(\"IconNode\")} will report their ${escapeValue(\"set\")} name.\n- ${escapeValue(\"ComponentInstanceNode\")} will report their ${escapeValue(\"component\")}.\n  - If a matching ${escapeValue(`<${Components.definitionTag}>`)} metadata tag is already present, inspect it first; otherwise use the component id from ${escapeValue(`<${Components.metadataTag}>`)} to request its controls via ${forSource(\n\t\tsource,\n\t\t{\n\t\t\t\"in-app\": `${escapeValue(READ_PROJECT_TOOL_NAME)} with ${escapeValue(JSON.stringify({ queries: [createQuery({ type: COMPONENT_DEFINITION_QUERY, id: \"<component-id>\" })] }))}`,\n\t\t\tlocal: escapeValue(\n\t\t\t\t`readProjectForAgent(${JSON.stringify([createQuery({ type: COMPONENT_DEFINITION_QUERY, id: \"<component-id>\" })])}, { pagePath })`,\n\t\t\t),\n\t\t},\n\t)}.\n  - Any icon controls (${escapeValue('type: \"icon\"')}) in ${escapeValue(`<${Components.definitionTag}>`)} report their ${escapeValue(\"set\")} name in the ${escapeValue(\"$control__*\")} definition.\n  - If the matching ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} is not already in context, request it via ${forSource(\n\t\tsource,\n\t\t{\n\t\t\t\"in-app\": `${escapeValue(READ_PROJECT_TOOL_NAME)} with ${escapeValue(JSON.stringify({ queries: [{ type: ICON_SET_DEFINITION_QUERY, name: \"<set-name>\" }] }))}`,\n\t\t\tlocal: escapeValue(\n\t\t\t\t`readProjectForAgent(${JSON.stringify([{ type: ICON_SET_DEFINITION_QUERY, name: \"<set-name>\" }])}, { pagePath })`,\n\t\t\t),\n\t\t},\n\t)} before choosing an icon value.\n\nUse the set name to determine the options for the control. You must only use exact option names from the set as values.\n\n**Example:**\nGiven the following icon sets:\n${escapeValue(`<${VectorSets.iconSetDefinitionTag} name=\"Phosphor\">[\n    {\"controls\":{\"$control__icon\":{\"type\":\"icon\",\"options\":[\"Magician\",\"Magic\",\"Dog\"]}}}\n]</${VectorSets.iconSetDefinitionTag}>`)}\n${escapeValue(`<${VectorSets.iconSetDefinitionTag} name=\"Feather\">[\n    {\"controls\":{\"$control__icon\":{\"type\":\"icon\",\"options\":[\"Wand\",\"Spell\",\"Sparkle\"]}}}\n]</${VectorSets.iconSetDefinitionTag}>`)}\n\nGiven the following nodes:\n${escapeValue(`<nodes>[\n    {\"id\":\"SPIKUwW6V\",\"type\":\"IconNode\",\"set\":\"Phosphor\", attributes: { \"$control__icon\": \"Magician\" } },\n    {\"id\":\"Fsv4z9bqn\",\"type\":\"IconNode\",\"set\":\"Feather\", attributes: { \"$control__icon\": \"Wand\" } },\n    {\"id\":\"JepchbE0C\",\"type\":\"IconNode\",\"set\":\"Phosphor\", attributes: { \"$control__icon\": \"Magic\" } },\n]</nodes>`)}\n\n${escapeValue(\"SPIKUwW6V\")}, and ${escapeValue(\"JepchbE0C\")} can receive ${escapeValue(\"$control__icon\")} values of ${escapeValue(\"Magician\")}, ${escapeValue(\"Magic\")}, and ${escapeValue(\"Dog\")}.\n${escapeValue(\"Fsv4z9bqn\")} can receive ${escapeValue(\"$control__icon\")} values of ${escapeValue(\"Wand\")}, ${escapeValue(\"Spell\")}, and ${escapeValue(\"Sparkle\")}.\n\n**Icon Node Size:**\n- Icons report their intrinsic size in the ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} metadata tag.\n- By default, insert icons with a width and height of ${escapeValue(\"auto\")}.\n- Only when the size needs to be different than the intrinsic size, set *either* the width or height to the necessary value, allow the opposing dimension to automatically resize based on the intrinsic aspect ratio.\n`\n}\n", "import type { Source } from \"../source.ts\"\n\nexport function canUseChecklistTools(source: Source): boolean {\n\treturn source.agent === \"app\" || source.agent === \"user-agent\"\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { DESIGN_PLAN_LABEL, PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport type { Source } from \"../source.ts\"\nimport { canUseChecklistTools } from \"../tools/checklistPolicy.ts\"\nimport { CHECKLIST_COMPLETE_TASK_TOOL_NAME, CHECKLIST_CREATE_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { Markdown, type MarkdownBlock } from \"./markdown.ts\"\nimport { forSource } from \"./promptEnv.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nexport function buildChecklistResponseRhythm(source: Source): readonly string[] {\n\tif (!canUseChecklistTools(source)) return []\n\n\treturn [\n\t\t`- For large page builds and other complex work, use ${escapeValue(CHECKLIST_CREATE_TOOL_NAME)} to create a private task checklist before implementation.`,\n\t\t`- When working from a checklist, focus only on the current available task and call ${escapeValue(CHECKLIST_COMPLETE_TASK_TOOL_NAME)} after finishing and reviewing meaningful edits.`,\n\t]\n}\n\nexport function buildChecklistCommunicationRules(source: Source): readonly string[] {\n\tif (!canUseChecklistTools(source)) return []\n\n\treturn [\n\t\t`Never mention checklist bookkeeping in plain text. Do not say things like ${escapeValue(\"completing tasks\")}, ${escapeValue(\"marking tasks complete\")}, ${escapeValue(\"moving to the next task\")}, or refer to ${escapeValue(CHECKLIST_CREATE_TOOL_NAME)} / ${escapeValue(CHECKLIST_COMPLETE_TASK_TOOL_NAME)} mechanics outside reasoning or tool calls.`,\n\t]\n}\n\nexport function buildChecklistPlanRules(source: Source): readonly string[] {\n\tif (!canUseChecklistTools(source)) return []\n\n\treturn forSource(source, {\n\t\t\"in-app\": [\n\t\t\t`- For large page builds, multi-page work, complex components, responsive variants, interaction states, broad visual changes, style analysis, or any request where splitting the work reduces forgotten requirements, call ${escapeValue(CHECKLIST_CREATE_TOOL_NAME)} after the ${escapeValue(DESIGN_PLAN_LABEL)} block and before any ${escapeValue(PROJECT_UPDATE_LABEL)} block.`,\n\t\t\t`- When you use ${escapeValue(CHECKLIST_CREATE_TOOL_NAME)}, create one checklist for the request, then work from that checklist instead of re-planning every task.`,\n\t\t],\n\t\tlocal: emptyArray<string>(),\n\t})\n}\n\nexport function buildChecklistImplementationRules(source: Source): readonly string[] {\n\tif (!canUseChecklistTools(source)) return []\n\n\treturn forSource(source, {\n\t\t\"in-app\": [\n\t\t\t`- When working from a ${escapeValue(CHECKLIST_CREATE_TOOL_NAME)} result, work on one available task at a time. If the task is analysis/context gathering, make the smallest read needed and then complete it. If the task changes the project, review meaningful edits, then call ${escapeValue(CHECKLIST_COMPLETE_TASK_TOOL_NAME)} before moving to another task.`,\n\t\t],\n\t\tlocal: emptyArray<string>(),\n\t})\n}\n\nfunction buildChecklistCreateToolPrompt() {\n\treturn Markdown.section(\n\t\tCHECKLIST_CREATE_TOOL_NAME,\n\t\t`${escapeValue(CHECKLIST_CREATE_TOOL_NAME)} creates a private task checklist with dependencies to split large work into focused chunks.`,\n\t\t`- Use it for large page builds, multi-page work, complex components, responsive variants, interaction states, broad visual changes, style analysis, or any request where splitting the work reduces forgotten requirements.`,\n\t\t`- In creation strategy, call it after the ${escapeValue(DESIGN_PLAN_LABEL)} block and before implementation.`,\n\t\t`- Prefer more small tasks over broad bucket tasks. Split by focused analysis needs, visible sections, component base structure, interactions, variants, breakpoints, and page regions so each task can be handled in a small focused pass.`,\n\t\t`- Each task requires a stable short ${escapeValue(\"id\")} and a very short ${escapeValue(\"title\")}. Use optional ${escapeValue(\"description\")} for task-local scope, constraints, and non-goals.`,\n\t\t`- Tasks are not limited to implementation. Include focused analysis/context tasks when they directly unblock the work, such as ${escapeValue(\"analyze-project-styles\")}, inspecting existing component variants, or checking breakpoint structure. Avoid bookkeeping-only tasks and generic loading tasks.`,\n\t\t`- If a task assembles, places, or adapts something produced by another task, it must depend on that producer task.`,\n\t\t`- Component variant, interaction, and breakpoint tasks must depend on the base component task. Page or section composition tasks must depend on the components or variants they instantiate.`,\n\t\t`- Responsive adaptation tasks should be final tasks that depend on the completed base components, sections, and page composition.`,\n\t\t`- Use ${escapeValue(\"dependsOn\")} only for true constraints where one task cannot be completed before another. Do not use dependencies for preferred order.`,\n\t\t`- The tool returns ${escapeValue(\"availableTaskIds\")} and ${escapeValue(\"nextTaskId\")}. Work on one available task, perform the smallest reads or edits needed for that task, review meaningful edits when edits were made, then call ${escapeValue(CHECKLIST_COMPLETE_TASK_TOOL_NAME)}.`,\n\t)\n}\n\nfunction buildChecklistCompleteTaskToolPrompt() {\n\treturn Markdown.section(\n\t\tCHECKLIST_COMPLETE_TASK_TOOL_NAME,\n\t\t`${escapeValue(CHECKLIST_COMPLETE_TASK_TOOL_NAME)} marks one task from the current private checklist complete.`,\n\t\t`- Call it after finishing one focused task and reviewing meaningful edits when edits were made.`,\n\t\t`- Pass only the completed task's ${escapeValue(\"taskId\")}.`,\n\t\t`- If dependencies are incomplete, the tool will reject the completion and return the available task ids.`,\n\t\t`- After a successful completion, continue with the next available task instead of re-planning everything.`,\n\t)\n}\n\nexport function buildChecklistToolPrompts(source: Source): readonly MarkdownBlock[] {\n\tif (!canUseChecklistTools(source)) return emptyArray<MarkdownBlock>()\n\treturn [buildChecklistCreateToolPrompt(), buildChecklistCompleteTaskToolPrompt()]\n}\n", "export const implementationStrategySectionNames = {\n\timplementation: \"Implementation Strategy\",\n\tcreation: \"Creation Strategy\",\n\tdesignPlan: \"Design Plan\",\n} as const\n\nexport const creationStrategyPhaseLabels = {\n\tphase1: \"Phase 1\",\n\tphase2: \"Phase 2\",\n\tphase3: \"Phase 3\",\n} as const\n\nexport const creationStrategyPhaseNames = {\n\tphase1: `${creationStrategyPhaseLabels.phase1}: Capture creative direction`,\n\tphase2: `${creationStrategyPhaseLabels.phase2}: Create a design plan, then request appropriate fonts/guides`,\n\tphase3: `${creationStrategyPhaseLabels.phase3}: Finalize and implement request`,\n} as const\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { DESIGN_PLAN_LABEL, formatDesignPlanBlock, PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { Files } from \"../context/files.ts\"\nimport { ComponentNodeClass } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { createQuery } from \"../tools/readProject.ts\"\nimport { FONT_SEARCH_QUERY, SCREENSHOT_QUERY } from \"../tools/readProjectQueryTypes.ts\"\nimport {\n\tASK_CLARIFICATION_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n\tVIEW_IMAGE_TOOL_NAME,\n} from \"../tools/toolNames.ts\"\nimport { buildChecklistImplementationRules, buildChecklistPlanRules } from \"./checklist.ts\"\nimport {\n\tcreationStrategyPhaseLabels,\n\tcreationStrategyPhaseNames,\n\timplementationStrategySectionNames,\n} from \"./implementationNames.ts\"\nimport { Markdown, type MarkdownBlock } from \"./markdown.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource, scriptReference, toolReference } from \"./promptEnv.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { escapeBlock, escapeValue } from \"./utils.ts\"\n\nconst implementationDefinitions = [\n\t{\n\t\tname: \"Creative\",\n\t\tdescription:\n\t\t\t\"Interfaces that feel intentional, and a bit surprising, lean heavily into a clear aesthetic. Not safe average looking layouts and design patterns.\",\n\t},\n]\n\nexport enum ImplementationStrategy {\n\tCreation = \"creation\",\n\tEdit = \"edit\",\n\tRecreation = \"recreation\",\n}\n\nconst strategyClarificationQuestion =\n\t\"Do you want me to use existing styles observed in the project, or try something new?\"\n\nconst guides = Markdown.section(\n\t\"Guides\",\n\t`Guides are a markdown documents describing foundational building block for implementing common patterns in a Framer project.`,\n\t`- No matter what strategy you are using (\"${ImplementationStrategy.Creation}\", \"${ImplementationStrategy.Edit}\", \"${ImplementationStrategy.Recreation}\") always use relevant guides as the foundation for implementation.`,\n\t`- Never be conservative when determining which guides to load - load any relevant to the request.`,\n\t`- The available guides must be referenced by exact name as listed in the ${AgentSystemPromptDictionary.ImplementationGuidanceDocumentationIndex}.`,\n\t`- Guides are mix of prescriptive instructions AND structural starting points. Read each guide carefully to determine when its necessary to follow instructions precisely.`,\n\t`- Guides contain \\`\\`\\`example-json ... \\`\\`\\` examples showing prototypical/abstract/best-practice implementations. Carefully reference them to guide your implementation.`,\n\t`- Never assume a guide's example style presets, components, variables, collections, names, ids, or other structure exist in the project unless you've read them from the project or created them yourself.`,\n\t`- Never rebuild Guide examples 1:1 unless explicitly instructed to do so, always use them as a starting point to implement the user's requested design or achieve a new visual direction.`,\n\t`- All design rules in guides should supersede any rules inferred from other prompting. Resolve any overlap by referencing the guided outcome.`,\n\t`- Creativity based on the guide is encouraged - Guides are not exhaustive - design direction that is not explicitly documented as good or bad by the guide is perfectly acceptable.`,\n)\n\nconst designPlanFields = `Category: [chosen category]\nLayout: [primary layout pattern and main content anchoring]\nColor: [background direction, text tone, accent strategy]\nDensity: [chosen density and overall pacing]\nTypography:\n  - [headline treatment]\n  - [supporting text treatment]\nSections:\n  1. [opening / primary section]\n  2. [main supporting structure]\n  3. [additional section or detail system only if needed]\nVisual detail strategy:\n- [how accents, dividers, borders, or ornaments should be used]\n- [how supporting details should stay consistent with the overall direction]`\n\nfunction buildDesignPlan(source: Source) {\n\treturn Markdown.section(\n\t\timplementationStrategySectionNames.designPlan,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`Document your design plan inside a fenced markdown block whose opening fence is exactly ${escapeValue(`\\`\\`\\`${DESIGN_PLAN_LABEL}`)} and whose closing fence is a plain line containing only ${escapeValue(\"```\")}.`,\n\t\t\t\tformatDesignPlanBlock(designPlanFields),\n\t\t\t\t\"Treat the bracketed phrases in this example as placeholders to replace with concrete plan details, not text to copy verbatim.\",\n\t\t\t\t\"Keep the plan high level. Name only the sections, typography direction, and detail systems that are actually needed for the chosen category.\",\n\t\t\t\t`Text inside a ${escapeValue(DESIGN_PLAN_LABEL)} block is not subject to brevity rules - be as verbose as you need to be to communicate your design plan clearly.`,\n\t\t\t\t`Text inside a design plan block is private, and will not be shared with the user.`,\n\t\t\t],\n\t\t\tlocal: [\n\t\t\t\t`Write out a design plan in plain prose in your reply before any ${escapeValue(`${APPLY_AGENT_CHANGES_API_METHOD}(dsl, { pagePath })`)} call. Cover these fields:`,\n\t\t\t\tescapeBlock(designPlanFields),\n\t\t\t\t\"Treat the bracketed phrases as placeholders to replace with concrete plan details, not text to copy verbatim.\",\n\t\t\t\t\"Keep the plan high level. Name only the sections, typography direction, and detail systems that are actually needed for the chosen category.\",\n\t\t\t],\n\t\t}),\n\t)\n}\n\nconst layouts = Markdown.section(\n\t\"Layouts\",\n\t`- \"Narrow container layout\": The overall site structure places most content inside a centered, narrow max-width container as the dominant top-level pattern. It creates a focused, intimate composition with strong readability and minimal horizontal spread, making the page feel more personal and editorial. Sections should stay anchored to this narrow frame as the prevailing organizational principle, only occasionally allowing select elements to break wider for emphasis.`,\n\t`- \"Centered container layout\": The overall site structure places most content inside a centered container with a moderate max width as the dominant top-level pattern. It creates a familiar, balanced composition with consistent gutters and strong readability. Sections should stay anchored to this centered frame as the prevailing organizational principle, occasionally allowing images or backgrounds to bleed wider without breaking the main container rhythm.`,\n\t`- \"Text-first layout\": The overall site structure is driven primarily by typography, long-form reading rhythm, and restrained visual hierarchy as the dominant top-level pattern. It relies on a single main text column, limited font-size variation, and generous spacing instead of heavy visual modules. Sections should preserve this editorial, text-led composition as the prevailing organizational principle across the page.`,\n\t`- \"Edge-to-edge spacious layout\": The overall site structure uses large horizontal spans, wide margins, and generous negative space as the dominant top-level pattern. Content tends to sit near the left and right edges of the viewport, with large open areas in between creating calm and emphasis. Sections should maintain this expansive, airy composition as the prevailing organizational principle across the page.`,\n\t`- \"Full-bleed layout\": The overall site structure lets major sections, media, or backgrounds extend across the full viewport width as the dominant top-level pattern. Instead of feeling boxed into a central frame, content stretches outward to create immersion and scale. Sections should use this full-width composition as the prevailing organizational principle across the page, with internal alignment systems maintaining order.`,\n\t`- \"Left-aligned layout\": The overall site structure anchors content to a strong left edge as the dominant top-level pattern. Rather than centering major elements, it builds hierarchy through vertical stacking, indentation, and consistent left-edge alignment. Sections should follow this left-led composition as the prevailing organizational principle, creating a more direct and utilitarian feel.`,\n\t`- \"Sidebar layout\": The overall site structure pairs a persistent side column with a larger main content area as the dominant top-level pattern. The sidebar typically holds navigation, identity, filters, or supporting details, while the main area carries the primary content. Sections should maintain this sidebar-plus-content relationship as the prevailing organizational principle across the page.`,\n\t`- \"Two-column layout\": The overall site structure divides content into two primary vertical columns as the dominant top-level pattern. The columns may be balanced or slightly offset, but the key characteristic is that content is consistently organized side by side rather than in a single central stack. Sections should preserve this two-column composition as the prevailing organizational principle across the page.`,\n\t`- \"Split-screen layout\": The overall site structure divides the viewport into two strong side-by-side panels as the dominant top-level pattern. One side usually carries the main message while the other supports it with imagery, media, or secondary content. Sections should continue this side-by-side panel composition as the prevailing organizational principle, whether the split is equal or intentionally weighted.`,\n\t`- \"Grid / block layout\": The overall site structure organizes content into a clear modular grid of repeated blocks as the dominant top-level pattern. Rows and columns create a predictable system for placing self-contained content units with strong alignment, repeatability, and scannability. Sections should use this grid-based block composition as the prevailing organizational principle across the page.`,\n\t`- \"Masonry layout\": The overall site structure arranges content in stacked columns of uneven item heights as the dominant top-level pattern. Instead of forcing content into uniform rows, blocks flow naturally into available vertical space, creating a more organic and visually dense composition. Sections should use this staggered masonry structure as the prevailing organizational principle across the page.`,\n\t`- \"Asymmetric layout\": The overall site structure uses deliberately unequal proportions, offset placement, and visual imbalance as the dominant top-level pattern. One region typically carries more weight, scale, or density than another, creating tension and focus. Sections should embrace this off-center composition as the prevailing organizational principle across the page.`,\n\t`- \"Alternating layout\": The overall site structure moves content back and forth across the page as the dominant top-level pattern. Text and media alternate left and right between sections, creating a steady visual rhythm down the page. Sections should follow this alternating composition as the prevailing organizational principle to create variety without losing consistency.`,\n\t`- \"Intro-driven stacked layout\": The overall site structure leads with a dominant introductory section followed by a sequence of distinct full-width content sections as the dominant top-level pattern. Each section typically fills or nearly fills the viewport height, creating a strong vertical narrative rhythm. Sections should maintain this intro-first, block-by-block progression as the prevailing organizational principle across the page.`,\n\t`- \"Single-section layout\": The overall site structure fits all content within a single viewport-height section with no scroll or minimal scroll as the dominant top-level pattern. Common for teaser pages, launch announcements, link-in-bio pages, and minimal portfolios, it concentrates messaging into one focused frame. Sections should not exist as separate blocks \u2014 the entire page is one unified composition.`,\n\t`- \"Editorial / magazine layout\": The overall site structure combines multiple text and media modules in a dense editorial composition as the dominant top-level pattern. Large featured areas, smaller supporting blocks, varied column widths, and layered hierarchy work together to create a content-rich feel. Sections should use this editorial arrangement as the prevailing organizational principle across the page.`,\n)\n\nconst categoryGuidelines = Markdown.section(\n\t\"Category Aesthetic Guidelines\",\n\t`The site category must drive the visual vocabulary, section composition, and design patterns. Each category has a distinct design language \u2014 do not borrow patterns from other categories.`,\n\t`Use category guidance as a fallback after user intent is resolved, not as a substitute for user direction. A category can rule out inappropriate patterns, but it does not by itself decide the composition, color system, typographic character, media treatment, or interaction feel.`,\n\t`**Section naming matters.** The term \"hero\" implies a conversion-focused landing section and will bias the entire design toward product-marketing patterns (large display headlines, CTAs, stat blocks). Only use \"hero\" sections for SaaS/product pages where that pattern is appropriate. For all other categories, name the opening section after its actual role: \"Introduction\", \"Welcome\", \"Opening\", \"Cover\", etc.`,\n\t`**Interpret role/persona answers narrowly.** If the user specifies a profession, audience, or persona (e.g. developer, photographer, designer, founder), use that to shape the work examples, voice, and supporting content. Do not automatically turn it into a full visual trope package or section mandate. For example, \"developer\" can influence project selection and tone, but does not automatically justify GitHub stats, contribution graphs, terminal motifs, code tickers, or monospace-heavy treatment unless the user explicitly asks for them.`,\n\t`Use the descriptions below as guardrails when building the design plan; adapt them to the user's answers instead of treating them as a complete recipe:`,\n\t`- **Portfolio / personal**: The opening section is a personal introduction \u2014 a name, a role, and a sentence or two \u2014 set at a comfortable reading scale, not an oversized billboard. Expressiveness comes from typography choice, whitespace, and subtle details, not from text size. Focus on strong project imagery, carefully selected work samples, and a layout designed to highlight craft and individuality. Close with a simple contact/footer section or direct contact details, not a campaign-style CTA banner.`,\n\t`- **SaaS / product**: Big bold H1 with a clear value proposition, short supporting H2, product visuals or UI screenshots, strong primary and secondary CTAs, trust signals like logos or testimonials, and a conversion-focused page flow.`,\n\t`- **Editorial / blog**: Content-first layout with strong typography, clear article hierarchy, featured stories or post grid, categories or tags for discovery, generous reading space, and an interface optimized for long-form readability.`,\n\t`- **Agency / studio**: Bold headline with a clear positioning statement, service overview, featured case studies, distinct visual identity, team or culture elements, proof of expertise, and a prominent contact or discovery CTA.`,\n\t`- **Launch / coming-soon**: Single-message landing page with a strong teaser headline, short supporting copy, email signup or waitlist form, possible countdown or product preview, minimal navigation, and a focused sense of anticipation.`,\n\t`- **E-commerce**: Product-first layout with strong imagery, featured collections or categories, pricing and product details, filters or navigation for browsing, clear add-to-cart CTAs, promotional sections, and a smooth path to checkout.`,\n\t`If the category is not listed above, reason about what design patterns are native to that category and avoid borrowing patterns from unrelated categories.`,\n)\n\nconst densityGuidelines = Markdown.section(\n\t\"Density Guidelines\",\n\t`Density must materially change the plan.`,\n\t`- A spacious or minimal visual direction means fewer sections, fewer supporting modules, calmer typography scale, and more whitespace. Visual interest should come from composition, restraint, and editing \u2014 not from adding stats rows, tickers, badges, or extra informational strips.`,\n\t`- A content-rich or dense visual direction means more modules, tighter rhythm, and more visible supporting detail.`,\n\t`- When asking about content volume, use content-depth labels such as \"Brief essential sections\", \"Standard section depth\", and \"Detailed section coverage\". Keep labels about amount/depth only, not site type, page type, layout, or visual tone.`,\n)\n\nfunction buildPhase1(source: Source) {\n\treturn Markdown.section(\n\t\tcreationStrategyPhaseNames.phase1,\n\t\t`Before gathering fonts, guides, or starting implementation, evaluate whether the user's prompt and project context contain a clear enough creative brief to produce an impressive result.`,\n\t\t`Use clarification only for unresolved decisions that would materially change the canvas, user-visible structure, maintainability, or scope.`,\n\t\t`Do not use a fixed checklist or treat category, role, or broad style words as enough creative direction. Derive the next question from the request and project context, choosing the unresolved branch that would most change the specific result.`,\n\t\t`Prefer concrete design-control questions over generic vibe questions. Expose the visible choice the user is steering, such as composition, palette, typography, media treatment, motion/interaction, or detail strategy, only when that choice is still unresolved.`,\n\t\t`- Fast path: if the user's prompt already gives a concrete artifact and explicit creative, structural, and content direction for a non-generic design plan, do not use ${scriptReference(source)} or ${toolReference(source, READ_PROJECT_TOOL_NAME)} before the design plan, and do not ask clarification. \"Explicit\" means the user has directly specified the major visible choices; do not count choices you inferred from category guidance, broad style words, or your own preferred defaults. Continue directly to \"${creationStrategyPhaseLabels.phase2}\" unless the user asks to match or reuse existing project style, or the request is about creating, updating, or switching pages and must first follow \"${AgentSystemPromptDictionary.WorkingScope}\" page-routing rules. For explicit section or hero requests, keep the scope to that artifact and implement it after the design plan.`,\n\t\t`- For vague creation requests, including broad blank-site requests, center clarification rounds on visible design choices, not site taxonomy. Premise questions such as site category, product type, audience, role/persona, vibe/style, or content volume may be asked only when needed to make design options relevant, and should be paired with or followed by concrete design-control choices rather than forming an entire round by themselves. Good clarification questions expose implementation-shaping choices the user can steer: layout/composition, visual system, typography, palette, media/imagery, interaction, density, and detail strategy. Avoid generic \"vibe\" questions when a more concrete visual choice can express the same branch.`,\n\t\t`- Continue the discovery loop until the planned layout, visual system, density, and media/detail strategy are grounded in user answers or observed project context. Do not move to \"${creationStrategyPhaseLabels.phase2}\" when those choices would mainly come from category guidance, broad style words, or your preferred defaults.`,\n\t\t`- When asking clarification during creation phases, include ${escapeValue(\"decisionContext\")} to carry the current design decision branch forward: what branch is active, why it remains unresolved, and what part of the branch the questions will resolve. Use prior ${escapeValue(\"decisionContext\")} values and answers when choosing follow-ups when they are available.`,\n\t\t`- Follow-up questions should narrow within the selected branch, respect previous answers, and explicitly name the decision being resolved.`,\n\t\t`For missing names, subjects, or content, offer concrete defaults such as using the account name, hiding it for now, placeholder content, or a few plausible generated options.`,\n\t\t`Proceed to \"${creationStrategyPhaseLabels.phase2}\" once the user prompt, prior answers, or observed project context directly resolve a concrete, non-generic design plan: what will be built, why it fits the user's direction, and how the major visible choices show up on the canvas. Do not proceed merely because you can invent reasonable defaults for unresolved visible choices.`,\n\t\t`If direction is still under-specified, do not guess whether the project is blank:`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`- Honor \"${AgentSystemPromptDictionary.WorkingScope}\": after reading the sitemap, if the destination page is still unresolved, call ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)} before inspecting any pages for style or creative direction.`,\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\t`- First use ${scriptReference(source)} to read the sitemap and discover existing pages.`,\n\t\t`- The sitemap resolves routing and project-context availability; it does not resolve creative direction.`,\n\t\t`- If the site map shows no meaningful pages (or only boilerplate) and the brief is still under-specified, treat the project as blank and ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": `call ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)}`,\n\t\t\t\tlocal: \"ask clarification questions\",\n\t\t\t},\n\t\t)}.`,\n\t\t`- If there are meaningful pages, pick a very small, representative subset (typically the home page plus one or two interior pages) to inspect with ${scriptReference(source)}.`,\n\t\t`- Use ${escapeValue('\"attributeFilter\"')} for structural insight when needed, and request full attributes only for the specific nodes you need to resolve the remaining visible choices.`,\n\t\t`- Do not scan every page.`,\n\t\t`- Infer missing design decisions from what you observe, then treat inferred decisions as resolved and skip the corresponding questions.`,\n\t\t`After inspecting any existing project content (when present), if an important design decision still cannot be resolved from either the prompt or the project, ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": `call ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)}`,\n\t\t\t\tlocal: \"ask the user\",\n\t\t\t},\n\t\t)}. Choose only the questions for decisions that remain unresolved and would materially change the implementation.`,\n\t\t`- If a structural composition choice is genuinely the next unresolved decision, you may use the \"Layouts\" section as inspiration for answer descriptions, but adapt options to the request instead of defaulting to the list.`,\n\t\t`- You do not need to ask questions when the user has provided an image and has asked to make/recreate it - use the \"${ImplementationStrategy.Recreation}\" strategy.`,\n\t\t\"- Never front-load fonts or implementation guides in this phase.\",\n\t\t...forSource(source, {\n\t\t\t\"in-app\": emptyArray<MarkdownBlock>(),\n\t\t\tlocal: [\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"How to ask\",\n\t\t\t\t\t`Write the questions directly in your reply, then stop and wait for the user's answer before doing anything else. Format:`,\n\t\t\t\t\t`- Provide 2-4 vivid, mutually exclusive options per question (3-8 words each), plus an \"Other\" option so the user can give a free-text answer. Keep options parallel: every option should answer the same decision at the same level of abstraction.`,\n\t\t\t\t\t`- For content volume, prefer neutral labels like \"Brief essential sections\", \"Standard section depth\", and \"Detailed section coverage\"; do not use spacing, tone, or page-structure labels.`,\n\t\t\t\t\t`- Do not put implementation details in the options (no hex codes, no DSL syntax). When precision matters, attach a one-line description to the option.`,\n\t\t\t\t\t`- Limit yourself to 1-4 questions per round. Ask follow-up rounds only when they build on the user's previous answer and the current answers still do not support a concrete design plan. If the user skips a decision, use your best judgment for that one and don't re-ask.`,\n\t\t\t\t),\n\t\t\t],\n\t\t}),\n\t\tlayouts,\n\t\tcategoryGuidelines,\n\t\tdensityGuidelines,\n\t)\n}\n\nfunction buildPhase2(source: Source) {\n\treturn Markdown.section(\n\t\tcreationStrategyPhaseNames.phase2,\n\t\t`It is key to deliver a page that feels intentionally crafted for the chosen category. Visual detail should come from the right source for the brief \u2014 not automatically from larger type, more sections, or louder patterns.`,\n\t\t`- If \"${creationStrategyPhaseLabels.phase1}\" determined that the user's prompt is already a complete creative brief, emit a concise ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": escapeValue(DESIGN_PLAN_LABEL),\n\t\t\t\tlocal: \"design plan\",\n\t\t\t},\n\t\t)} before any tool calls, project reads, or implementation work.`,\n\t\t`- If the user provided answers to questions in \"${creationStrategyPhaseLabels.phase1}\", take the user's answers **literally** and implement them exactly as they are described. Don't use them merely as inspiration for a layout you already intended to implement.`,\n\t\t`- **Critical**: Plan from the resolved constraints. Let each answer influence the parts of the design it actually speaks to; do not inflate a single answer into unrelated section mandates, visual tropes, or implementation requirements.`,\n\t\t`- **Critical**: Carry every clarification answer into the plan according to its actual meaning. If previous answers still leave you unable to explain a concrete, non-generic design plan, return to ${creationStrategyPhaseLabels.phase1} and ask a focused clarification before implementation.`,\n\t\t`Finalize this step by documenting exactly one ${forSource(source, {\n\t\t\t\"in-app\": `${escapeValue(DESIGN_PLAN_LABEL)} block`,\n\t\t\tlocal: \"design plan\",\n\t\t})} before any ${forSource(source, {\n\t\t\t\"in-app\": `${escapeValue(PROJECT_UPDATE_LABEL)} block`,\n\t\t\tlocal: `${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call`,\n\t\t})}.`,\n\t\t...buildChecklistPlanRules(source),\n\t\t`After ${forSource(source, {\n\t\t\t\"in-app\": `closing the ${escapeValue(DESIGN_PLAN_LABEL)} block`,\n\t\t\tlocal: \"writing the design plan\",\n\t\t})}, continue the same ${forSource(source, {\n\t\t\t\"in-app\": \"turn\",\n\t\t\tlocal: \"reply\",\n\t\t})} through any needed font, icon set, or guide requests and then implementation.${forSource(source, {\n\t\t\t\"in-app\": \" Do not stop or summarize immediately after the plan.\",\n\t\t\tlocal: \"\",\n\t\t})}`,\n\t\t`- The design plan should document the resolved intent and the concrete implementation choices needed for this specific request. Include only the dimensions that matter for the chosen outcome, and explain them in terms of what will appear on the canvas.`,\n\t\t`- Expand the page only as far as the resolved brief naturally supports. Prefer fewer, stronger sections over filler. Do not force a fixed section count just to seem impressive.`,\n\t\t\"Requesting: The fonts you need to deliver a creative and considered implementation.\",\n\t\t// TODO: Revisit wording to ensure the LLM is able to pick fonts based on user requests inferring specific font style.\n\t\t`- Treat themed prompts as typography intent even if they do not explicitly mention fonts (e.g., \"design a wedding agency site\", \"playful kids app landing page\").`,\n\t\t\"- Build the font-search query from the refined plan and question answers at this point, not from the initial draft alone.\",\n\t\t// @TODO: Find a way to make prompting work to only request logos when necessary, but always use the other set for detail.\n\t\t`Requesting: 2 Icons Sets: ${escapeValue(\"Logos\")} + one additional set to use to enhance the visual detail of the page.`,\n\t\t`Requesting: The implementation guidance documents you need to implement the design with high-quality ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": escapeValue(PROJECT_UPDATE_LABEL),\n\t\t\t\tlocal: \"DSL\",\n\t\t\t},\n\t\t)} syntax and avoid common pitfalls.`,\n\t\t`- If the request references a list-like data source (e.g. \"blog\", \"articles\", \"products\"), **always** request the ${escapeValue(`\"CMS Collection Lists\"`)} implementation guide and use ${scriptReference(source)} to inspect CMS collections when they are not already in context.`,\n\t\t\"- Request fonts and guides only after refining the internal design direction; combining them in one follow-up call is allowed.\",\n\t\t`- After reading guides, ask clarification only if they reveal an unresolved user-visible design decision. Do not ask about purely technical guide details.`,\n\t\t`- If you ask a guide-informed follow-up after the ${forSource(source, {\n\t\t\t\"in-app\": `${escapeValue(DESIGN_PLAN_LABEL)} block`,\n\t\t\tlocal: \"design plan\",\n\t\t})}, treat the user's answer as an amendment to the existing plan and apply it before implementation. Do not emit a second ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": escapeValue(DESIGN_PLAN_LABEL),\n\t\t\t\tlocal: \"design plan\",\n\t\t\t},\n\t\t)}.`,\n\t)\n}\n\nfunction buildPhase3(source: Source) {\n\treturn Markdown.section(\n\t\tcreationStrategyPhaseNames.phase3,\n\t\t\"Use the design plan to guide the implementation of the request.\",\n\t\t\"- Critical: Ensure implementation consistency across sections\",\n\t\t\"- Determine the section types that should be composed together to create a full page: unless sections were explicitly and exhaustively requested, implement enough sections to make the page feel complete for the resolved brief, but do not add filler solely to increase count.\",\n\t\t\"- Derive section types from the chosen outcome, user answers, and project context instead of a fixed category template. Do not default to familiar marketing sections when the brief points somewhere more specific.\",\n\t\t`- For restrained / spacious briefs, prefer deleting weak supporting sections over inventing extra modules. A page can feel rich because the composition is strong, not because it has more boxes.`,\n\t\t'- Reminder: Do not limit yourself to conventional website sections. Typography-heavy \"open letters\", abstract color blocks, or large image galleries can add extra interest when they suit the category and do not read as filler.',\n\t\t`- Reminder: Always use an Icon Set **in addition** to the \"${escapeValue(\"Logos\")}\" set you chose in \"${creationStrategyPhaseLabels.phase2}\" to add visual detail to the page.`,\n\t\t`- Reminder: Use text to create visual interest and detail, but keep the tone native to the chosen category. For portfolio/personal pages, text should read as personal or editorial, not like product marketing or conversion copy.`,\n\t\t`- Default to solving full-page composition with typography, layout, icons, gradients, illustrations, and shape-based treatments. Do not assume every complete page needs photography.`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`- If the user explicitly asks for a gallery, photography, photo grid, editorial spread, or other photography-led experience, call ${escapeValue(QUERY_IMAGES_TOOL_NAME)} after planning and keep those images localized instead of spreading stock photos across the page.`,\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\t\"- While implementing each section, keep checking it against the design plan and correct drift when structure/style starts becoming generic.\",\n\t\t\"- Implement in deliberate stages while staying aligned to your plan.\",\n\t\t...buildChecklistImplementationRules(source),\n\t\t`- Pay close attention to the \"${AgentSystemPromptDictionary.ImplementAndReview}\" and \"Using Guides\" strategies.`,\n\t\t`- Review changes as you go${forSource(source, {\n\t\t\t\"in-app\": \"\",\n\t\t\tlocal: ` with ${toolReference(source, REVIEW_CHANGES_TOOL_NAME)}`,\n\t\t})} to ensure implementation is not diverging from the plan, but only after you have ${forSource(source, {\n\t\t\t\"in-app\": `emitted a ${escapeValue(PROJECT_UPDATE_LABEL)} block in the current turn`,\n\t\t\tlocal: `made at least one ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call in the current reply`,\n\t\t})}.`,\n\t)\n}\n\nfunction buildCreationStrategy(source: Source) {\n\treturn Markdown.section(\n\t\timplementationStrategySectionNames.creation,\n\t\t`Your execution must be broken down into the following phases:`,\n\t\tcreationStrategyPhaseNames.phase1,\n\t\tcreationStrategyPhaseNames.phase2,\n\t\tcreationStrategyPhaseNames.phase3,\n\t\tbuildPhase1(source),\n\t\tbuildPhase2(source),\n\t\tbuildPhase3(source),\n\t)\n}\n\nconst editStrategy = (source: Source) =>\n\tMarkdown.section(\n\t\t\"Edit Strategy\",\n\t\t`When working on an existing page, or adding to an existing site, implementation must be anchored on the existing content.`,\n\t\t`It is not acceptable to simply **use** the existing Components, Styles, and Colors (\"system\"), but instead you must also use them in the same way they are already used in the project.`,\n\t\t`- Only create new components when the existing ones do not fit the request - and can't be extended to fit the request.`,\n\t\t`- Text should always use any existing text styles and color tokens first - only creating new ones to fill gaps or on request.`,\n\t\t`- Icons should be selected from the existing icon set - preferring reusing the same icon names for similar semantic meanings.`,\n\t\t`- Color tokens should be reused whenever possible - the use-case for each color token should be carefully determined by understanding current uses - users will be disappointed to see a text color token used for a background.`,\n\t\t`- Spacing, flow, layout and alignment observed across the project should be maintained.`,\n\t\t`- If the project uses multiple Layout Templates, ensure the right Layout Template is applied to the page to ensure consistency by inspecting which pages use which Layout Template.`,\n\t\t`- Complete your implementation with a screenshot of the page you created. Ensuring that it is visually accurate to reference screenshots you took at the beginning. If they do not feel like they are part of the same cohesive design - then work to align your new page to the existing ones.`,\n\t\t`- Common Components should be reused whenever possible - for example, never make inline buttons with ${escapeValue(ClassDiscriminator.FrameNode)} if suitable Button ${escapeValue(ComponentNodeClass)} are already in the project - always try to use existing systems first.`,\n\t\t`- Always use **instances** of the existing system first.`,\n\t\t`- Never do a font-search unless explicitly requested. Only use the observed fonts in the reference pages. Use ${toolReference(source, SCRIPT_TOOL_NAME)} to reduce the used fonts on a page.`,\n\t\t`- Results of script analysis calls (${escapeValue(\"search\")}, ${escapeValue(\"extractDesignPatterns\")}, ${escapeValue(\"analyze\")}) should be treated as invariant design guidance. Do not deviate from the analysis.`,\n\t\t`While it is important to ground implementation in the existing system, it is not acceptable to modify the system to fit the request unless explicitly asked to do so - always make new system elements if a refactor is required.`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`If using the ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)} to narrow down ambiguous edit requests: don't focus on look and feel - derive these from the analysis.`,\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\tMarkdown.section(\n\t\t\t\"How To\",\n\t\t\t\"Figuring out what the core patterns are must be done in a token-efficient way.\",\n\t\t\t\"It is not acceptable to read every page to figure out the core patterns.\",\n\t\t\t\"Use the following approach:\",\n\t\t\t`1. Write a ${toolReference(source, SCRIPT_TOOL_NAME)} to get a filtered list of the relevant pages. The Homepage is a great starting point, but other pages may depend on the context.`,\n\t\t\t`- For example, '/blog' might be more relevant than '/contact' for a request that depends on listing content from the CMS.`,\n\t\t\t`2. Use ${toolReference(source, SCRIPT_TOOL_NAME)} and ${escapeValue(\"await api.extractDesignPatterns(nodes: Array<string | Node>)\")} to get a structured matrix of spacing, colors, components, radii, typography, surfaces, layout, and shadows patterns from the most relevant reference pages or sections.`,\n\t\t\t`- Critical: Analyze at least 3 (or max available) pages in a single api call to get a comprehensive understanding of the core patterns. Applied Layout Templates are automatically included in the analysis.`,\n\t\t\t`- Use the returned ${escapeValue(\"examples\")} ids to inspect or duplicate concrete examples before implementing from scratch.`,\n\t\t\t`- **Critical invariant**: Only use colors, tokens, and patterns that are present in the analysis. Resist the urge to use colors that are available in the project but unobserved in the analysis - absence from the analysis means the user has determined they are not suitable`,\n\t\t\t`- Never return script results for whole pages, whole collections, etc. focus on exactly what you need to know.`,\n\t\t\t`3. Take a screenshot of the reference pages to get a vision reference of the core patterns with ${toolReference(source, READ_PROJECT_TOOL_NAME)} ${escapeValue(JSON.stringify(createQuery({ type: SCREENSHOT_QUERY, id: \"<reference-page-id>\" } as const)))}.`,\n\t\t\t`- If you see elements that you think should be reused, find them using ${toolReference(source, SCRIPT_TOOL_NAME)} and ${escapeValue(`await api.search('<visual description of element from screenshot>', [\"<reference-page-id>\"])`)}, then use them as a reference for implementation.`,\n\t\t\t`4. Use ${toolReference(source, SCRIPT_TOOL_NAME)} and ${escapeValue(`await api.serialize(\"<example-id>\", { depth: <1-2>, ancestors: <1-2> })`)} to create a list of fragments to precisely implement from.`,\n\t\t\t`- You may want to find the node that implements a CMS repeater on a page and use that to inform your implementation of a new CMS repeater.`,\n\t\t\t`Use all 4 of these data sources to get a comprehensive understanding of the core patterns of the pages.`,\n\t\t),\n\t)\n\nconst recreationStrategy = Markdown.section(\n\t\"Recreation Strategy\",\n\t\"- Use this strategy when the user asks to recreate/match/copy an attached visual reference with high visual fidelity.\",\n\t\"- Prioritize structural accuracy first: infer hierarchy from macro to micro (sections -> containers -> groups -> leaf elements) before styling.\",\n\t\"- Infer parent-child structure from visual evidence (containment, shared bounds, alignment, and wrappers like backgrounds, borders, or cards).\",\n\t\"- Place elements relative to their parent first (padding for internal spacing, gap for sibling spacing), and use absolute positioning only for intentional overlap patterns.\",\n\t\"- Preserve spacing rhythm and proportions from the reference; do not normalize distinctive whitespace patterns.\",\n\t\"- Infer spacing proportions before picking exact values: estimate outer margins, section padding, and intra-group gaps as relative ratios, then preserve those ratios in reconstruction.\",\n\t\"- For prominent text in a reference, infer its visual anchor relative to the parent (top, centerline, bottom) and preserve that anchor; do not let edge controls (like bottom nav chips) drag headline placement to the bottom.\",\n\t\"- Reconstruct references with editable native properties unless the user explicitly asks to place their attached image as content.\",\n\t\"- Skip inspiration image search for pure recreation prompts; use the attached reference as the primary visual source of truth.\",\n\t\"- For recreation prompts that likely include text, infer typography from the reference and run font search before emitting text nodes.\",\n)\n\nfunction buildWorkingScope(source: Source) {\n\tconst localEditSubjects = forSource(source, {\n\t\t\"in-app\": \"For local edits to the selected section, element, component, code file, or collection\",\n\t\tlocal: \"For local edits to a specific element, component, code file, or collection identified in the request\",\n\t})\n\treturn Markdown.section(\n\t\tAgentSystemPromptDictionary.WorkingScope,\n\t\t\"Before implementing, decide where the work belongs: the current scope, another existing scope, or a new scope. This could be a web page, design page, component, code file, or CMS collection. Resolve the working scope before style, planning, or implementation reads.\",\n\t\t`- ${localEditSubjects}, stay in the active scope unless the user clearly points to a different target.`,\n\t\t`- For non-page requests, when the active scope metadata already resolves a current-scope design or creation request, do not use ${scriptReference(source)} or ${toolReference(source, READ_PROJECT_TOOL_NAME)} just to inspect or confirm that scope before design planning.`,\n\t\t`- If the request clearly targets another existing scope or a new scope, resolve that target before implementation. Use the minimum project reads needed to identify it.`,\n\t\tMarkdown.section(\n\t\t\t\"For Page Requests\",\n\t\t\t`- These rules apply only when the request is about creating, updating, or switching pages.`,\n\t\t\t`- Resolve the destination page before any $${scriptReference(source)} reads for style or planning.`,\n\t\t\t`- Treat explicit current-scope wording as current-page work (e.g. \"on this page\", \"add to the current page\", \"here\", \"turn this page into a pricing page\").`,\n\t\t\t`- Treat creation wording that names a page artifact as new-page intent (e.g. \"make me a pricing page\", \"create an about page\").`,\n\t\t\t`- Treat edit wording that names a page as existing-page intent (e.g. \"update the pricing page\", \"redesign the about page\", \"make the pricing page better\").`,\n\t\t\t`- For any request to create or update a page, first read the sitemap with ${scriptReference(source)} before deciding.`,\n\t\t\t\"Resolve page scope in this priority order after reading the sitemap: explicit current-page wording -> unresolved ambiguity that requires clarification -> existing-page edit intent -> new-page creation intent.\",\n\t\t\tforSource(source, {\n\t\t\t\t\"in-app\": `- Explicit current-page wording overrides similarly named sitemap pages. Stay in the active scope, and do not use ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)} merely because a similar page already exists.`,\n\t\t\t\tlocal: `- Explicit current-page wording overrides similarly named sitemap pages. Stay in the active scope; do not ask the user merely because a similar page already exists.`,\n\t\t\t}),\n\t\t\t`- If the request is already resolved as existing-page intent and exactly one plausible existing page matches, inspect it with ${scriptReference(source)} and implement there.`,\n\t\t\t`- For edit wording, inspect an existing page only when exactly one plausible sitemap match exists. If more than one plausible match exists, ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)} is mandatory`,\n\t\t\t\t\tlocal: \"resolve with the user\",\n\t\t\t\t},\n\t\t\t)} before planning, requesting fonts/guides, or implementation.`,\n\t\t\t`- If creation wording has no plausible sitemap match, create a new ${escapeValue(ClassDiscriminator.WebPageNode)} instead of appending to the active page.`,\n\t\t\t`- If creation wording collides with an existing same-name or near-match page, the destination is still unresolved even when there is exactly one existing match. ${forSource(\n\t\t\t\tsource,\n\t\t\t\t{\n\t\t\t\t\t\"in-app\": `Use ${toolReference(source, ASK_CLARIFICATION_TOOL_NAME)} immediately`,\n\t\t\t\t\tlocal: \"Confirm the target with the user\",\n\t\t\t\t},\n\t\t\t)} before any subsequent ${scriptReference(source)} reads, style inspection, or implementation.`,\n\t\t),\n\t)\n}\n\nconst determiningStrategy = Markdown.section(\n\t\"Determining Strategy\",\n\t\"A user request may require multiple strategies to handle discrete parts of the request.\",\n\t`Choose the \"${ImplementationStrategy.Recreation}\" strategy when:`,\n\t\"- The user explicitly asks to recreate/match/copy an attached or provided visual reference.\",\n\t\"- The user's priority is visual fidelity to an existing image or design.\",\n\t`Choose the \"${ImplementationStrategy.Creation}\" strategy when:`,\n\t\"- Blank project: The current page or existing pages are too sparse to infer a direction.\",\n\t\"- Explicitly asked: User's request is implying that they want to try a new theme, style or vibe.\",\n\t// TODO: More sophisticated of when to use edit strategy\n\t`Choose the \"${ImplementationStrategy.Edit}\" strategy when revising, or appending to existing pages or sections where preserving the established project direction is expected.`,\n\t`When none of the above apply, default to the \"${ImplementationStrategy.Edit}\" strategy.`,\n\t`When uncertain which strategy to use and you've exhausted all other options for determining the strategy, ask the user for clarification: ${escapeValue(strategyClarificationQuestion)}`,\n)\n\nfunction buildImplementAndReview(source: Source) {\n\tconst reviewRef = toolReference(source, REVIEW_CHANGES_TOOL_NAME)\n\tconst readProjectRef = toolReference(source, READ_PROJECT_TOOL_NAME)\n\treturn Markdown.section(\n\t\tAgentSystemPromptDictionary.ImplementAndReview,\n\t\t`To deliver production-ready results, you **must** alternate between implementing changes and reviewing them ${forSource(\n\t\t\tsource,\n\t\t\t{\n\t\t\t\t\"in-app\": \"when implementing changes in the current turn\",\n\t\t\t\tlocal: \"in the same reply\",\n\t\t\t},\n\t\t)}.`,\n\t\t`Only begin a review loop after you have ${forSource(source, {\n\t\t\t\"in-app\": `emitted at least one ${escapeValue(PROJECT_UPDATE_LABEL)} block in the current turn`,\n\t\t\tlocal: `made at least one ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call in the current reply`,\n\t\t})}.`,\n\t\t`Never start an implementation ${forSource(source, {\n\t\t\t\"in-app\": \"turn, or resume after read-only tool calls,\",\n\t\t\tlocal: \"reply\",\n\t\t})} with ${reviewRef}.`,\n\t\t`Review changes by calling ${reviewRef} **regularly** and carefully following the instructions it returns. Do so:`,\n\t\t`- **immediately** after each semantic structural section is implemented.`,\n\t\t`- **immediately** after creating a new Breakpoint or Variant.`,\n\t\t`Rule of Thumb: The more complex the change, the more frequently you should review the changes.`,\n\t\t`- Creating a Breakpoint is a complex change`,\n\t\t`- Creating a Variant is a complex change`,\n\t\t`- Creating an event-handler is a complex change`,\n\t\t`- Changing the color mode is a complex change`,\n\t\t`- Modifying a Breakpoint to be responsive is a complex change`,\n\t\t`**Critical**: Review changes not just to make sure they are applied, but that they **look good/make sense visually.**`,\n\t\t`**Regularly**: Interrupt your work to review changes.`,\n\t\t`Never conclude an implementation ${forSource(source, {\n\t\t\t\"in-app\": `turn that emitted ${escapeValue(PROJECT_UPDATE_LABEL)} blocks`,\n\t\t\tlocal: `reply that included ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} calls`,\n\t\t})} without at least one ${reviewRef} review of the changes made to the project.`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": emptyArray<MarkdownBlock>(),\n\t\t\tlocal: [\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"Visual Verification\",\n\t\t\t\t\t`After completing each page or major section, capture a screenshot via ${readProjectRef} with a ${escapeValue(`\"${SCREENSHOT_QUERY}\"`)} query that includes the target node ${escapeValue(\"id\")}.`,\n\t\t\t\t\t\"Use the screenshot to compare the rendered page against the intended design, then refine based on what you see before moving on.\",\n\t\t\t\t\t\"At minimum, screenshot once per page-scope.\",\n\t\t\t\t),\n\t\t\t],\n\t\t}),\n\t)\n}\n\nexport function buildImplementationStrategy(source: Source) {\n\treturn Markdown.section(\n\t\timplementationStrategySectionNames.implementation,\n\t\t`When implementing, there are three available strategies:`,\n\t\t`- use the \"${ImplementationStrategy.Recreation}\" strategy for image recreation requests where visual fidelity to a provided reference is the priority.`,\n\t\t`- use the \"${ImplementationStrategy.Creation}\" strategy for new pages, new sections or when specifically asked to try a new theme, style or vibe.`,\n\t\t`- use the \"${ImplementationStrategy.Edit}\" strategy when revising existing pages or sections, or adding new pages to sites that already have content.`,\n\t\t`Always analyze the user request and determine which strategy to use. A request may require multiple strategies.`,\n\t\t`All strategies should use the \"${AgentSystemPromptDictionary.ImplementationGuidanceDocumentation}\" as a foundation for how to translate design into production-ready web pages.`,\n\t\t`**CRITICAL RESET RULE**: If you have already implemented changes for a request and the user says they do not like the result (for example: \"I don't like it\", \"start over\", \"try again\"), first undo the changes you made for that request, then restart the implementation from scratch before making new design changes.`,\n\t\t`**CRITICAL**: Strategy priority differs by intent:`,\n\t\t`- \"${ImplementationStrategy.Recreation}\" strategy: maximize visual fidelity to the user's provided reference image; do not intentionally introduce \"surprising\" deviations from the reference.`,\n\t\t`- \"${ImplementationStrategy.Creation}\" and \"${ImplementationStrategy.Edit}\" strategies: be creative and aim to surprise the user, but match the level of complexity to the chosen category and density. Sophistication does not always mean more sections, larger headlines, or louder patterns \u2014 a restrained portfolio can impress through composition, typography, and editing just as a product page can impress through density and feature clarity.`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [buildWorkingScope(source)],\n\t\t\tlocal: emptyArray<MarkdownBlock>(),\n\t\t}),\n\t\tbuildCreationStrategy(source),\n\t\teditStrategy(source),\n\t\trecreationStrategy,\n\t\tdeterminingStrategy,\n\t\tbuildDesignPlan(source),\n\t\tguides,\n\t\tMarkdown.section(\n\t\t\t\"Requesting Fonts\",\n\t\t\t`Use the ${escapeValue(FONT_SEARCH_QUERY)} rules in the \"Tools\" section as the source of truth for when and how to query fonts.`,\n\t\t\t`Before emitting text nodes, make all required font queries for style-fidelity prompts (especially recreation and themed prompts).`,\n\t\t),\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\tMarkdown.section(\n\t\t\t\t\t\"Attached Images\",\n\t\t\t\t\t`- Attached user images appear as exact URLs in ${escapeValue(`<${Files.imageMetadataTag}>...</${Files.imageMetadataTag}>`)} metadata.`,\n\t\t\t\t\t`- Do not modify the image url in your response, use them exactly as provided in the <${Files.imageMetadataTag}> metadata.`,\n\t\t\t\t\t`- Use attached image URLs directly when the user asks to place images, add images to CMS, swap images into fills, build galleries, cards, portraits, backgrounds, media grids, or otherwise use the images as content.`,\n\t\t\t\t\t`- If the user asks to use multiple attached images without a visual sorting/filtering/selection criterion, use the attachment order instead of inspecting them.`,\n\t\t\t\t\t...(source.agent === \"app\" || source.agent === \"api\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t`- Only call ${escapeValue(VIEW_IMAGE_TOOL_NAME)} when the requested outcome depends on visual judgment: recreate or match a reference, classify, sort, filter, compare, choose by appearance, critique, extract visible details, or answer questions about what is shown.`,\n\t\t\t\t\t\t\t\t`- If only some images need visual judgment, call ${escapeValue(VIEW_IMAGE_TOOL_NAME)} only for that subset.`,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: emptyArray<string>()),\n\t\t\t\t\t`- Do not use image attachments in your generation unless the user has explicitly asked to use them as content. The user may ask for you to recreate an attached image, that does not mean to use the image as content.`,\n\t\t\t\t),\n\t\t\t],\n\t\t\tlocal: emptyArray<MarkdownBlock>(),\n\t\t}),\n\t\tbuildImplementAndReview(source),\n\t\tMarkdown.section(\n\t\t\t\"Definitions\",\n\t\t\t...implementationDefinitions.map(({ name, description }) => `- \"${name}\": ${description}`),\n\t\t),\n\t)\n}\n\nexport const implementationStrategy = buildImplementationStrategy({ agent: \"app\", prompt: \"in-app\" })\n", "import { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { PlaceholderNodeClass, serializeVirtualMetadata } from \"../context/nodes.ts\"\nimport type { Source } from \"../source.ts\"\nimport { defaultValue, noneValue } from \"../traits/layoutTemplate.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { scriptReference } from \"./promptEnv.ts\"\nimport { escapeValue, traitReference } from \"./utils.ts\"\n\nexport function buildLayoutTemplateRules(source: Source) {\n\treturn Markdown.section(\n\t\t\"Layout Templates\",\n\t\t`A ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} defines shared structure and visual properties for web pages. When applied to a ${escapeValue(ClassDiscriminator.WebPageNode)}, the page inherits certain properties from the layout template breakpoint instead of defining them on its own breakpoint.`,\n\t\t`The following properties are **owned by the layout template breakpoint** and cannot be set on the web page breakpoint:`,\n\t\t`- Page layout: alignment, gap, padding.`,\n\t\t`- Background fill`,\n\t\t`- Flow effect`,\n\t\t`- Text selection`,\n\t\t`- Cursor`,\n\t\t`- Base font size`,\n\t\t`When a page has a layout template applied (indicated by ${serializeVirtualMetadata(\"$layoutTemplateId\")} in the serialized output), these properties will not appear on the page breakpoint. To read them, target the layout template breakpoint using ${scriptReference(source)}.`,\n\t\t`A layout template breakpoint contains shared elements (e.g. a navigation bar, footer) that appear on every page using the template. A ${escapeValue(PlaceholderNodeClass)} inside the layout template breakpoint marks where the page's own content is rendered. The shared elements surround the placeholder \u2014 for example, a navbar above and a footer below.`,\n\t\t`When you create a new ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} primary breakpoint, a ${escapeValue(PlaceholderNodeClass)} is automatically created as the first child of the primary breakpoint. Do not create your own placeholder, instead position the shared elements around the ${escapeValue(PlaceholderNodeClass)}.`,\n\t\t`The web page breakpoint still owns its own children (sections, content) and per-section styling. Only the breakpoint-level properties listed above are delegated to the layout template.`,\n\t\t`Layout templates may contain variables, setting the value of these variables on the web page with the layout template applied will override the default value in the template.`,\n\t\tMarkdown.section(\n\t\t\t\"Assigning Layout Templates\",\n\t\t\t`Use the ${traitReference(\"layoutTemplate\")} attribute on a ${escapeValue(ClassDiscriminator.WebPageNode)} to control which layout template is applied:`,\n\t\t\t`- ${escapeValue(defaultValue)}: inherit the layout template set on the home page (shown in ${escapeValue(`<${metadataTags.defaultLayoutTemplate}>`)}).`,\n\t\t\t`- ${escapeValue(noneValue)}: explicitly remove the layout template from the page.`,\n\t\t\t`- A ${escapeValue(ClassDiscriminator.LayoutTemplateNode)} node id: apply a specific layout template. Use ${scriptReference(source)} to list available layout templates and their ids.`,\n\t\t),\n\t)\n}\n", "import {\n\tDESIGN_PLAN_LABEL,\n\tPROJECT_UPDATE_LABEL,\n\tformatLabeledProjectUpdateBlock,\n\tformatProjectUpdateBlock,\n} from \"../DocumentParser.ts\"\nimport type { Source } from \"../source.ts\"\nimport { READ_PROJECT_TOOL_NAME, REVIEW_CHANGES_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { Markdown, type MarkdownBlock } from \"./markdown.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource, GET_AGENT_CONTEXT_API_METHOD, toolReference } from \"./promptEnv.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nexport function buildOverview(source: Source, ...extraChildren: MarkdownBlock[]) {\n\tconst applyRef = escapeValue(`${APPLY_AGENT_CHANGES_API_METHOD}(dsl, { pagePath })`)\n\tconst contextRef = escapeValue(`${GET_AGENT_CONTEXT_API_METHOD}({ pagePath })`)\n\tconst readRef = toolReference(source, READ_PROJECT_TOOL_NAME)\n\tconst reviewRef = toolReference(source, REVIEW_CHANGES_TOOL_NAME)\n\treturn Markdown.section(\n\t\t\"Overview\",\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t\"You are an Agent that modifies Framer projects. Projects may contain website pages, freeform design pages, reusable components, and CMS collections.\",\n\t\t\t\t\"- You use native function/tool calling to read information about the project and request implementation examples.\",\n\t\t\t\t`- You modify the project by emitting fenced code blocks written in the ${escapeValue(PROJECT_UPDATE_LABEL)} syntax. These blocks are machine-readable implementation commands, not plain-text user-facing prose:`,\n\t\t\t\tformatProjectUpdateBlock('+FrameNode card-pricing parent=\"card-pricing-container\";'),\n\t\t\t\t`- You emit short implementation update steps only inside actual ${escapeValue(PROJECT_UPDATE_LABEL)} blocks that also contain implementation commands:`,\n\t\t\t\tformatLabeledProjectUpdateBlock([\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Updating pricing card...\",\n\t\t\t\t\t\tcontent: 'SET card-pricing padding=\"16px\"; SET card-container fill=\"#09f\";',\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t\t`- Batch related tool/read calls together when possible.`,\n\t\t\t\t`- A ${escapeValue(DESIGN_PLAN_LABEL)} block is preparatory work, not completion. After the plan, continue the same turn with the next required tool calls; do not end or summarize the turn there.`,\n\t\t\t\t`- You review your changes using ${escapeValue(REVIEW_CHANGES_TOOL_NAME)} before proceeding to another part of the request, but only after you have emitted at least one ${escapeValue(PROJECT_UPDATE_LABEL)} block since the last review.`,\n\t\t\t],\n\t\t\tlocal: [\n\t\t\t\t\"You are an Agent that modifies Framer projects via the plugin API. Projects may contain website pages, freeform design pages, reusable components, and CMS collections.\",\n\t\t\t\t`- Fetch the project context with ${contextRef} before generating commands.`,\n\t\t\t\t`- Read additional project data on demand with ${readRef}; batch related queries into one call.`,\n\t\t\t\t`- Apply changes by passing a DSL string to ${applyRef}. See \"Updating the Project\" for the grammar.`,\n\t\t\t\t`- After any ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call in the current reply, finalize with ${reviewRef} before summarizing. Never call ${reviewRef} before you have applied any changes.`,\n\t\t\t\t`- Publish with ${toolReference(source, \"publish\")}.`,\n\t\t\t\t`- If the request is critically ambiguous for safe implementation, ask the user before any ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call. Do not begin partial implementation until the ambiguity is resolved.`,\n\t\t\t],\n\t\t}),\n\t\t...extraChildren,\n\t)\n}\n\nexport const overview = buildOverview({ agent: \"app\", prompt: \"in-app\" })\n", "import { assertNever, type ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { once } from \"@framerjs/shared/src/once.ts\"\nimport { getDefaultNodeList } from \"document/models/CanvasTree/nodes/classList.ts\"\nimport { richTextTags } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport { isEqual } from \"library/index.ts\"\nimport { objectKeys } from \"library/utils/objectKeys.ts\"\nimport { join } from \"utils/join.ts\"\nimport { isArray, isFunction, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { createFlattenedKey, isIndexSegment } from \"../../utils/flatten.ts\"\nimport {\n\tcreateMediaBlock,\n\tcreateRichTextBlockquote,\n\tcreateRichTextBulletList,\n\tcreateRichTextLineBreak,\n\tcreateRichTextListItem,\n\tcreateRichTextNumberedList,\n\tcreateRichTextTable,\n\tcreateRichTextTableCell,\n\tcreateRichTextTableRow,\n\tcreateRichTextTextBlock,\n\tcreateRichTextTextComponentInstance,\n\tcreateRichTextTextRun,\n\tgetVirtualRichTextDSLNodeClass,\n\ttype VirtualRichTextNode,\n} from \"../context/richtext/document.ts\"\nimport type { ShadersJsonDefinition } from \"../context/shaders.ts\"\nimport { VectorSets } from \"../context/vectors.ts\"\nimport {\n\ttype AllNodeClass,\n\tCOMMAND_SEPARATOR,\n\ttype Command,\n\tCommandType,\n\tDateVariableAliasNodeClass,\n\tOptionVariableAliasNodeClass,\n\tEventHandlerVariableAliasNodeClass,\n\tFileVariableAliasNodeClass,\n\tFixedOverlayNodeClass,\n\tIconVariableAliasNodeClass,\n\tRelativeOverlayNodeClass,\n\ttype SupportedDSLNodeClass,\n\tTextBlockClass,\n\tTextBlockquoteClass,\n\tTextBulletListClass,\n\tTextComponentInstanceClass,\n\tTextLineBreakClass,\n\tTextListItemClass,\n\tTextMediaBlockClass,\n\tTextNumberedListClass,\n\tTextRunClass,\n\thasGenericAddSyntax,\n\tTextTableCellClass,\n\tTextTableClass,\n\tTextTableRowClass,\n\tTextUnsupportedBlockClass,\n\tisInsertableVirtualNodeClass,\n\tstandardVariableTypes,\n\tsupportedNodeClasses,\n\tVariableNodeClass,\n\tGalleryVariableAliasNodeClass,\n\tLinkVariableAliasNodeClass,\n\tComponentNodeClass,\n\tComponentInstanceNodeClass,\n\tIconNodeClass,\n} from \"../dsl.ts\"\nimport { supportedTraits } from \"../traits/attributes.ts\"\nimport { getDSLClassesForNode, isAttributeDefinition } from \"../traits/types.ts\"\nimport type { AttributesDefinition, TraitDefinition, TraitGuard, VirtualNodeTraitDefinition } from \"../traits/types.ts\"\nimport { supportedVirtualTraits } from \"../traits/virtualAttributes.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\ninterface BaseAttributeDefinition {\n\tdescription: string\n\texamples?: string[]\n}\n\ntype RequiredAttributeDefinition = BaseAttributeDefinition & { optional?: never }\ntype OptionalAttributeDefinition = BaseAttributeDefinition & { optional?: true }\n\ntype AttributeDefinitionFor<T> = undefined extends T ? OptionalAttributeDefinition : RequiredAttributeDefinition\n\ntype CommandAttributesDefinition<T> = {\n\t[K in keyof T]?: AttributeDefinitionFor<T[K]> | string\n}\n\ninterface CommandHelper<T extends Command> {\n\ttype: T[\"type\"]\n\tattributes: CommandAttributesDefinition<T[\"attributes\"]>\n}\n\ntype AnyCommandHelper = {\n\t[K in Command[\"type\"]]: CommandHelper<Extract<Command, { type: K }>>\n}[Command[\"type\"]]\n\nconst availableCommands: {\n\t[K in Command[\"type\"]]: CommandHelper<Extract<Command, { type: K }>>\n} = {\n\t[CommandType.Add]: {\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: {\n\t\t\t\tdescription: join(supportedNodeClasses.filter(hasGenericAddSyntax), \" | \"),\n\t\t\t},\n\t\t\tid: { description: \"Unique identifier for the node\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tdescription: \"Integer position of the node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t[CommandType.Update]: {\n\t\ttype: CommandType.Update,\n\t\tattributes: {\n\t\t\tid: { description: \"Unique identifier for the node\" },\n\t\t},\n\t},\n\t[CommandType.Remove]: {\n\t\ttype: CommandType.Remove,\n\t\tattributes: {\n\t\t\tid: { description: \"Unique identifier of the node/variable to remove\" },\n\t\t},\n\t},\n\t[CommandType.Duplicate]: {\n\t\ttype: CommandType.Duplicate,\n\t\tattributes: {\n\t\t\tid: { description: \"Unique identifier of the node to duplicate\" },\n\t\t\tnewId: { description: `Temporary unique identifier of the new node` },\n\t\t\tparent: {\n\t\t\t\tdescription: \"When duplicating to a new parent, the unique identifier of the parent node to duplicate to\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tdescription: \"Integer position of the new node\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t[CommandType.Move]: {\n\t\ttype: CommandType.Move,\n\t\tattributes: {\n\t\t\tid: { description: \"Unique identifier of the node to move\" },\n\t\t\tparent: { description: \"Unique identifier of the parent node to move to\" },\n\t\t\tposition: {\n\t\t\t\tdescription: \"Integer position of the node to move to\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t[CommandType.CreateVariant]: {\n\t\ttype: CommandType.CreateVariant,\n\t\tattributes: {\n\t\t\tid: { description: \"Temporary unique identifier of the new Variant\" },\n\t\t\tfrom: { description: `Unique identifier of the Variant to create a new Variant from` },\n\t\t\tgesture: {\n\t\t\t\tdescription: `When creating a gesture Variant: hover | pressed`,\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n}\n\nconst addAliasCommands: CommandHelper<Extract<Command, { type: CommandType.Add }>>[] = [\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.ColorStyleTokenNode,\n\t\t\tid: { description: \"Unique identifier for the color style token\" },\n\t\t\tname: {\n\t\t\t\tdescription: \"Name of the color style token\",\n\t\t\t\texamples: [\"Primary\", \"Accents/Success\"],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.TextStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the text style preset\" },\n\t\t\tname: { description: \"Name of the text style preset\", examples: [\"Heading 1\", \"Heading 2\", \"Heading 3\"] },\n\t\t\ttag: { description: \"Tag of the text style preset\", examples: Array.from(richTextTags) },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.LinkStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the link style preset\" },\n\t\t\tname: { description: \"Name of the link style preset\", examples: [\"Link\", \"Primary Link\", \"Nav Link\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.InlineCodeStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the inline code style preset\" },\n\t\t\tname: { description: \"Name of the inline code style preset\", examples: [\"Inline Code\", \"Code/Default\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.BlockquoteStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the blockquote style preset\" },\n\t\t\tname: { description: \"Name of the blockquote style preset\", examples: [\"Blockquote\", \"Blockquote/Default\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.TableStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the table style preset\" },\n\t\t\tname: { description: \"Name of the table style preset\", examples: [\"Table\", \"Table/Default\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.ImageStylePresetNode,\n\t\t\tid: { description: \"Unique identifier for the image style preset\" },\n\t\t\tname: { description: \"Name of the image style preset\", examples: [\"Editorial Image\", \"Cards/Thumbnail\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: IconNodeClass,\n\t\t\tid: { description: \"Unique identifier for the icon node\" },\n\t\t\tset: { description: `Icon Set name from ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)}` },\n\t\t\t$control__icon: {\n\t\t\t\tdescription: `Icon name from the set's ${escapeValue(\"options\")} array in ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)}`,\n\t\t\t},\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tdescription: \"Integer position of the node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ComponentInstanceNodeClass,\n\t\t\tid: { description: \"Unique identifier for the component instance node\" },\n\t\t\tcomponent: {\n\t\t\t\tdescription: `${escapeValue(\"id\")} of a component to create an instance of`,\n\t\t\t},\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tdescription: \"Integer position of the node when inserted\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.LayoutTemplateNode,\n\t\t\tid: { description: \"Unique identifier for the layout template node\" },\n\t\t\tname: {\n\t\t\t\tdescription: \"Name of the layout template\",\n\t\t\t\texamples: [\"Main Layout\", \"Marketing Layout\", \"Blog Layout\"],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.WebPageNode,\n\t\t\tid: { description: \"Unique identifier for the web page node\" },\n\t\t\tname: {\n\t\t\t\tdescription: \"Display name of the web page\",\n\t\t\t\texamples: [\"About\", \"Contact Us\", \"Blog Post\"],\n\t\t\t},\n\t\t\tpath: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"URL path of the web page (not the display name). CMS detail pages use :CollectionName as slug segment\",\n\t\t\t\texamples: [\"/about\", \"/contact\", \"/blog/:Articles\"],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.DesignPageNode,\n\t\t\tid: { description: \"Unique identifier for the design page node\" },\n\t\t\tname: { description: \"Name of the design page\", examples: [\"Playground\", \"Examples\", \"Tutorials\"] },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ComponentNodeClass,\n\t\t\tid: { description: \"Unique identifier for the new component definition\" },\n\t\t\tname: {\n\t\t\t\tdescription: \"Name of the new reusable component to create\",\n\t\t\t\texamples: [\"Card\", \"Button\", \"Header\"],\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.ShaderNode,\n\t\t\tid: { description: \"Unique identifier for the shader node\" },\n\t\t\tshader: {\n\t\t\t\tdescription: `Required shader ${escapeValue<ShadersJsonDefinition>(\"name\")}`,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: VariableNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\ttype: { description: standardVariableTypes.join(\" | \") },\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t\tinitialValue: {\n\t\t\t\tdescription: \"Initial value of the variable\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: DateVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t\tinitialValue: {\n\t\t\t\tdescription: \"ISO 8601 date string\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tdisplayTime: {\n\t\t\t\tdescription: \"Whether to display the time picker alongside the date\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: OptionVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: { description: \"Unique identifier of the scope node to create the variable in\" },\n\t\t\tcases: {\n\t\t\t\tdescription: `Array of string cases. ${escapeValue(\"initialValue\")} must equal one of these cases`,\n\t\t\t},\n\t\t\tinitialValue: {\n\t\t\t\tdescription: \"Initial case value for the option variable\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: EventHandlerVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: LinkVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: FileVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: { description: \"Unique identifier of the scope node to create the variable in\" },\n\t\t\tallowedFileTypes: {\n\t\t\t\tdescription: \"Array of allowed file extensions, e.g. .mp3 or .mp4\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: IconVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tset: {\n\t\t\t\tdescription: `Icon Set name from ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)}`,\n\t\t\t},\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t\tinitialValue: {\n\t\t\t\tdescription: `Icon name from the set's ${escapeValue(\"options\")} array in ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)}`,\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: GalleryVariableAliasNodeClass,\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\tscope: { description: \"Unique identifier of the scope node to create the variable in\" },\n\t\t\tminCount: {\n\t\t\t\tdescription: \"Minimum number of images in the gallery\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t\tmaxCount: {\n\t\t\t\tdescription: \"Maximum number of images in the gallery\",\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: \"CollectionReferenceVariable\",\n\t\t\tid: { description: \"Unique identifier for the variable\" },\n\t\t\tname: { description: \"Name of the variable\" },\n\t\t\ttype: { description: [\"single\", \"multi\"].join(\" | \") },\n\t\t\tcollection: {\n\t\t\t\tdescription: `Referenced collection name`,\n\t\t\t},\n\t\t\tscope: {\n\t\t\t\tdescription: \"Unique identifier of the scope node to create the variable in\",\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextBlockClass,\n\t\t\tid: { description: `Temporary unique identifier for the new text block.` },\n\t\t\ttag: { description: \"Tag of the text block\", examples: Array.from(richTextTags), optional: true },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the text block when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextBlockquoteClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new blockquote\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the blockquote when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextTableClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new table\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the table when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextTableRowClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new table row\" },\n\t\t\tparent: { description: \"Unique identifier of the parent TextTable\" },\n\t\t\tposition: { description: \"Integer position of the table row when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextTableCellClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new table cell\" },\n\t\t\tcellType: { description: \"header | cell\", optional: true },\n\t\t\tparent: { description: \"Unique identifier of the parent TextTableRow\" },\n\t\t\tposition: { description: \"Integer position of the table cell when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextBulletListClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new bullet list\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the list when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextNumberedListClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new numbered list\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the list when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextListItemClass,\n\t\t\tid: { description: `Temporary unique identifier for the new list item.` },\n\t\t\tparent: { description: \"Unique identifier of the parent TextBulletList or TextNumberedList\" },\n\t\t\tposition: { description: \"Integer position of the list item when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextRunClass,\n\t\t\tid: { description: `Temporary unique identifier for the new text run.` },\n\t\t\tparent: { description: \"Unique identifier of the parent TextBlock\" },\n\t\t\tposition: { description: \"Integer position of the text run when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextMediaBlockClass,\n\t\t\tid: { description: \"Temporary unique identifier for the new media block\" },\n\t\t\tparent: {\n\t\t\t\tdescription: \"Unique identifier of the parent rich text target, TextListItem, TextBlockquote, or TextTableCell\",\n\t\t\t},\n\t\t\tposition: { description: \"Integer position of the media block when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextComponentInstanceClass,\n\t\t\tid: {\n\t\t\t\tdescription: `Temporary unique identifier for the new embedded component instance.`,\n\t\t\t},\n\t\t\tcomponent: {\n\t\t\t\tdescription: `${escapeValue(\"id\")} of a component to embed`,\n\t\t\t},\n\t\t\tparent: { description: \"Unique identifier of the parent rich text target or TextListItem\" },\n\t\t\tposition: { description: \"Integer position of the embedded component when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: TextLineBreakClass,\n\t\t\tid: { description: `Temporary unique identifier for the new line break.` },\n\t\t\tparent: { description: \"Unique identifier of the parent TextBlock\" },\n\t\t\tposition: { description: \"Integer position of the line break when inserted\", optional: true },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: FixedOverlayNodeClass,\n\t\t\tid: { description: \"Unique identifier for the fixed overlay node\" },\n\t\t\tparent: { description: \"Unique identifier of the parent node when inserted\" },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: RelativeOverlayNodeClass,\n\t\t\tid: { description: \"Unique identifier for the relative overlay node\" },\n\t\t\t// TODO: Extend this syntax when agent-authored component internals can own relative overlays.\n\t\t\tparent: { description: \"Unique identifier of the trigger node when inserted\" },\n\t\t},\n\t},\n\t{\n\t\ttype: CommandType.Add,\n\t\tattributes: {\n\t\t\tnode: ClassDiscriminator.ComponentPresetNode,\n\t\t\tid: { description: \"Unique identifier for the component preset\" },\n\t\t\tcomponent: { description: `${escapeValue(\"id\")} of a component to create a preset for` },\n\t\t\tname: { description: \"Name of the component preset\", examples: [\"Code/Typescript\", \"Videos/YouTube Dark\"] },\n\t\t},\n\t},\n]\n\nfunction optional(description: string, isOptional?: boolean, showOptional: boolean = true) {\n\tif (isOptional && showOptional) return `<Optional - ${description}>`\n\treturn `<${description}>`\n}\n\n// fill=\"<Color for the background of the node (e.g. 'rgba(255, 255, 255, 1)', '#fff', 'color(display-p3 1 1 1 / 0.5)', 'var(--token-${id})')>\"\nfunction withExamples(description: string, examples?: string[]) {\n\treturn isArray(examples) ? `${description} (e.g. ${examples.map(e => `'${e}'`).join(\", \")})` : description\n}\n\nconst testSeparator = \"\\n    \"\nfunction formatAttributes(attributes: AttributesDefinition, test: boolean, showOptional: boolean = true) {\n\tconst items = serializeAttributeDefinitions(attributes, showOptional)\n\tif (items.length === 0) return \"\"\n\n\treturn test ? testSeparator + join(items, testSeparator) : \" \" + join(items, \" \")\n}\n\n/**\n * Given a trait guard function, returns the set of DSL node classes that pass the guard.\n * This allows traits to automatically scale to new nodes without maintaining a separate list.\n *\n * The function:\n * 1. Iterates through all node default instances via `getDefaultNodeList()`\n * 2. Runs the guard on each node\n * 3. Maps passing nodes to their DSL class (handling aliases like IconNode, ComponentInstanceNode)\n */\nfunction getDSLNodeClassesForGuard(guard: TraitGuard): SupportedDSLNodeClass[] {\n\tconst result = new Set<SupportedDSLNodeClass>()\n\n\tfor (const node of getDefaultNodeList()) {\n\t\tif (!guard(node)) continue\n\n\t\tconst dslClasses = getDSLClassesForNode(node)\n\t\tfor (const dslClass of dslClasses) {\n\t\t\tresult.add(dslClass)\n\t\t}\n\t}\n\n\treturn [...result]\n}\n\nconst promptModuleExportIdentifier = \"local-module:virtual/prompt:default\" as ModuleExportIdentifierString\n\ntype DefaultVirtualRichTextNodeByType = {\n\treadonly [Type in VirtualRichTextNode[\"type\"]]: Extract<VirtualRichTextNode, { readonly type: Type }>\n}\n\nconst getDefaultVirtualRichTextNodeList = once((): readonly VirtualRichTextNode[] => {\n\tconst byType: DefaultVirtualRichTextNodeByType = {\n\t\tblockquote: createRichTextBlockquote(\"blockquote\"),\n\t\tbulletList: createRichTextBulletList(\"bullet-list\"),\n\t\tcomponentInstance: createRichTextTextComponentInstance(\"component-instance\", promptModuleExportIdentifier),\n\t\tlineBreak: createRichTextLineBreak(\"line-break\"),\n\t\tlistItem: createRichTextListItem(\"list-item\"),\n\t\tmediaBlock: createMediaBlock(\"media-block\"),\n\t\tnumberedList: createRichTextNumberedList(\"numbered-list\"),\n\t\ttable: createRichTextTable(\"table\"),\n\t\ttableCell: createRichTextTableCell(\"table-cell\", \"cell\"),\n\t\ttableRow: createRichTextTableRow(\"table-row\"),\n\t\ttextBlock: createRichTextTextBlock(\"text-block\"),\n\t\ttextRun: createRichTextTextRun(\"text-run\"),\n\t\tunsupported: {\n\t\t\ttype: \"unsupported\",\n\t\t\tid: \"unsupported\",\n\t\t\tnodeType: \"unsupported\",\n\t\t\tnodeJson: { type: \"unsupported\" },\n\t\t},\n\t}\n\treturn Object.values(byType)\n})\n\nfunction getDSLNodeClassesForVirtualGuard(guard: TraitGuard<VirtualRichTextNode>): SupportedDSLNodeClass[] {\n\tconst result = new Set<SupportedDSLNodeClass>()\n\n\tfor (const node of getDefaultVirtualRichTextNodeList()) {\n\t\tif (!guard(node)) continue\n\n\t\tconst nodeClass = getVirtualRichTextDSLNodeClass(node.type)\n\t\tif (nodeClass === TextUnsupportedBlockClass) continue\n\t\tif (isSupportedPromptNodeClass(nodeClass as AllNodeClass)) result.add(nodeClass as SupportedDSLNodeClass)\n\t}\n\n\treturn [...result]\n}\n\ninterface GroupedTraitDefinitions {\n\t/** Traits available for all node classes */\n\tuniversal: AttributesDefinition\n\t/** Traits grouped by their onlyFor node classes */\n\tbyNodeClass: Map<string, AttributesDefinition>\n}\n\ninterface GroupedAttributeDefinition {\n\tattributeKey: string\n\tdefinition: AttributesDefinition[string]\n\tnodeClasses: Set<string>\n}\n\ntype GroupedAttributeIdentityMap = Map<string, WeakMap<object, GroupedAttributeDefinition>>\n\nconst nodeClassInheritance = {\n\t[RelativeOverlayNodeClass]: [ClassDiscriminator.FrameNode],\n} as const satisfies Partial<Record<SupportedDSLNodeClass, readonly SupportedDSLNodeClass[]>>\n\nfunction isSupportedPromptNodeClass(nodeClass: AllNodeClass): nodeClass is SupportedDSLNodeClass {\n\treturn nodeClass !== VariableNodeClass\n}\n\nfunction expandInheritedNodeClasses(nodeClasses: readonly SupportedDSLNodeClass[]): SupportedDSLNodeClass[] {\n\tconst expanded = new Set(nodeClasses)\n\n\twhile (true) {\n\t\tlet didExpand = false\n\n\t\tfor (const alias of objectKeys(nodeClassInheritance)) {\n\t\t\tconst inheritedClasses = nodeClassInheritance[alias]\n\t\t\tif (expanded.has(alias)) continue\n\t\t\tif (!inheritedClasses.every(nodeClass => expanded.has(nodeClass))) continue\n\n\t\t\texpanded.add(alias)\n\t\t\tdidExpand = true\n\t\t}\n\n\t\tif (!didExpand) break\n\t}\n\n\treturn [...expanded]\n}\n\n/**\n * Resolves the node classes for a trait from `for`.\n * Returns undefined if the trait applies to all nodes.\n */\nfunction getNodeClassesForTrait(trait: TraitDefinition<object>): SupportedDSLNodeClass[] {\n\tif (isFunction(trait.for)) return expandInheritedNodeClasses(getDSLNodeClassesForGuard(trait.for))\n\tconst canvasClasses = trait.for.guard ? getDSLNodeClassesForGuard(trait.for.guard) : []\n\tconst nodeClasses = (trait.for.nodes ?? []).filter(isSupportedPromptNodeClass)\n\treturn expandInheritedNodeClasses([...canvasClasses, ...nodeClasses])\n}\n\nfunction getNodeClassesForVirtualTrait(trait: VirtualNodeTraitDefinition<object>): SupportedDSLNodeClass[] {\n\treturn getDSLNodeClassesForVirtualGuard(trait.for)\n}\n\n/**\n * Returns trait definitions grouped by their node class restrictions. Traits which match all nodes are\n * placed in the `universal` group. Traits with restrictions are grouped by their sorted node class list.\n */\nexport function getGroupedTraitDefinitions(\n\ttraits: readonly TraitDefinition<object>[],\n\tvirtualTraits: readonly VirtualNodeTraitDefinition<object>[] = [],\n): GroupedTraitDefinitions {\n\tconst universal: AttributesDefinition = {}\n\tconst groupedDefinitions: GroupedAttributeDefinition[] = []\n\tconst groupedDefinitionsByIdentity: GroupedAttributeIdentityMap = new Map()\n\tconst allNodeClasses = new Set<string>()\n\n\tfor (const trait of traits) {\n\t\tconst nodeClasses = getNodeClassesForTrait(trait)\n\t\taddGroupedTraitDefinition(\n\t\t\ttrait.definition as AttributesDefinition,\n\t\t\tnodeClasses,\n\t\t\tgroupedDefinitions,\n\t\t\tgroupedDefinitionsByIdentity,\n\t\t\tallNodeClasses,\n\t\t)\n\t}\n\n\tfor (const trait of virtualTraits) {\n\t\tconst nodeClasses = getNodeClassesForVirtualTrait(trait)\n\t\taddGroupedTraitDefinition(\n\t\t\ttrait.definition as AttributesDefinition,\n\t\t\tnodeClasses,\n\t\t\tgroupedDefinitions,\n\t\t\tgroupedDefinitionsByIdentity,\n\t\t\tallNodeClasses,\n\t\t)\n\t}\n\n\tconst byNodeClass = new Map<string, AttributesDefinition>()\n\tfor (const { attributeKey, definition, nodeClasses } of groupedDefinitions) {\n\t\tif (isUniversallySupported(allNodeClasses, nodeClasses)) {\n\t\t\tconst existing = universal[attributeKey]\n\t\t\tif (!isUndefined(existing) && !isEqual(existing, definition)) {\n\t\t\t\tthrow new Error(`Attribute ${attributeKey} has multiple conflicting definitions in the universal group`)\n\t\t\t}\n\t\t\tuniversal[attributeKey] = definition\n\t\t\tcontinue\n\t\t}\n\n\t\tconst key = [...nodeClasses].sort().join(\", \")\n\t\tconst existing = byNodeClass.get(key) ?? {}\n\n\t\tif (!isUndefined(existing[attributeKey]) && !isEqual(existing[attributeKey], definition)) {\n\t\t\tthrow new Error(`Attribute ${attributeKey} has multiple conflicting definitions for node classes ${key}`)\n\t\t}\n\n\t\texisting[attributeKey] = definition\n\t\tbyNodeClass.set(key, existing)\n\t}\n\n\treturn { universal, byNodeClass }\n}\n\nfunction addGroupedTraitDefinition(\n\tattributes: AttributesDefinition,\n\tnodeClasses: readonly SupportedDSLNodeClass[],\n\tgroupedDefinitions: GroupedAttributeDefinition[],\n\tgroupedDefinitionsByIdentity: GroupedAttributeIdentityMap,\n\tallNodeClasses: Set<string>,\n): void {\n\tfor (const key in attributes) {\n\t\tconst definition = attributes[key]\n\t\tif (isUndefined(definition)) continue\n\t\tconst identityLookup = groupedDefinitionsByIdentity.get(key)\n\n\t\t// Traits only merge when they reuse the exact same definition object (referential\n\t\t// equality). Virtual and Canvas Traits may share the same definition object - or they\n\t\t// may be different objects with the same keys yet have different descriptions or values.\n\t\tconst existing = identityLookup?.get(definition)\n\n\t\tif (existing) {\n\t\t\tfor (const nodeClass of nodeClasses) {\n\t\t\t\texisting.nodeClasses.add(nodeClass)\n\t\t\t\tallNodeClasses.add(nodeClass)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tconst created: GroupedAttributeDefinition = {\n\t\t\tattributeKey: key,\n\t\t\tdefinition,\n\t\t\tnodeClasses: new Set(nodeClasses),\n\t\t}\n\t\tgroupedDefinitions.push(created)\n\n\t\tconst identityMap = identityLookup ?? new WeakMap<object, GroupedAttributeDefinition>()\n\t\tidentityMap.set(definition, created)\n\t\tgroupedDefinitionsByIdentity.set(key, identityMap)\n\n\t\tfor (const nodeClass of nodeClasses) {\n\t\t\tallNodeClasses.add(nodeClass)\n\t\t}\n\t}\n}\n\nfunction isUniversallySupported(allNodeClasses: Set<string>, nodeClassSet: Set<string>): boolean {\n\tfor (const nodeClass of allNodeClasses) {\n\t\t// We consider an attribute universally supported if it is supported for all non-virtual node classes.\n\t\tif (isInsertableVirtualNodeClass(nodeClass)) continue\n\t\tif (!nodeClassSet.has(nodeClass)) return false\n\t}\n\treturn true\n}\n\nfunction formatGroupedUpdateAttributes(test: boolean): string {\n\tconst { universal, byNodeClass } = getGroupedTraitDefinitions(supportedTraits, supportedVirtualTraits)\n\n\tconst parts: string[] = []\n\n\t// Universal attributes first\n\tconst universalItems = serializeAttributeDefinitions(universal, false)\n\tif (universalItems.length > 0) {\n\t\tparts.push(...universalItems)\n\t}\n\n\t// Grouped attributes by onlyFor node classes\n\tfor (const [nodeClasses, definition] of byNodeClass) {\n\t\tconst items = serializeAttributeDefinitions(definition, false)\n\t\tif (items.length === 0 || !nodeClasses) continue\n\n\t\tconst comment = `/* ${nodeClasses} */`\n\t\tif (test) {\n\t\t\tparts.push(comment)\n\t\t\tparts.push(...items)\n\t\t} else {\n\t\t\tparts.push(`${comment} ${join(items, \" \")}`)\n\t\t}\n\t}\n\n\tif (parts.length === 0) return \"\"\n\n\treturn test ? testSeparator + join(parts, testSeparator) : \" \" + join(parts, \" \")\n}\n\nexport function serializeAttributeDefinitions(\n\tattributes: AttributesDefinition,\n\tshowOptional: boolean = true,\n\tprefix: string = \"\",\n): string[] {\n\tconst items: string[] = []\n\n\tfor (const key in attributes) {\n\t\tconst value = attributes[key]\n\t\tif (isUndefined(value)) continue\n\n\t\tconst k = isIndexSegment(key) ? \"<i>\" : key\n\t\tconst fullKey = createFlattenedKey(prefix, k)\n\n\t\tif (isAttributeDefinition(value)) {\n\t\t\tconst v = isArray(value.examples) ? withExamples(value.description, value.examples) : value.description\n\t\t\titems.push(`${fullKey}=\"${optional(v, value.optional, showOptional)}\"`)\n\t\t\tcontinue\n\t\t}\n\t\tif (isString(value)) {\n\t\t\titems.push(`${fullKey}=\"${value}\"`)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst nestedItems = serializeAttributeDefinitions(value, showOptional, fullKey)\n\t\titems.push(...nestedItems)\n\t}\n\n\treturn items\n}\n\nfunction escapeFirstArgument(attribute: AttributeDefinitionFor<unknown> | string | undefined) {\n\tif (isUndefined(attribute)) return \"\"\n\tif (isString(attribute)) return attribute\n\treturn optional(attribute.description, attribute.optional, true)\n}\n\nfunction printExampleCommand(command: AnyCommandHelper, test: boolean) {\n\tswitch (command.type) {\n\t\tcase CommandType.Add: {\n\t\t\tconst { node, id, ...rest } = command.attributes\n\t\t\treturn `${command.type}${escapeFirstArgument(node)} ${escapeFirstArgument(id)}${formatAttributes(rest as AttributesDefinition, test)}${COMMAND_SEPARATOR}`\n\t\t}\n\t\tcase CommandType.Update: {\n\t\t\tconst { id } = command.attributes\n\t\t\treturn `${command.type} ${escapeFirstArgument(id)}${formatGroupedUpdateAttributes(test)}${COMMAND_SEPARATOR}`\n\t\t}\n\t\tcase CommandType.Remove:\n\t\tcase CommandType.Duplicate:\n\t\tcase CommandType.CreateVariant:\n\t\tcase CommandType.Move: {\n\t\t\tconst { id, ...rest } = command.attributes\n\t\t\treturn `${command.type} ${escapeFirstArgument(id)}${formatAttributes(rest as AttributesDefinition, test)}${COMMAND_SEPARATOR}`\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(command)\n\t}\n}\n\nexport function dslInstructionsFromExamples({ test }: { test: boolean } = { test: false }) {\n\treturn join.lines(\n\t\t// The LLM is provided with specific add commands to avoid creating confusing ambiguous optional attributes.\n\t\t// These are still parsed as the generic Add command.\n\t\tjoin.linesFrom(addAliasCommands.map(command => printExampleCommand(command, test))),\n\t\tjoin.linesFrom(Object.values(availableCommands).map(command => printExampleCommand(command, test))),\n\t)\n}\n", "import { flatten } from \"../../utils/flatten.ts\"\nimport { formatProjectUpdateBlock, PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { COMMAND_SEPARATOR, CommandType } from \"../dsl.ts\"\nimport { commandToDSL } from \"../nodeToDSLCommands.ts\"\nimport type { Source } from \"../source.ts\"\nimport { computedValueAlias, computedValueDescription, variableDescription } from \"../traits/traitDescriptions.ts\"\nimport { dslInstructionsFromExamples } from \"./dslCommands.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource } from \"./promptEnv.ts\"\nimport { escapeBlock, escapeValue } from \"./utils.ts\"\n\nconst computedValueProjectUpdateExample = commandToDSL({\n\ttype: CommandType.Update,\n\tattributes: {\n\t\tid: \"availabilityLabel\",\n\t\t...flatten({\n\t\t\ttext: {\n\t\t\t\tfrom: \"var(--variable-in-stock)\",\n\t\t\t\ttransforms: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"convertFromBoolean\",\n\t\t\t\t\t\toutputType: \"string\",\n\t\t\t\t\t\ttruthy: \"In stock\",\n\t\t\t\t\t\tfalsy: \"Sold out\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t},\n})\n\nfunction buildComputedValueInstructions(source: Source) {\n\treturn Markdown.section(\n\t\t\"Computed Values\",\n\t\t`${escapeValue(computedValueAlias)} is shorthand for ${escapeValue(computedValueDescription)}. When an attribute accepts ${escapeValue(computedValueAlias)}, use it to bind a variable and apply ValueTransforms inline before assignment, such as ${escapeValue(\"toString\")}, ${escapeValue(\"toDateString\")}, ${escapeValue(\"numberToString\")}, ${escapeValue(\"prefix\")}, or ${escapeValue(\"suffix\")}. Use ${escapeValue(variableDescription)} for direct variable bindings without transforms.`,\n\t\t`For example, a ${escapeValue(CommandType.Update)} command can set ${escapeValue(\"text\")} from a product availability boolean with a transform:`,\n\t\tforSource(source, {\n\t\t\t\"in-app\": formatProjectUpdateBlock(computedValueProjectUpdateExample),\n\t\t\tlocal: escapeBlock(computedValueProjectUpdateExample),\n\t\t}),\n\t\t`Before applying any transform to a variable when binding (formatting, comparing, converting, etc.), **always** request the ${escapeValue(`\"Computed Values\"`)} implementation guide.`,\n\t)\n}\n\nexport function buildProjectUpdates(source: Source) {\n\tconst intro = forSource(source, {\n\t\t\"in-app\": [\n\t\t\t`You can modify the project by emitting fenced code blocks written in the ${escapeValue(PROJECT_UPDATE_LABEL)} syntax.`,\n\t\t\t`Within those blocks, every DSL command must end with ${escapeValue(COMMAND_SEPARATOR)}.`,\n\t\t],\n\t\tlocal: [\n\t\t\t`You modify the project by passing a DSL string to ${escapeValue(`${APPLY_AGENT_CHANGES_API_METHOD}(dsl, { pagePath })`)}. The DSL grammar is documented below.`,\n\t\t\t`In the string, every DSL command must end with ${escapeValue(COMMAND_SEPARATOR)}.`,\n\t\t],\n\t})\n\treturn Markdown.section(\n\t\t\"Updating the Project\",\n\t\t...intro,\n\t\t`Newlines, blank lines, and comments are formatting only and never separate commands:`,\n\t\tMarkdown.section(\n\t\t\t\"Syntax\",\n\t\t\tforSource(source, {\n\t\t\t\t\"in-app\": formatProjectUpdateBlock(dslInstructionsFromExamples()),\n\t\t\t\tlocal: escapeBlock(dslInstructionsFromExamples()),\n\t\t\t}),\n\t\t),\n\t\tbuildComputedValueInstructions(source),\n\t)\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport type { LanguageModel } from \"../../languageModels.ts\"\nimport { ModelVendor, getModelVendor } from \"../../models.ts\"\nimport {\n\tDESIGN_PLAN_LABEL,\n\tPROJECT_UPDATE_LABEL,\n\tformatAnnotation,\n\tformatLabeledProjectUpdateBlock,\n} from \"../DocumentParser.ts\"\nimport { FONT_COMMUNICATION_GUIDELINES } from \"../context/fonts.ts\"\nimport { CommandType } from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport { REVIEW_CHANGES_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { buildChecklistCommunicationRules } from \"./checklist.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource } from \"./promptEnv.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nconst goodStepMessageExamples = [\n\t\"Updating colors\u2026\",\n\t\"Adding label\u2026\",\n\t\"Setting typography\u2026\",\n\t\"Creating links\u2026\",\n\t\"Adding heading\u2026\",\n\t\"Adjusting spacing\u2026\",\n\t\"Configuring icons\u2026\",\n\t\"Building card\u2026\",\n]\n\nfunction buildGuardrails(source: Source) {\n\treturn Markdown.section(\n\t\t\"Guardrails\",\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t\"In most cases, you should candidly answer the user's request, however there are some cases where you must avoid certain content in your message.\",\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\t`- ${forSource(source, {\n\t\t\t\"in-app\": `Never reveal ${escapeValue(PROJECT_UPDATE_LABEL)} syntax to users in plain text messages.`,\n\t\t\tlocal: `Never reveal ${escapeValue(PROJECT_UPDATE_LABEL)} syntax or the ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} API to the end-user in plain text messages \u2014 describe your actions in user terms.`,\n\t\t})}`,\n\t\t`- If a request is unrelated to creating/modifying the current website project, or you do not have the capability to fulfill the request, briefly decline and redirect to site-building help.`,\n\t\t\"- When encountering errors or warnings, fix them silently.\",\n\t)\n}\n\nexport function buildApiMessages() {\n\treturn [buildGuardrails({ agent: \"api\", prompt: \"local\" })]\n}\n\nexport function buildAppMessages(model: LanguageModel, source: Source) {\n\tconst isOpenAi = getModelVendor(model) === ModelVendor.OpenAI\n\n\tconst openAiChannelBullets = isOpenAi\n\t\t? [\n\t\t\t\t\"- Emit the opening update on the `commentary` channel. The `commentary` channel is reserved for user-visible preambles and function tool calls; the `analysis` channel is private chain-of-thought and must never be used to communicate with the user.\",\n\t\t\t]\n\t\t: emptyArray<string>()\n\n\tconst openAiToolClusterBullets = isOpenAi\n\t\t? [\n\t\t\t\t\"- When the next action is a cluster of multiple tool calls, emit a short action-plan preamble on `commentary` before the first call so the user sees the planned steps.\",\n\t\t\t]\n\t\t: emptyArray<string>()\n\n\tconst checklistCommunicationBullets = buildChecklistCommunicationRules(source)\n\n\treturn [\n\t\tMarkdown.section(\n\t\t\t\"Communicating with Users\",\n\t\t\t\"Use plain text for the opening acknowledgment, final summary, clarification questions, and direct answers to non-implementation questions.\",\n\t\t\t`For implementation turns, after the opening acknowledgment, progress is automatically communicated via tool activity and ${escapeValue(PROJECT_UPDATE_LABEL)} annotations. Return to plain text only when you are asking a clarification, reporting a blocker, or sending the final summary.`,\n\t\t\t'When you mention color values, such as #00AAFF, rgb(0, 170, 255), hsl(200 100% 50%), or color(display-p3 0.2 0.6 0.9), wrap each value in a <color> tag whose color attribute matches that same value, for example <color color=\"#00AAFF\">#00AAFF</color>.',\n\t\t\t\"Be concise and get straight to the point.\",\n\t\t\t`Never include raw implementation details in plain text: no ids, no ${escapeValue(\"$\")} variables, no ${escapeValue('attribute=\"value\"')} fragments, no command names, and no tool/debug diagnoses.`,\n\t\t\t\"Never reveal layer IDs or internal identifiers in plain text, even if the user asks for them. Refer to the visible layer name, selected layer, or affected layer instead.\",\n\t\t\t`In plain text, never use internal project-update terms: no ${escapeValue(\"node\")}, class/type names, trait/property names, or raw property names. Use ${escapeValue(\"layer\")}, ${escapeValue(\"element\")}, visible layer names, and plain design language instead.`,\n\t\t\t`The term ${escapeValue(\"node\")}, project-update class names, and project-update trait names are only allowed inside tool calls, internal reasoning, and ${escapeValue(PROJECT_UPDATE_LABEL)} blocks.`,\n\t\t\t`Never write raw property syntax in prose, including examples like ${escapeValue('width=\"100%\"')}, ${escapeValue(`${CommandType.Update} ...`)}, ${escapeValue(\"$control__...\")}, or ${escapeValue(\"var(--variable-...)\")}.`,\n\t\t\t...checklistCommunicationBullets,\n\t\t\t\"When a response is naturally a checklist, todo list, or progress list, prefer GitHub-style task list markdown (`- [ ]`, `- [x]`) over emoji bullets like `- \u2705` or `- \u23F3`.\",\n\t\t\tFONT_COMMUNICATION_GUIDELINES,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Opening Acknowledgment\",\n\t\t\t\"- Start implementation turns with one brief user-facing update before tool calls.\",\n\t\t\t...openAiChannelBullets,\n\t\t\t\"- Do not comment on or evaluate the request itself.\",\n\t\t\t...openAiToolClusterBullets,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Tool Preambles\",\n\t\t\t`- Batch related tool calls together when possible.`,\n\t\t\t`- During implementation, keep read/review/debugging loops silent. If more work remains, continue with tools or the next ${escapeValue(PROJECT_UPDATE_LABEL)} block.`,\n\t\t\t`- After ${escapeValue(REVIEW_CHANGES_TOOL_NAME)}, either fix issues silently or send the final summary. Do not explain the review findings in plain text.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Step Messages\",\n\t\t\t`While emitting updates to the project in ${escapeValue(PROJECT_UPDATE_LABEL)} blocks, emit frequent short steps as annotations to show progress:`,\n\t\t\tformatLabeledProjectUpdateBlock([\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Updating colors\u2026\",\n\t\t\t\t\tcontent: 'SET <section-node-id> fill=\"#09f\"; SET <headline-node-id> fill=\"#09f\";',\n\t\t\t\t},\n\t\t\t]),\n\t\t\t`- Step annotations are only valid inside actual ${escapeValue(PROJECT_UPDATE_LABEL)} blocks that also contain implementation commands.`,\n\t\t\t`- Use short user-facing verb phrases before logical groups of commands.`,\n\t\t\t`- Add a new annotation when you move to a different visible area or kind of work.`,\n\t\t\t`- Keep annotations free of ids, project-update terms, raw commands, and attribute syntax.`,\n\t\t\t`- Do not narrate implementation progress in private reasoning, ${escapeValue(DESIGN_PLAN_LABEL)} blocks, tool preambles, or plain text. If you are not emitting a ${escapeValue(PROJECT_UPDATE_LABEL)} block, think in terms of decisions and next actions rather than progress steps.`,\n\t\t\t`- Example Prompt: \"make it blue and add padding\" -> Example output:`,\n\t\t\tformatLabeledProjectUpdateBlock([\n\t\t\t\t{ label: \"Updating color\u2026\", content: \"<color commands>\" },\n\t\t\t\t{ label: \"Adding padding\u2026\", content: \"<padding commands>\" },\n\t\t\t]),\n\t\t\tMarkdown.section(\n\t\t\t\t\"Good Step Message Examples\",\n\t\t\t\t...goodStepMessageExamples.map(line => `- ${formatAnnotation(line)}`),\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Summarizing\",\n\t\t\t`After an implementation turn that emitted a ${escapeValue(PROJECT_UPDATE_LABEL)} block, review the changes with ${escapeValue(REVIEW_CHANGES_TOOL_NAME)} before the final summary.`,\n\t\t\t`- If review finds issues, fix them silently and review again. Summarize only when the work is complete or honestly blocked.`,\n\t\t\t`Summarize the changes in a short plain text message to the user.`,\n\t\t\t`- Users see the canvas, so name what changed and skip visible style details.`,\n\t\t\t`- Don't list alternatives or suggestions unless asked.`,\n\t\t\t`- If something couldn't be done, mention it honestly without raw project-update syntax, ids, commands, or attribute syntax.`,\n\t\t\t`- For multi-part changes, prefer a numbered list naming each section or part created. For single-part changes, a short sentence is fine.`,\n\t\t\t`- Good: \"Created a new page.\\\\n1. Introduction section.\\\\n2. Project grid.\\\\n3. About section.\\\\n4. Contact footer.\"`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Critical Follow-Ups\",\n\t\t\t\"When you complete an applicable implementation request, consider whether you should ask a relevant follow-up question in plain text at the end of that response.\",\n\t\t\t\"Applicable follow-up questions:\",\n\t\t\t`1. \"Do you want me to make it responsive and create color tokens and text styles?\"`,\n\t\t\t`2. \"Do you want me to make it responsive?\"`,\n\t\t\t`3. \"Do you want me to create color tokens and text styles?\"`,\n\t\t\t\"Rules:\",\n\t\t\t`- Ask the applicable follow-up question at the end of every applicable implementation response.`,\n\t\t\t`- Only ask these follow-up questions after an implementation response, not after a clarification-only, analysis-only, advice-only, or otherwise non-implementation turn.`,\n\t\t\t`- If no implementation was completed in the current turn, do not ask one of these follow-up questions.`,\n\t\t\t`- Always factor in the user's response to these follow-up questions in future requests. For example, if the user agrees to make it responsive, make future pages responsive by default.`,\n\t\t\t`Only omit a follow-up question if it is clearly not relevant. For example:`,\n\t\t\t`- The tokens question is irrelevant if tokens already exist or were utilized in the implementation.`,\n\t\t\t`- The responsive question is irrelevant if breakpoints were just created or already exist.`,\n\t\t),\n\t\tbuildGuardrails({ agent: \"app\", prompt: \"in-app\" }),\n\t]\n}\n", "import type { LanguageModel } from \"../../languageModels.ts\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport type { Source } from \"../source.ts\"\nimport { ASK_CLARIFICATION_TOOL_NAME, REVIEW_CHANGES_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { buildChecklistResponseRhythm } from \"./checklist.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { buildAppMessages } from \"./messages.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\nexport function buildResponse(model: LanguageModel, source: Source) {\n\treturn Markdown.section(\n\t\t\"Response\",\n\t\tMarkdown.section(\n\t\t\t`Implementation`,\n\t\t\t`- It is critical that you break down the user's request into smaller, manageable phases.`,\n\t\t\t...buildChecklistResponseRhythm(source),\n\t\t\t`- Batch related native function/tool calls to read the project and gather context.`,\n\t\t\t`- After completing any required plan/read setup and reading enough context, proceed with the smallest meaningful ${escapeValue(PROJECT_UPDATE_LABEL)} block instead of privately planning the full implementation. For larger requests, implement one coherent section or change group, review, then continue.`,\n\t\t\t`- If the next step is clear, act directly. Do not spend extra private reasoning time rehearsing implementation details before emitting a tool call or ${escapeValue(PROJECT_UPDATE_LABEL)} block.`,\n\t\t\t`- Edit with ${escapeValue(PROJECT_UPDATE_LABEL)} blocks, using annotations for progress.`,\n\t\t\t`- Keep implementation plain text to the opening acknowledgment and final summary.`,\n\t\t\t`- Review after edits with ${escapeValue(REVIEW_CHANGES_TOOL_NAME)}.`,\n\t\t\t`- If review finds issues, fix them silently and review again. If the work is complete, summarize.`,\n\t\t\t`- Reuse ids you introduced earlier in the same implementation flow instead of rereading solely to resolve them.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Capability Gate\",\n\t\t\t`If the request is clearly outside the capabilities of the documented ${escapeValue(PROJECT_UPDATE_LABEL)} commands or tools, decline instead of experimenting.`,\n\t\t\t`If the user intent is critically ambiguous, use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} before declining or implementing.`,\n\t\t\t\"Reply in one concise plain-text message that the capability is not supported here, then redirect to a supported Framer alternative if one is obvious.\",\n\t\t),\n\t\t...buildAppMessages(model, source),\n\t)\n}\n", "export default \"// src/app/ai/agents/prompt/bundled/scripts.ts?bundle\\nasync function findTextContentFragments() {\\n  const text = await api.tree.getNodesOfTypes(\\\"RichTextNode\\\");\\n  const results = text.filter((node) => /<search-string>/u.test(getInnerText(node)));\\n  const fragments = await api.serializeNodes(results, { ancestorPath: true });\\n  return api.paginate(fragments);\\n}\\nasync function findExistingIcons() {\\n  const icons = await api.tree.getNodesOfTypes(\\\"IconNode\\\");\\n  const iconsBySet = {};\\n  for (const icon of icons) {\\n    iconsBySet[icon.set] ??= [];\\n    iconsBySet[icon.set]?.push({ id: icon.id, name: icon.$control__icon });\\n  }\\n  return iconsBySet;\\n}\\nasync function findIconCandidates() {\\n  const iconSetName = \\\"<icon-set-name>\\\";\\n  const [icons, controlsByIconSetName] = await Promise.all([\\n    api.icons.list(iconSetName),\\n    api.controls.iconSets([iconSetName])\\n  ]);\\n  return {\\n    controls: controlsByIconSetName[iconSetName],\\n    menu: icons.filter((name) => /\\\\b(menu|hamburger|bars|panel)\\\\b/iu.test(name)).slice(0, 8),\\n    leftArrows: icons.filter((name) => /\\\\bleft\\\\b/iu.test(name) && /\\\\b(?:arrow|chevron)\\\\b/iu.test(name)).filter((name) => !/\\\\b(right|up|down)\\\\b/iu.test(name)).slice(0, 8),\\n    settings: icons.filter((name) => /\\\\b(settings?|gear|sliders?|faders?|adjustments?)\\\\b/iu.test(name)).filter((name) => !/\\\\b(slash|x|warning)\\\\b/iu.test(name)).slice(0, 8)\\n  };\\n}\\nasync function replaceTextInProject() {\\n  const textNodes = await api.tree.getNodesOfTypes(\\\"TextBlock\\\");\\n  const result = [];\\n  for (const node of textNodes) {\\n    const replaced = await api.replaceText(node, \\\"<old-string>\\\", \\\"<new-string>\\\");\\n    result.push({ id: node.id, replaced });\\n  }\\n  return result;\\n}\\nasync function getTextWithinNode() {\\n  const root = await api.tree.getNode(\\\"<target-node-id>\\\");\\n  if (!root) return [];\\n  const matches = [];\\n  for (const { node } of walkWithSkipChildren(root)) {\\n    if (node.type !== \\\"RichTextNode\\\") continue;\\n    matches.push({ id: node.id, text: getInnerText(node) });\\n  }\\n  return matches;\\n}\\nasync function findTextWithColor() {\\n  const textNodes = await api.tree.getNodesOfTypes(\\\"RichTextNode\\\", \\\"TextRun\\\", \\\"TextBlock\\\");\\n  return textNodes.filter((node) => node.attributes?.color === \\\"<search-color>\\\");\\n}\\nasync function countNodesOfType() {\\n  const nodes = await api.tree.getNodesOfTypes(\\\"WebPageNode\\\");\\n  return { count: nodes.length };\\n}\\nasync function readSitemap() {\\n  const pathFilter = \\\"\\\";\\n  const pages = await api.tree.getNodesOfTypes(\\\"WebPageNode\\\");\\n  const sitemap = [];\\n  for (const page of pages) {\\n    const path = page.$path;\\n    if (!path) continue;\\n    if (pathFilter && !path.includes(pathFilter)) continue;\\n    sitemap.push({ id: page.id, path });\\n  }\\n  return api.paginate(sitemap);\\n}\\nasync function readPageOrBreakpoint() {\\n  const page = await api.tree.getNode(\\\"<target-page-or-breakpoint-id>\\\");\\n  if (!page) return null;\\n  if (typeof page.$layoutTemplateId !== \\\"string\\\") {\\n    return page;\\n  }\\n  const layoutTemplate = await api.tree.getNode(page.$layoutTemplateId);\\n  if (!layoutTemplate) {\\n    return page;\\n  }\\n  return {\\n    page,\\n    layoutTemplate: await api.serialize(layoutTemplate, { depth: 2 })\\n  };\\n}\\nasync function findNestedPathWebPageNode() {\\n  const pages = await api.tree.getNodesOfTypes(\\\"WebPageNode\\\");\\n  return pages.find((node) => node.$path?.includes(\\\"/:\\\"));\\n}\\nasync function paginateLargeArray() {\\n  const largeArray = await api.tree.getNodesOfTypes(\\\"FrameNode\\\");\\n  const fragments = await api.serializeNodes(largeArray, { depth: 1 });\\n  const page = await api.paginate(fragments);\\n  return page;\\n}\\nasync function createCmsItemsFromImportFile() {\\n  const collectionId = \\\"<collection-node-id>\\\";\\n  const parsed = await api.files.parseCsv(\\\"<file-id-or-name>\\\", { asObjects: true, skipEmptyLines: true });\\n  const csvColumnsToCollectionColumns = {\\n    // someCsvKey: \\\"$control__someCollectionVariableId\\\",\\n  };\\n  const commands = [];\\n  for (const [rowIndex, row] of parsed.entries()) {\\n    const itemId = `item-${rowIndex}`;\\n    commands.push(`+CollectionItemNode ${itemId} parent=\\\"${collectionId}\\\";`);\\n    const setAttributes = [];\\n    for (const [key, value] of Object.entries(row)) {\\n      const control = csvColumnsToCollectionColumns[key];\\n      if (!control) continue;\\n      if (value === void 0 || value === null) continue;\\n      setAttributes.push(`${control}=\\\"${value}\\\"`);\\n    }\\n    if (setAttributes.length > 0) commands.push(`SET ${itemId} ${setAttributes.join(\\\" \\\")};`);\\n  }\\n  return api.updateProject(commands.join(\\\" \\\"));\\n}\\nasync function createCmsItemsFromUrl() {\\n  const collectionId = \\\"<collection-node-id>\\\";\\n  const sourceFieldToCollectionColumn = {\\n    title: \\\"$control__titleVariableId\\\",\\n    description: \\\"$control__descriptionVariableId\\\",\\n    url: \\\"$control__urlVariableId\\\"\\n  };\\n  const response = await fetch(\\\"<public-json-source-url>\\\");\\n  if (!response.ok) return { ok: false, status: response.status, url: response.url, type: response.contentType };\\n  const payload = await response.json();\\n  let sourceItems = [];\\n  if (Array.isArray(payload)) {\\n    sourceItems = payload;\\n  } else if (typeof payload === \\\"object\\\" && payload !== null) {\\n    const payloadItems = payload.items;\\n    if (Array.isArray(payloadItems)) sourceItems = payloadItems;\\n  }\\n  if (sourceItems.length === 0) {\\n    return {\\n      ok: false,\\n      reason: \\\"No results\\\"\\n    };\\n  }\\n  const commands = [];\\n  for (const [itemIndex, sourceItem] of sourceItems.entries()) {\\n    if (typeof sourceItem !== \\\"object\\\" || sourceItem === null || Array.isArray(sourceItem)) continue;\\n    const sourceRecord = sourceItem;\\n    const itemId = `url-item-${itemIndex}`;\\n    commands.push(`+CollectionItemNode ${itemId} parent=\\\"${collectionId}\\\";`);\\n    const setAttributes = [];\\n    for (const [sourceField, control] of Object.entries(sourceFieldToCollectionColumn)) {\\n      const value = sourceRecord[sourceField];\\n      if (value === void 0 || value === null || value === \\\"\\\") continue;\\n      const stringValue = typeof value === \\\"string\\\" ? value : JSON.stringify(value);\\n      setAttributes.push(`${control}=\\\"${stringValue}\\\"`);\\n    }\\n    if (setAttributes.length > 0) commands.push(`SET ${itemId} ${setAttributes.join(\\\" \\\")};`);\\n  }\\n  const changed = await api.updateProject(commands.join(\\\" \\\"));\\n  return { created: sourceItems.length, changedIds: changed.map((node) => node.id) };\\n}\\nasync function createCmsRichTextTable() {\\n  const target = \\\"<rich-text-target>\\\";\\n  const rows = [\\n    [\\\"Plan\\\", \\\"Price\\\", \\\"Best for\\\"],\\n    [\\\"Starter\\\", \\\"$19\\\", \\\"Small teams\\\"],\\n    [\\\"Pro\\\", \\\"$49\\\", \\\"Growing companies\\\"]\\n  ];\\n  const commands = [`+TextTable table1 parent=\\\"${target}\\\";`];\\n  rows.forEach((cells, rowIndex) => {\\n    const rowId = `table1-row-${rowIndex}`;\\n    commands.push(`+TextTableRow ${rowId} parent=\\\"table1\\\";`);\\n    cells.forEach((text, cellIndex) => {\\n      const cellId = `${rowId}-cell-${cellIndex}`;\\n      const blockId = `${cellId}-block`;\\n      const runId = `${cellId}-text`;\\n      const cellType = rowIndex === 0 ? ` cellType=\\\"header\\\"` : \\\"\\\";\\n      commands.push(`+TextTableCell ${cellId} parent=\\\"${rowId}\\\"${cellType};`);\\n      commands.push(`+TextBlock ${blockId} parent=\\\"${cellId}\\\" tag=\\\"p\\\";`);\\n      commands.push(`+TextRun ${runId} parent=\\\"${blockId}\\\";`);\\n      commands.push(`SET ${runId} text=\\\"${text}\\\";`);\\n    });\\n  });\\n  const changed = await api.updateProject(commands.join(\\\" \\\"));\\n  return api.serializeNodes(changed, { depth: 2 });\\n}\\nasync function findComponents() {\\n  const components = await api.tree.getNodesOfTypes(\\\"ComponentNode\\\");\\n  const buttons = components.filter((node) => /\\\\b(?:button|btn|cta|call\\\\s*to\\\\s*action)\\\\b/iu.test(node.name));\\n  const fragments = await api.serializeNodes(buttons, { depth: 2 });\\n  return api.paginate(fragments);\\n}\\nasync function replaceColorsOnPage() {\\n  const page = await api.tree.getNode(\\\"<tree-to-search-id>\\\");\\n  if (!page) return null;\\n  const updates = [];\\n  for (const { node } of walkWithSkipChildren(page)) {\\n    if (node.fill !== \\\"<search-color-code>\\\") continue;\\n    updates.push({ id: node.id, fill: \\\"<replacement-color-code>\\\" });\\n  }\\n  if (updates.length === 0) return null;\\n  const result = await api.updateProject(updates.map((update) => `SET ${update.id} fill=\\\"${update.fill}\\\";`).join(\\\" \\\"));\\n  return api.serializeNodes(result, { depth: 1, attributeFilter: [\\\"fill\\\"] });\\n}\\nasync function countUniqueCollectionReferences() {\\n  const collection = await api.tree.getNode(\\\"<collection-node-id>\\\");\\n  if (!collection) return null;\\n  const results = {};\\n  for (const { node } of walkWithSkipChildren(collection)) {\\n    if (!Array.isArray(node.$control__categories)) continue;\\n    for (const categoryId of node.$control__categories) {\\n      if (!categoryId) continue;\\n      const reference = await api.tree.getNode(categoryId);\\n      if (!reference) continue;\\n      const existing = results[reference.id] ?? { name: reference.name, count: 0 };\\n      existing.count++;\\n      results[reference.id] = existing;\\n    }\\n  }\\n  return results;\\n}\\nasync function listCmsCollections() {\\n  const collections = await api.tree.getNodesOfTypes(\\\"CollectionNode\\\");\\n  const serialized = await Promise.all(\\n    collections.map(async (collection) => api.serialize(collection, { attributeFilter: [\\\"name\\\", \\\"$itemCount\\\"] }))\\n  );\\n  return api.paginate(serialized);\\n}\\nasync function listLayoutTemplates() {\\n  const templates = await api.tree.getNodesOfTypes(\\\"LayoutTemplateNode\\\");\\n  const serialized = await Promise.all(templates.map((node) => api.serialize(node, { depth: 2 })));\\n  return api.paginate(serialized);\\n}\\nasync function extractDesignPatterns() {\\n  const patterns = await api.extractDesignPatterns([\\n    \\\"<reference-page-id>\\\",\\n    \\\"<reference-page-id2>\\\",\\n    \\\"<reference-page-id3>\\\"\\n  ]);\\n  const buttonPattern = patterns.components?.find((pattern) => /button/iu.test(pattern.role));\\n  const example = buttonPattern?.examples[0];\\n  if (!example) return patterns;\\n  return {\\n    pattern: buttonPattern,\\n    exampleNode: await api.serialize(example, {\\n      depth: 2,\\n      ancestorPath: true\\n    })\\n  };\\n}\\nasync function duplicateDesignPatternExample() {\\n  const patterns = await api.extractDesignPatterns([\\n    \\\"<reference-page-id>\\\",\\n    \\\"<reference-page-id2>\\\",\\n    \\\"<reference-page-id3>\\\"\\n  ]);\\n  const cardPattern = patterns.radii?.find((pattern) => /card/iu.test(pattern.role));\\n  const example = cardPattern?.examples[0];\\n  if (!example) return patterns;\\n  const changed = await api.updateProject(`DUPE ${example} newId=\\\"referenceCardCopy\\\" parent=\\\"<target-parent-id>\\\";`);\\n  return api.serializeNodes(changed, { depth: 2 });\\n}\\nasync function changeMultiReferenceVariableToString() {\\n  const collection = await api.tree.getNode(\\\"<source-collection-id>\\\");\\n  if (!collection) {\\n    throw new Error(\\\"Source collection not found\\\");\\n  }\\n  const oldVariableId = \\\"<old-multi-reference-variable-id>\\\";\\n  const oldVariableValueAttribute = \\\"$control__<slugified-old-variable-name>\\\";\\n  const newVariableId = \\\"<new-string-variable-id>\\\";\\n  const newVariableName = \\\"<New variable name>\\\";\\n  const referencedCollectionId = \\\"<referenced-collection-id>\\\";\\n  const referencedLabelAttribute = \\\"$control__<referenced-label-variable-name>\\\";\\n  const variables = collection.variables;\\n  const oldVariablePosition = variables.findIndex((variable) => variable.id === oldVariableId);\\n  if (oldVariablePosition < 0) {\\n    throw new Error(`Variable ${oldVariableId} not found in collection ${collection.id}`);\\n  }\\n  const referencedCollection = await api.tree.getNode(referencedCollectionId);\\n  if (!referencedCollection) {\\n    throw new Error(`Referenced collection ${referencedCollectionId} not found`);\\n  }\\n  const setCommands = [];\\n  for (const { node } of walkWithSkipChildren(collection)) {\\n    const referenceIds = node.attributes?.[oldVariableValueAttribute];\\n    if (!referenceIds?.length) continue;\\n    const labels = await Promise.all(\\n      referenceIds.map(async (id) => {\\n        const node2 = await api.tree.getNode(id);\\n        if (!node2) return null;\\n        return node2.attributes?.[referencedLabelAttribute] ?? id;\\n      })\\n    );\\n    const value = labels.filter(Boolean).join(\\\", \\\");\\n    setCommands.push(`SET ${node.id} $control__${newVariableId}=\\\"${value}\\\";`);\\n  }\\n  const commands = [\\n    `+Variable ${newVariableId} name=${JSON.stringify(newVariableName)} type=\\\"string\\\" scope=\\\"${collection.id}\\\";`,\\n    `MOVE ${newVariableId} parent=\\\"${collection.id}\\\" position=\\\"${oldVariablePosition}\\\";`\\n  ];\\n  commands.push(...setCommands, `DEL ${oldVariableId};`);\\n  return api.updateProject(commands.join(\\\" \\\"));\\n}\\nexport {\\n  changeMultiReferenceVariableToString,\\n  countNodesOfType,\\n  countUniqueCollectionReferences,\\n  createCmsItemsFromImportFile,\\n  createCmsItemsFromUrl,\\n  createCmsRichTextTable,\\n  duplicateDesignPatternExample,\\n  extractDesignPatterns,\\n  findComponents,\\n  findExistingIcons,\\n  findIconCandidates,\\n  findNestedPathWebPageNode,\\n  findTextContentFragments,\\n  findTextWithColor,\\n  getTextWithinNode,\\n  listCmsCollections,\\n  listLayoutTemplates,\\n  paginateLargeArray,\\n  readPageOrBreakpoint,\\n  readSitemap,\\n  replaceColorsOnPage,\\n  replaceTextInProject\\n};\\n\"", "import { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport type { Source } from \"../source.ts\"\nimport { REVIEW_CHANGES_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { APPLY_AGENT_CHANGES_API_METHOD, forSource, toolReference } from \"./promptEnv.ts\"\nimport { escapeValue } from \"./utils.ts\"\n\n/**\n * Rules that define *when* the agent must (or must not) call the review-changes capability.\n * Consumed by both the phase-flow preamble in `response.ts` and the review-changes tool\n * description in `tools.ts`. Each caller is responsible for its own bullet/indent formatting.\n */\nexport function buildReviewChangesRules(source: Source) {\n\tconst reviewRef = toolReference(source, REVIEW_CHANGES_TOOL_NAME)\n\treturn [\n\t\tforSource(source, {\n\t\t\t\"in-app\": `Every implementation turn that emits one or more ${escapeValue(PROJECT_UPDATE_LABEL)} blocks **must** be finalized by reviewing the changes with ${reviewRef}.`,\n\t\t\tlocal: `Every implementation turn that makes one or more ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} calls **must** be finalized by reviewing the changes with ${reviewRef}.`,\n\t\t}),\n\t\tforSource(source, {\n\t\t\t\"in-app\": `If no ${escapeValue(PROJECT_UPDATE_LABEL)} block was emitted in the turn (for example, clarification-only, planning-only, or blocked turns), do not force a ${reviewRef} call in that turn.`,\n\t\t\tlocal: `If no ${escapeValue(APPLY_AGENT_CHANGES_API_METHOD)} call was made in the turn (for example, clarification-only, planning-only, or blocked turns), do not force a ${reviewRef} call in that turn.`,\n\t\t}),\n\t]\n}\n", "import { assertNever, emptyArray } from \"@framerjs/shared\"\nimport dedent from \"dedent\"\nimport type { ShaderKey } from \"document/components/chrome/insertSidebar/dataSources/items/shaderItems.ts\"\nimport { join } from \"utils/join.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { DESIGN_PLAN_LABEL, PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { Components, CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME } from \"../context/components.ts\"\nimport { type FontSearchOptions, fontDescriptorDescriptions } from \"../context/fonts/queryFonts.ts\"\nimport { metadataTags } from \"../context/metadataTags.ts\"\nimport { serializeVirtualMetadata } from \"../context/nodes.ts\"\nimport { Shaders, type ShadersJsonDefinition } from \"../context/shaders.ts\"\nimport { VectorSets } from \"../context/vectors.ts\"\nimport {\n\tComponentNodeClass,\n\tCommandType,\n\tDismissOverlayActionName,\n\tIconNodeClass,\n\tSetVariantActionName,\n\tShowOverlayActionName,\n\tTextBlockClass,\n\tTextComponentInstanceClass,\n\tTextRunClass,\n\tComponentInstanceNodeClass,\n} from \"../dsl.ts\"\nimport type { Source } from \"../source.ts\"\nimport {\n\tMAX_ANSWER_WORD_COUNT,\n\tMAX_QUESTIONS,\n\tMIN_ANSWER_WORD_COUNT,\n\tMIN_QUESTIONS,\n\tSKIPPED_ANSWER,\n} from \"../tools/askClarification.ts\"\nimport { canUseChecklistTools } from \"../tools/checklistPolicy.ts\"\nimport { SUCCESS_STATUS as CREATE_COMPONENT_FROM_FRAME_SUCCESS_STATUS } from \"../tools/createComponentFromFrame.ts\"\nimport {\n\tBLOCKED_STATUS as FLATTEN_BLOCKED_STATUS,\n\tSUCCESS_STATUS as FLATTEN_SUCCESS_STATUS,\n\tREPLACEMENT_ID_FIELD,\n} from \"../tools/flattenComponentInstance.ts\"\nimport {\n\tBLOCKED_STATUS,\n\tNEEDS_CONFIRMATION_STATUS,\n\tREPLACE_ALL_FIELD,\n\tSUCCESS_STATUS,\n} from \"../tools/makeExternalComponentLocal.ts\"\nimport { CONFIRM_PUBLISH_ACTION, DEPLOY_TO_PRODUCTION_ACTION, PREVIEW_ACTION } from \"../tools/publish.ts\"\nimport { AVAILABLE_IMAGE_SOURCES } from \"../tools/queryImages.ts\"\nimport { createQuery, readProjectQueries } from \"../tools/readProject.ts\"\nimport {\n\tCOMPONENT_DEFINITION_QUERY,\n\tFONT_SEARCH_QUERY,\n\tICON_SET_DEFINITION_QUERY,\n\tIMPLEMENTATION_GUIDE_FROM_INDEX_QUERY,\n\tSHADER_DEFINITION_QUERY,\n\tSCREENSHOT_QUERY,\n} from \"../tools/readProjectQueryTypes.ts\"\nimport {\n\tASK_CLARIFICATION_TOOL_NAME,\n\tCHECKLIST_COMPLETE_TASK_TOOL_NAME,\n\tCHECKLIST_CREATE_TOOL_NAME,\n\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n\tVIEW_IMAGE_TOOL_NAME,\n} from \"../tools/toolNames.ts\"\nimport { VIEW_IMAGE_MAX_URLS } from \"../tools/viewImage.ts\"\nimport scriptExamplesSource from \"./bundled/scripts.ts?bundle\"\nimport { buildChecklistToolPrompts } from \"./checklist.ts\"\nimport { creationStrategyPhaseLabels, implementationStrategySectionNames } from \"./implementationNames.ts\"\nimport { Markdown, type MarkdownBlock } from \"./markdown.ts\"\nimport {\n\tAPPLY_AGENT_CHANGES_API_METHOD,\n\tforSource,\n\tGET_AGENT_CONTEXT_API_METHOD,\n\tTOOL_TO_API_METHOD,\n\ttoolReference,\n} from \"./promptEnv.ts\"\nimport { buildReviewChangesRules } from \"./protocolRules.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { escapeValue, referenceScript, traitReference } from \"./utils.ts\"\n\nexport const REDACTED_EXAMPLE_MESSAGE = \"[REDACTED]\"\n\nenum ToolsPromptDictionary {\n\tFontDescriptorsDocs = \"Key Font Descriptors (non exhaustive)\",\n}\n\nconst iconSetDefinitionQuery = (source: Source) =>\n\tjoin.lines(\n\t\t`**Before** adding or modifying any icon, the ${escapeValue(`<${VectorSets.iconSetDefinitionTag}>`)} for the relevant set **must** already be in context.`,\n\t\t`If it is not present, call ${toolReference(source, READ_PROJECT_TOOL_NAME)} with an ${escapeValue(`\"${ICON_SET_DEFINITION_QUERY}\"`)} query.`,\n\t\t`The response provides the available icon names and controls for icons in the set.`,\n\t\t`- Never guess icon names \u2014 always request the exact list first.`,\n\t\t`- Use ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)} to find the target set name.`,\n\t)\n\nconst fontSearchQuery = [\n\t`Query searches Framer's full font library for fonts not in ${escapeValue(`<${metadataTags.availableFonts}>`)}, including Google Fonts, Fontshare, open-source fonts, and user-uploaded custom project fonts.`,\n\t`The fonts in ${escapeValue(`<${metadataTags.availableFonts}>`)} are general-purpose defaults. They do NOT convey themed aesthetics or specialized typography on their own.`,\n\t`Use ${escapeValue<FontSearchOptions>(\"name\")} to find a specific font by name. Use ${escapeValue<FontSearchOptions>(\"query\")} to find fonts matching a style description. Never use both together.`,\n\t`For ${escapeValue<FontSearchOptions>(\"query\")}, build a compact description using 2-5 keywords (e.g., \"wedding elegant romantic script\", \"rock concert grunge bold\", \"playful rounded kids\", \"creative unique display\").`,\n\t`For creation strategy, derive inferred typography from your current refined plan, not from the initial user wording alone.`,\n\t`Translate the refined plan into ${escapeValue(\"query\")} keywords plus objective constraints in ${escapeValue<FontSearchOptions>(\"mustHave\")} when applicable.`,\n\t`For image recreation and visual-reference prompts that likely include text, call ${escapeValue(JSON.stringify(createQuery({ type: FONT_SEARCH_QUERY, query: \"<inferred-typography>\", limit: 5 })))} before emitting text nodes.`,\n\t`${escapeValue(FONT_SEARCH_QUERY)} must be its own query object. Never represent a font lookup as ${escapeValue(\n\t\tJSON.stringify(createQuery({ type: IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY, name: FONT_SEARCH_QUERY })),\n\t)}.`,\n\t`Use **Font Descriptors** for objective requirements:`,\n\t`- ${escapeValue<FontSearchOptions>(\"name\")}: a specific font family name (e.g., \"Roboto\"). Mutually exclusive with ${escapeValue(\"query\")}.`,\n\t`- ${escapeValue<FontSearchOptions>(\"query\")}: subjective style intent for LLM-based matching. Requires ${escapeValue<FontSearchOptions>(\"limit\")}.`,\n\t`- ${escapeValue<FontSearchOptions>(\"mustHave\")}: descriptors explicitly required by the user (e.g., \"italic serif\" -> [\"italic\", \"serif\"]). **Do not** put these requirements only in ${escapeValue(\"query\")}\u2014they must appear in ${escapeValue<FontSearchOptions>(\"mustHave\")}.`,\n\t`- If the user specifies or implies objective descriptors (e.g., italic/serif/variable/weight cues), encode them in ${escapeValue<FontSearchOptions>(\"mustHave\")} for ${escapeValue(FONT_SEARCH_QUERY)}; listing them only in ${escapeValue(\"query\")} is insufficient.`,\n\t`- ${escapeValue<FontSearchOptions>(\"mustHaveAlternativeCharacters\")}: characters the user wants to have multiple options for via OpenType Stylistic Sets or Character Variants (e.g., \"t\", \"6\"). **Do not** put these requirements only in ${escapeValue(\"query\")}\u2014they must appear in ${escapeValue<FontSearchOptions>(\"mustHaveAlternativeCharacters\")}.`,\n\t`- For a direct request like ${escapeValue(`\"use Roboto\"`)} use ${escapeValue(JSON.stringify(createQuery({ type: FONT_SEARCH_QUERY, name: \"Roboto\" })))}.`,\n\t`- For ${escapeValue(`\"modern page with serif variable width font with glyph options for t and 6\"`)} use ${escapeValue(\n\t\tJSON.stringify(\n\t\t\tcreateQuery({\n\t\t\t\ttype: FONT_SEARCH_QUERY,\n\t\t\t\tquery: \"modern page typography\",\n\t\t\t\tlimit: 5,\n\t\t\t\tmustHave: [\"serif\", \"variation-axis/wdth\"],\n\t\t\t\tmustHaveAlternativeCharacters: [\"t\", \"6\"],\n\t\t\t}),\n\t\t),\n\t)}.`,\n\t`${escapeValue(JSON.stringify(createQuery({ type: FONT_SEARCH_QUERY, query: \"modern serif\", limit: 5, mustHave: [\"italic\", \"serif\"] })))}`,\n\t`${ToolsPromptDictionary.FontDescriptorsDocs}:`,\n\t...Object.entries(fontDescriptorDescriptions).map(\n\t\t([descriptor, description]) => `- ${escapeValue(descriptor)}: ${description}`,\n\t),\n\n\t// TODO ...\n\tMarkdown.section(\n\t\t\"Follow-ups\",\n\t\t\"Treat earlier typography constraints as still active unless the user explicitly changes them.\",\n\t),\n]\n\nconst componentDefinitionQuery = join.lines(\n\t`Use ${escapeValue(`\"${COMPONENT_DEFINITION_QUERY}\"`)} when you need a component's controls, variants, or icon-control metadata.`,\n\t`Use the component ${escapeValue(\"id\")} from ${escapeValue(`<${Components.metadataTag}>`)}:`,\n\t`${escapeValue(JSON.stringify(createQuery({ type: COMPONENT_DEFINITION_QUERY, id: \"<card-id>\" })))}`,\n\t`Use the returned ${escapeValue(\"id\")} for ${escapeValue(\"componentPreset.<id>\")} when controls are marked ${escapeValue(\"onlyPresets\")}.`,\n\t`Component presets for rich text embeds are assigned to the ${escapeValue(ClassDiscriminator.RichTextNode)} that owns the rich text field, not to individual ${escapeValue(TextComponentInstanceClass)} embeds.`,\n)\n\nconst shaderSearchQuery = join.lines(\n\t`Use ${escapeValue(`\"${SHADER_DEFINITION_QUERY}\"`)} to find a shader's full definition before adding a ${escapeValue(\"ShaderNode\")}.`,\n\t`Use the shader name from ${escapeValue(`<${Shaders.availableShadersTag}>`)} (e.g., ${escapeValue<ShaderKey>(\"liquid-gradient\")}).`,\n\t`If a matching ${escapeValue(`<${Shaders.shaderDefinitionsTag}>`)} metadata tag is already present, use it. Otherwise request ${escapeValue(`\"${SHADER_DEFINITION_QUERY}\"`)} to get the shader's full controls.`,\n\t`Example: ${escapeValue(JSON.stringify(createQuery({ type: SHADER_DEFINITION_QUERY, name: \"liquid-gradient\" })))}`,\n\t`After finding a shader, use its ${escapeValue<ShadersJsonDefinition>(\"name\")} to add the ${escapeValue(ClassDiscriminator.ShaderNode)}`,\n)\n\nconst externalUrlGuidance = `Only public ${escapeValue(\"http\")} and ${escapeValue(\"https\")} URLs are allowed. Private, local-network, and internal addresses are blocked.`\n\nfunction getScreenshotQuery(source: Source): string {\n\treturn join.lines(\n\t\t`Use ${escapeValue(`\"${SCREENSHOT_QUERY}\"`)} to request a screenshot of a node, page or external url to get a visual reference for your changes.`,\n\t\t`- When inspecting a ${escapeValue(ComponentNodeClass)}, you should request screenshots of the specific Variant ids you want to validate.`,\n\t\t...forSource(source, {\n\t\t\t\"in-app\": [\n\t\t\t\t`- Prefer ${escapeValue(`\"${SCREENSHOT_QUERY}\"`)} over ${escapeValue(`\"${FETCH_EXTERNAL_URL_TOOL_NAME}\"`)} when inspecting the design of an external url.`,\n\t\t\t],\n\t\t\tlocal: emptyArray<string>(),\n\t\t}),\n\t\t`- ${externalUrlGuidance}`,\n\t\t`- To screenshot the live site for this project (e.g. to compare the canvas against what is currently deployed), first call ${toolReference(source, PUBLISH_TOOL_NAME)} with ${escapeValue(JSON.stringify({ action: PREVIEW_ACTION }))} and reuse the returned ${escapeValue(\"staging\")} or ${escapeValue(\"production\")} url as the ${escapeValue(\"url\")} for this query. Do not guess or fabricate project-specific hostnames.`,\n\t\t`- If an external url screenshot request fails or does not provide enough information, ask the user to provide their own screenshot.`,\n\t)\n}\n\nconst reviewChanges = (source: Source) => dedent`\n\t${join.linesFrom([\n\t\t...buildReviewChangesRules(source).map(rule => `- ${rule}`),\n\t\t`- If any ${forSource(source, {\n\t\t\t\"in-app\": escapeValue(PROJECT_UPDATE_LABEL),\n\t\t\tlocal: escapeValue(APPLY_AGENT_CHANGES_API_METHOD),\n\t\t})} ${forSource(source, { \"in-app\": \"blocks\", local: \"calls\" })} resulted in warnings/errors, the response will include them.`,\n\t\tforSource(source, {\n\t\t\t\"in-app\": undefined,\n\t\t\tlocal: `- Reviews are scoped to ${escapeValue(\"pagePath\")}, so pass the ${escapeValue(\"pagePath\")} of the page whose changes you want to review.`,\n\t\t}),\n\t\tforSource(source, {\n\t\t\t\"in-app\": undefined,\n\t\t\tlocal: `- Always read the **entire** response \u2014 do not filter or pick specific attributes. The response includes the resolved change diff, diagnostics, and deferred commands.`,\n\t\t}),\n\t])}\n\t- If the response includes errors or warnings, resolve each item before proceeding to another part of the request. Carefully ensure you resolve items that are related to, but not created by your changes.\n\t- The response may include a list of ${escapeValue(\"deferred\")} commands that failed because of an error or an unmet precondition (e.g. linking to a page not yet created). These are automatically retried after executing each subsequent command, hoping you will fix the underlying cause. Fix the underlying cause but do not re-issue the deferred command. Deferred commands disappear after succeeding.\n\t- Do not explain review findings in plain text. Continue with tools or edits, or summarize if the work is complete.\n`\n\ntype ProjectQueryContent = string | (string | MarkdownBlock)[]\nfunction getReadProjectQuerySections(\n\tsource: Source,\n): Record<(typeof readProjectQueries)[number], ProjectQueryContent | (() => ProjectQueryContent)> {\n\treturn {\n\t\t[ICON_SET_DEFINITION_QUERY]: iconSetDefinitionQuery(source),\n\t\t[FONT_SEARCH_QUERY]: fontSearchQuery,\n\t\t[COMPONENT_DEFINITION_QUERY]: componentDefinitionQuery,\n\t\t[SHADER_DEFINITION_QUERY]: shaderSearchQuery,\n\t\t[SCREENSHOT_QUERY]: getScreenshotQuery(source),\n\t\t// TODO: add instructions\n\t\t[IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY]: \"\",\n\t}\n}\n\nfunction getReadProjectQuerySection(query: (typeof readProjectQueries)[number], source: Source): MarkdownBlock | null {\n\tlet contentOrFn = getReadProjectQuerySections(source)[query]\n\tif (!contentOrFn) return null\n\tif (typeof contentOrFn === \"function\") contentOrFn = contentOrFn()\n\tif (Array.isArray(contentOrFn)) return Markdown.section(`\"${query}\"`, ...contentOrFn)\n\treturn Markdown.section(`\"${query}\"`, contentOrFn)\n}\n\nfunction buildReadProjectToolPrompt(source: Source) {\n\tconst toolRef = toolReference(source, READ_PROJECT_TOOL_NAME)\n\tconst introLines = forSource(source, {\n\t\t\"in-app\": [\n\t\t\t`${toolRef} can be used when the active strategy and phase require information from the system about the project.`,\n\t\t\t`- When the current context does not provide enough information - always use ${toolRef} instead of guessing.`,\n\t\t\t`- ${toolRef} should be used with a ${escapeValue(\"queries\")} array of queries - there is no query limit.`,\n\t\t\t`- Efficiently combine queries when they belong to the same implementation phase.`,\n\t\t\t`- Do not frontload all query types in the first call when strategy instructions require phased execution.`,\n\t\t\t`- Creation strategy: before the ${escapeValue(DESIGN_PLAN_LABEL)} block, use ${toolRef} only for destination/page context; do not include ${escapeValue(FONT_SEARCH_QUERY)}, ${escapeValue(ICON_SET_DEFINITION_QUERY)}, or ${escapeValue(IMPLEMENTATION_GUIDE_FROM_INDEX_QUERY)} until after the plan is closed and before ${AgentSystemPromptDictionary.ImplementAndReview}.`,\n\t\t\t`- In refinement, avoid drifting into generic defaults and keep decisions grounded in the brief and project context.`,\n\t\t\t`- Tool arguments must be a complete valid JSON object (no partial arrays/objects and no truncated query entries).`,\n\t\t\t`- Merge directives into query lists per phase, not as a single preflight mega-call.`,\n\t\t\t`- The system will respond with an array of ${escapeValue(\"queryResults\")} for each query, and may optionally include a ${escapeValue(\"systemState\")} object that contains critical messages from the system in response to the queries.`,\n\t\t\t`- Remember: Tool Results are the results of your action. **Never** praise the user for the contents of tool results.`,\n\t\t],\n\t\tlocal: [\n\t\t\t`Call ${toolRef} to read information from the project. Pass an array of ${escapeValue(\"queries\")}; there is no query limit.`,\n\t\t\t`- When the project context does not contain the data you need, call ${toolRef} rather than guessing.`,\n\t\t\t`- Efficiently combine queries that belong to the same implementation phase into a single call.`,\n\t\t\t`- The return value is an array of ${escapeValue(\"queryResults\")} matching the input queries order, plus an optional ${escapeValue(\"systemState\")} object with critical messages.`,\n\t\t],\n\t})\n\treturn Markdown.section(\n\t\tforSource(source, { \"in-app\": READ_PROJECT_TOOL_NAME, local: TOOL_TO_API_METHOD[READ_PROJECT_TOOL_NAME] }),\n\t\t...introLines,\n\t\tMarkdown.section(\n\t\t\t\"Available Queries\",\n\t\t\t\"The following queries are available to you:\",\n\t\t\tjoin.linesFrom(readProjectQueries.map(query => `- \"${query}\"`)),\n\t\t),\n\t\t...readProjectQueries.map(query => getReadProjectQuerySection(query, source)).filter(item => item !== null),\n\t)\n}\n\nconst reviewChangesTool = (source: Source) =>\n\tMarkdown.section(\n\t\tforSource(source, { \"in-app\": REVIEW_CHANGES_TOOL_NAME, local: TOOL_TO_API_METHOD[REVIEW_CHANGES_TOOL_NAME] }),\n\t\treviewChanges(source),\n\t)\n\nfunction buildAskClarificationToolPrompt() {\n\treturn Markdown.section(\n\t\tASK_CLARIFICATION_TOOL_NAME,\n\t\t`Use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} to resolve unresolved intent or narrow an active design branch before planning or implementation.`,\n\t\t`- For page routing, follow the \"${AgentSystemPromptDictionary.WorkingScope}\" section as the source of truth. When it says the destination is still unresolved, call ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} before any further ${escapeValue(READ_PROJECT_TOOL_NAME)} reads.`,\n\t\t`- Do not use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} for page requests when the \"${AgentSystemPromptDictionary.WorkingScope}\" rules already resolve the destination to the current page.`,\n\t\t`- Limit yourself to the ${MIN_QUESTIONS}-${MAX_QUESTIONS} most important questions.`,\n\t\t`- Each clarification question should cover exactly one unresolved decision. Never combine multiple question types into one question.`,\n\t\t`- Do not ask compound questions that join independent decisions. Ask each decision separately, or ask the upstream decision first when the next one depends on it.`,\n\t\t`- When asking multiple questions, make them meaningfully different and request-specific.`,\n\t\t`- For creation-specific follow-up strategy and clarification cadence, follow \"${creationStrategyPhaseLabels.phase1}\" in the \"${implementationStrategySectionNames.creation}\" section.`,\n\t\t`- Never include an \"other\" or \"you tell me\" option in your suggested answers, the system will automatically append one.`,\n\t\t`- The user can skip individual questions. Skipped questions will have the answer ${escapeValue(SKIPPED_ANSWER)}. This means the user intentionally chose not to answer. Do not re-ask, rephrase, or ask new questions to fill in skipped topics. Proceed with the information you have and use your best judgment for anything the user left out.`,\n\t\tMarkdown.section(\n\t\t\t`${AgentSystemPromptDictionary.WorkingScope} Examples`,\n\t\t\t`- If the sitemap already contains ${escapeValue(\"/pricing\")} and the user says ${escapeValue('\"make me a pricing page\"')}, ask whether to ${escapeValue(\"update the existing pricing page\")} or ${escapeValue(\"create a separate new pricing page\")}. Do not inspect ${escapeValue(\"/pricing\")} or the home page first.`,\n\t\t\t`- If the user says ${escapeValue('\"turn this page into a pricing page\"')}, do not ask a routing question. The destination is the current page.`,\n\t\t\t`- If multiple pricing-like routes exist (for example ${escapeValue(\"/pricing/startup\")} and ${escapeValue(\"/pricing/enterprise\")}) and the user says ${escapeValue('\"update the pricing page\"')}, ask which existing route to update before reading either candidate, the home page, or the current page.`,\n\t\t\t`- If multiple project-like routes exist (for example ${escapeValue(\"/project-alpha\")} and ${escapeValue(\"/project-beta\")}) and the user says ${escapeValue('\"update the project page\"')}, ask which project page to update before requesting fonts/guides, planning, or implementation.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Suggested Answers\",\n\t\t\t`- Never include implementation details in your suggested answers - don't show hex/rgba colors ${escapeValue(PROJECT_UPDATE_LABEL)} syntax, etc. If these are critical details, use a long ${escapeValue(\"description\")} instead.`,\n\t\t\t`- Suggested answers for one question must be mutually exclusive options for the same decision. Keep labels parallel and at the same abstraction level.`,\n\t\t\t`- Do not hide multiple decisions in one option label.`,\n\t\t\t`- Never include first-person future-answer labels such as ${escapeValue('\"I\\'ll provide details\"')}, ${escapeValue('\"I\\'ll describe it\"')}, ${escapeValue('\"I\\'ll provide one\"')}, ${escapeValue('\"I\\'ll type it in\"')}, ${escapeValue('\"I\\'ll type the name\"')}, or ${escapeValue('\"you choose later\"')}; the system already gives the user a free-text path.`,\n\t\t\t`- Suggested answers and descriptions should be brief, clear, and cohesive.`,\n\t\t\t`- Prefer described answer objects when a short label would not explain the visible impact of the choice.`,\n\t\t\t`- Suggested answers should normally be an array of strings (${MIN_ANSWER_WORD_COUNT}-${MAX_ANSWER_WORD_COUNT} words each) that the user can choose from, for example:`,\n\t\t\tescapeValue(JSON.stringify([\"Dark mode\", \"Light mode\"])),\n\t\t\t`- Never propose suggested answers longer than ${MAX_ANSWER_WORD_COUNT} words.`,\n\t\t\t`- When you have to explain the answer in more detail, use an array of objects with an ${escapeValue(\"answer\")} string (${MIN_ANSWER_WORD_COUNT}-${MAX_ANSWER_WORD_COUNT} words each) and a long ${escapeValue(\"description\")} string.`,\n\t\t\t`- Use a long ${escapeValue(\"description\")} to provide more context and detail about the suggested answer when you need to, for example:`,\n\t\t\tescapeValue(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tanswer: \"Grid / block layout\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"The overall site structure organizes content into a clear modular grid of repeated blocks as the dominant top-level pattern. Rows and columns create a predictable system for placing self-contained content units with strong alignment, repeatability, and scannability. Sections should use this grid-based block composition as the prevailing organizational principle across the page.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\t`- Brief layout example: ${escapeValue(JSON.stringify({ answer: \"Split-screen layout\", description: \"Pair the main message with a strong side-by-side media panel.\" }))}`,\n\t\t\t`or`,\n\t\t\tescapeValue(JSON.stringify({ answer: \"Pitch Black\", description: \"#000000\" })),\n\t\t),\n\t)\n}\n\nconst fetchUrlTool = Markdown.section(\n\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\t`${escapeValue(FETCH_EXTERNAL_URL_TOOL_NAME)} fetches the content of an external public URL and returns its body text.`,\n\t`- ${externalUrlGuidance}`,\n\t`- Use this tool when the user references an external resource (documentation page, API spec, website content) that you need to inspect the content.`,\n\t`- Use ${escapeValue(SCRIPT_TOOL_NAME)} with ${escapeValue(\"fetch()\")} instead when the fetched data must be filtered, mapped, transformed, joined, or written into CMS/project nodes.`,\n\t`- Do **not** use this tool speculatively or repeatedly for the same URL within one session.`,\n\t`- Pages can be empty or missing content if they rely heavily on javascript. A follow-up ${escapeValue(`${READ_PROJECT_TOOL_NAME}`)} with ${escapeValue(`\"${SCREENSHOT_QUERY}\"`)} can be used in these cases.`,\n\t`- Prefer information already in context over fetching external URLs.`,\n\tMarkdown.section(\n\t\t\"Response fields\",\n\t\t`- ${escapeValue(\"bodyText\")}: the response body as text.`,\n\t\t`- ${escapeValue(\"error\")}: present instead of ${escapeValue(\"bodyText\")} when the request was blocked or failed.`,\n\t),\n)\n\nconst queryImagesTool = (source: Source) => {\n\tconst toolRef = toolReference(source, QUERY_IMAGES_TOOL_NAME)\n\treturn Markdown.section(\n\t\tforSource(source, { \"in-app\": QUERY_IMAGES_TOOL_NAME, local: TOOL_TO_API_METHOD[QUERY_IMAGES_TOOL_NAME] }),\n\t\t`${toolRef} searches for images to use. It returns candidate images with preview thumbnails so you can pick the best fit.`,\n\t\t`- Use ${toolRef} when the design needs stock photography, hero images, editorial photos, or any real-world imagery.`,\n\t\t`- Do **not** use ${toolRef} for design-direction inspiration.`,\n\t\t`- Use ${toolRef} selectively when creating image-led sections (e.g. galleries, photo grids, editorial spreads) so the photos stay localized instead of spreading stock imagery across the whole page.`,\n\t\t`- The tool returns an array of candidates. Each candidate includes a ${escapeValue(\"url\")} field \u2014 use that exact value in ${escapeValue(\"fill\")} attributes to apply the image.`,\n\t\t`- Pass ${escapeValue(\"width\")} as 2x the display width in pixels of the frame to be filled for best results on higher-resolution displays (read ${escapeValue(\"width\")} from the target frame's layout). Example: a 320px wide frame \u2192 ${escapeValue(\"width\")}: 640. Do not omit ${escapeValue(\"width\")} when the target frame size is known.`,\n\t\tMarkdown.section(\n\t\t\t\"Sources\",\n\t\t\t`Currently supports ${AVAILABLE_IMAGE_SOURCES} as the image source.`,\n\t\t\t`- Optionally set ${escapeValue(\"orientation\")} to ${escapeValue(`\"landscape\"`)}, ${escapeValue(`\"portrait\"`)}, or ${escapeValue(`\"squarish\"`)} when the layout needs a specific image shape.`,\n\t\t\t`- Example:`,\n\t\t\t`- ${escapeValue(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tsource: \"unsplash\",\n\t\t\t\t\tquery: \"aerial view of coastline\",\n\t\t\t\t\tcount: 3,\n\t\t\t\t\torientation: \"landscape\",\n\t\t\t\t\twidth: 1200,\n\t\t\t\t}),\n\t\t\t)}`,\n\t\t),\n\t)\n}\n\nconst viewImageTool = Markdown.section(\n\tVIEW_IMAGE_TOOL_NAME,\n\t`${escapeValue(VIEW_IMAGE_TOOL_NAME)} lets you visually inspect image URLs.`,\n\t`- Use ${escapeValue(VIEW_IMAGE_TOOL_NAME)} only when the requested outcome depends on visual judgment: recreate or match a reference, classify, sort, filter, compare, choose by appearance, critique, extract visible details, or answer questions about what is shown.`,\n\t`- Do not call ${escapeValue(VIEW_IMAGE_TOOL_NAME)} to preload, validate, order, or improve images that only need to be placed by exact URL. If no visual sorting/filtering/selection criterion is given, use the URLs in order.`,\n\t`- Do not call ${escapeValue(VIEW_IMAGE_TOOL_NAME)} when the user only wants images placed, added to CMS, swapped into fills, used in galleries/cards/portraits/backgrounds/media grids, or otherwise used by exact URL.`,\n\t`- Pass exact image URLs; do not invent, guess, autocomplete, or modify URLs.`,\n\t`- Pass at most ${VIEW_IMAGE_MAX_URLS} URLs per call. For more images, batch the calls and inspect only the subset whose appearance matters.`,\n)\n\nconst requestCodeFileChangesTool = Markdown.section(\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\t`${escapeValue(REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} requests code file creation, updates, or deletion from a coding sub-agent. Returns the sub-agent\u2019s response, plus the code files the sub-agent created, updated, or deleted, if any.`,\n\tMarkdown.section(\n\t\t\"Principles\",\n\t\t`- Framer is a no-code canvas. Canvas work stays directly editable by the user, visible in design tools, and reversible with the rest of the project. Code components are an escape hatch: once a concern moves into a file, it is opaque to canvas editing, styled only through the controls the component chose to expose, and every later tweak costs a sub-agent round-trip.`,\n\t\t`- Prefer the canvas by default. Only escalate to ${escapeValue(REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} when the request needs something the canvas cannot express. The cost of wrongly escalating is high \u2014 the user loses editability and you lose fast iteration. The cost of wrongly staying native is low \u2014 you will discover any gap mid-implementation and can then escalate.`,\n\t\t`- \"Component\" in user language is not automatically a signal for code. Framer has two kinds here: **canvas components** (${escapeValue(`+${ComponentNodeClass}`)}, canvas-native, supports variants, property controls, and event handlers) and **code components** (React files, created via this tool). Canvas components are the default \u2014 unless the user explicitly asks for a code component or code file (see below).`,\n\t),\n\tMarkdown.section(\n\t\t\"Decision Rubric\",\n\t\t`If the user explicitly asks for a code component, a code file, or names a specific file path (e.g. ${escapeValue('\".tsx\"')}), honor that intent and escalate. The three questions below cover requests phrased as behavior or appearance, not as an implementation choice.`,\n\t\t`Otherwise, ask three questions, in order. Escalate only if the answer to question 3 is \"yes\".`,\n\t\t`1. **Is the target already a code component?** Components listed in the ${escapeValue(CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME)} section of ${escapeValue(`<${Components.metadataTag}>`)} can only be modified through ${escapeValue(REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} \u2014 ${escapeValue(PROJECT_UPDATE_LABEL)} commands do not apply to those files. If the target is listed in that file-path map, use this tool with the corresponding file path.`,\n\t\t`2. **Does the request reduce to something the canvas already models?** Structure and style (layout, typography, color, spacing, borders, shadows, gradients, shaders), motion (${escapeValue(\"appearEffect\")}, ${escapeValue(\"flowEffect\")}, and ${traitReference(\"transition\")}), lists (CMS Collections and Collection Lists), page-level overlays (${escapeValue(ShowOverlayActionName)} / ${escapeValue(DismissOverlayActionName)}), and discrete interaction states (${escapeValue(ComponentNodeClass)} variants wired to ${escapeValue(SetVariantActionName)} event handlers) are all native. If the request decomposes into these, stay native. A request that sounds interactive (\"toggle\", \"expand\", \"switch tab\", \"open menu\", \"carousel\") is usually a variant switch, not code.`,\n\t\t`3. **Does the request genuinely require runtime logic the canvas cannot express?** Concrete signals that it does: live/ticking values driven by the clock, browser APIs (storage, navigator, clipboard, geolocation, file upload, media queries), calls to external services/SDKs at runtime, state that must persist across reloads, or logic whose shape is continuous rather than a small enumerable set of variants (free-form validation, dependent multi-step flows, drag-and-drop reorder with arbitrary targets). If you can articulate **which** specific capability is missing, escalate. If you cannot name it, do not escalate yet.`,\n\t\t`Rule of thumb: if you can describe the solution as a component with a fixed set of variants, property controls, and event handlers wired to ${escapeValue(SetVariantActionName)} or ${escapeValue(ShowOverlayActionName)}, it belongs on the canvas. If the description naturally reaches for ${escapeValue(\"useEffect\")}, ${escapeValue(\"setInterval\")}, ${escapeValue(\"fetch\")}, or browser globals, it belongs in a code component.`,\n\t\t`When genuinely ambiguous, prefer the canvas or call ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)}. Never silently escalate.`,\n\t),\n\tMarkdown.section(\n\t\t\"Arguments\",\n\t\t`- ${escapeValue(\"prompt\")}: Write a self-contained handoff. Include the component/file name, requested behavior or changes, relevant project/style context the sub-agent cannot see, what should stay editable via controls, and any hard Framer/runtime constraints. Prefer requirements over implementation details, and call out styling details that should stay adjustable as controls instead of being baked into the file.`,\n\t\t`- ${escapeValue(\"filePath\")} (optional): Path of an existing code file from the ${escapeValue(CURRENT_PROJECT_CODE_COMPONENTS_SECTION_NAME)} map in ${escapeValue(`<${Components.metadataTag}>`)}. The map is shaped like ${escapeValue('{\"filePath\":[/* components declared in the file */]}')}. Include ${escapeValue(\"filePath\")} only for existing-file updates or deletes. Omit it when creating a new code file.`,\n\t),\n\tMarkdown.section(\n\t\t\"Guidelines\",\n\t\t`- The coding sub-agent only sees your ${escapeValue(\"prompt\")} and, when ${escapeValue(\"filePath\")} is provided, the current file.`,\n\t\t`- Summarize only the context that matters: layout constraints, palette, typography, spacing, matching UI patterns, editable content, required controls, and any sizing/static-render/accessibility constraints.`,\n\t\t`- Ask for the component's capability, visual contract, and control surface. Do not turn the prompt into a full page-instance spec.`,\n\t\t`- Keep repeated or page-specific content editable when feasible. Ask for array/object-style controls instead of hardcoding datasets.`,\n\t\t`- If colors, radii, spacing, typography, motion settings, or similar styling knobs should remain tunable from Framer, ask the sub-agent to expose them as property controls instead of hardcoding exact instance values.`,\n\t\t`- Do not prescribe implementation details unless they are true constraints or the user provided code that must be preserved or transformed.`,\n\t\t`- Do NOT dump raw project state or ask the sub-agent to infer styles from a project it cannot see.`,\n\t\t`- If ${escapeValue(REQUEST_CODE_FILE_CHANGES_TOOL_NAME)} reports that a delete is blocked by existing usages, stop. Do not remove dependent nodes or retry the delete unless the user explicitly authorized deleting all dependent usages. Instead use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} and include the reported usages.`,\n\t),\n\tMarkdown.section(\n\t\t\"Calling Pattern\",\n\t\t`- Create: omit ${escapeValue(\"filePath\")} and put the intended component display name in ${escapeValue(\"prompt\")}. After create, insert it with ${escapeValue(PROJECT_UPDATE_LABEL)} using the returned ${escapeValue(\"id\")} value as ${escapeValue('+ComponentInstanceNode component=\"<id>\"')}. Use ${escapeValue(\"displayName\")} for prose only.`,\n\t\t`- Update: include ${escapeValue(\"filePath\")} and describe the requested changes in ${escapeValue(\"prompt\")}. Updates happen in place and do not require any extra ${escapeValue(PROJECT_UPDATE_LABEL)} command.`,\n\t\t`- Delete: include ${escapeValue(\"filePath\")} and clearly say in ${escapeValue(\"prompt\")} that the component should be deleted.`,\n\t),\n\tMarkdown.section(\n\t\t\"Examples\",\n\t\t`The decision examples below illustrate how to apply the three questions above \u2014 they are not phrases to match against. Reason about the request's shape, not its wording.`,\n\t\t`- ${escapeValue('\"Make me a button component\"')}: there is no existing code-component target, and this reduces to a canvas component with variants and a label control. Stay native via ${escapeValue(`+${ComponentNodeClass}`)}.`,\n\t\t`- ${escapeValue('\"Show the current BTC price on the homepage and keep it fresh\"')}: there is no existing target, and the canvas has no native primitive for polling an external API. This needs ${escapeValue(\"fetch\")} plus an interval, so escalate.`,\n\t\t`- ${escapeValue('\"When I tap the hamburger, open the mobile menu\"')}: this is a variant switch on the menu wired to ${escapeValue(SetVariantActionName)}. Stay native.`,\n\t\t`- ${escapeValue('\"Remember which color theme the visitor picked so they see it again next time\"')}: this requires ${escapeValue(\"localStorage\")}, so escalate.`,\n\t\t`- ${escapeValue('\"Fade the hero section in gently as the page loads\"')}: ${escapeValue(\"appearEffect\")} already covers this. Stay native.`,\n\t\t`Handoff quality (once you have decided to escalate):`,\n\t\t`- Weak: ${escapeValue('\"Create a code component named MultiStepForm with 3 steps, validation, and an accentColor control.\"')} is too vague when the user asked to add it to the current page, because it gives the sub-agent no page context to match.`,\n\t\t`- Strong for ${escapeValue('\"Add me a multi step form to the current page.\"')}: ${escapeValue('\"Create a code component named MultiStepForm for the current landing page. Match the existing product-marketing feel: light card surface, subtle border, rounded corners, bold dark headings, and the same primary button treatment used elsewhere on the page. Keep it compact for a two-column desktop section and a single-column mobile stack. Build a 3-step flow with inline validation. Expose surfaceColor, borderColor, cornerRadius, accentColor, and submitLabel as controls so the page instance can tune those directly, with only minimal defaults inside the component.\"')}.`,\n\t\t`- Content boundary: instead of pasting a full testimonial dataset, ask for editable testimonial items via array/object-style controls with only minimal defaults inside the component.`,\n\t),\n)\n\nconst serializeNodeGuidance = [\n\t`Serialized nodes may include virtual metadata that helps pick the right target:`,\n\t`- ${serializeVirtualMetadata(\"$scopeId\")} is the id of the scope node that contains the selection.`,\n\t`- ${serializeVirtualMetadata(\"$groundNodeId\")} is the id of the ground node (Breakpoint / Variant) that contains the selection.`,\n\t`- ${serializeVirtualMetadata(\"$parentId\")} is the id of the direct parent.`,\n\t`- ${serializeVirtualMetadata(\"$layoutTemplateId\")} is the id of the layout template applied to the page. When present, retrieve that node to understand the page's structural skeleton before making changes.`,\n\t`Use ${serializeVirtualMetadata(\"$variants\")} or ${serializeVirtualMetadata(\"$breakpoints\")} on a serialized ${escapeValue(\"WebPageNode\")}, ${escapeValue(\"LayoutTemplateNode\")}, or ${escapeValue(ComponentNodeClass)} to determine the in-scope Breakpoints/Variants.`,\n]\n\nconst attributeFilterGuidance = [\n\t`Use ${escapeValue(\"attributeFilter\")} to limit serialized attributes and metadata:`,\n\t`- Omit ${escapeValue(\"attributeFilter\")} to include all available attributes.`,\n\t`- Use an empty filter (${escapeValue(\"attributeFilter: []\")}) to omit attributes and optional metadata while keeping basic structure.`,\n\t`- Any ${escapeValue(PROJECT_UPDATE_LABEL)} attribute key is permitted, and partial paths may be provided to filter precisely, for example ${escapeValue(\"appearEffect\")}, ${escapeValue(\"appearEffect.enter\")}, or ${escapeValue(\"appearEffect.enter.x\")}.`,\n\t`- Metadata keys such as ${serializeVirtualMetadata(\"$rect\")}, ${serializeVirtualMetadata(\"$layoutTemplateId\")}, ${serializeVirtualMetadata(\"$variants\")}, and ${serializeVirtualMetadata(\"$breakpoints\")} may be requested alongside attribute keys.`,\n]\n\nconst scriptNodeDiscoveryGuidance = Markdown.section(\n\t\"Node Discovery and Serialization\",\n\t`Use ids from ${escapeValue(`<${metadataTags.selectedNodes}>`)} or previous reads as starting points for ${escapeValue(\"api.tree.getNode\")} / ${escapeValue(\"api.tree.getNodes\")}.`,\n\t`Use ${escapeValue(\"api.tree.getScopeNodeFor\")}, ${escapeValue(\"api.tree.getGroundNodeFor\")}, ${escapeValue(\"api.tree.getParentNodeFor\")}, and ${escapeValue(\"api.tree.getAncestorsFor\")} to pivot from a selected or referenced node to surrounding context.`,\n\t`Use ${escapeValue(\"api.serialize\")} / ${escapeValue(\"api.serializeNodes\")} when you need full metadata, controlled depth, ancestor paths, or targeted attributes. Use ${escapeValue(\"api.tree.getNode\")} / ${escapeValue(\"api.tree.getNodes\")} for cheaper traversal when full metadata is not needed.`,\n\t...serializeNodeGuidance,\n\t...attributeFilterGuidance,\n)\n\nconst scriptTool = Markdown.section(\n\tSCRIPT_TOOL_NAME,\n\t`Use ${escapeValue(SCRIPT_TOOL_NAME)} when you need programmable filtering/mapping/arithmetic over nodes and regular queries are too rigid.`,\n\t`Always use a script when you need to count, find, or aggregate nodes.`,\n\t`Prefer ${escapeValue(SCRIPT_TOOL_NAME)} when creating or replacing a full CMS rich text table.`,\n\t`Use direct ${escapeValue(PROJECT_UPDATE_LABEL)} table DSL only for small surgical edits, such as changing one cell, adding one row, or fixing one cell type.`,\n\t`For full tables, generate ${escapeValue(\"TextTable\")}, ${escapeValue(\"TextTableRow\")}, and ${escapeValue(\"TextTableCell\")} commands in a script and apply them with ${escapeValue(\"api.updateProject\")}. The script handles the dynamic structure only \u2014 do not forget to also style the table.`,\n\t`Returning planned commands, node ids, or attribute objects from ${escapeValue(SCRIPT_TOOL_NAME)} does not change the project. To mutate from a script, call ${escapeValue(\"api.updateProject(...)\")}; otherwise emit a normal ${escapeValue(PROJECT_UPDATE_LABEL)} block after the script result.`,\n\t`For external data imports or CMS enrichment from URLs, prefer ${escapeValue(SCRIPT_TOOL_NAME)} with ${escapeValue(\"fetch()\")}. Use ${escapeValue(FETCH_EXTERNAL_URL_TOOL_NAME)} only for quick one-off reading where the fetched body text itself is enough.`,\n\t`Script ${escapeValue(\"fetch()\")} returns response metadata and bounded ${escapeValue(\"text()\")} / ${escapeValue(\"json()\")} helpers for public URL content; HTML responses are cleaned before text extraction.`,\n\t`When URL extraction is a multi-step workflow, combine ${escapeValue(\"fetch()\")} with ${escapeValue(\"api.store\")} / ${escapeValue(\"api.load\")}: store filtered source records or summaries for later scripts, not raw fetched pages.`,\n\t`When creating source-backed CMS entries, only write data found in explicit user sources, attached files, current project content, or fetched source content. If the fetched/static source does not contain the requested data, report the limitation or ask for another source or fall back to ${escapeValue(\"fetch_url\")}; don't fill entries from model memory unless the user explicitly asks for best-effort examples.`,\n\t`When creating a new table, also style it: the ${escapeValue(ClassDiscriminator.RichTextNode)} that renders the table must reference a ${escapeValue(ClassDiscriminator.TableStylePresetNode)} via its ${escapeValue(\"tableStylePreset\")} attribute. Reuse an existing ${escapeValue(ClassDiscriminator.TableStylePresetNode)} when one is already in the project; only ${escapeValue(`+${ClassDiscriminator.TableStylePresetNode}`)} when none exists, or when the user explicitly asks for a new table style.`,\n\t`Use ${escapeValue(\"api.serialize\")} / ${escapeValue(\"api.serializeNodes\")} when returning context to the user/model.`,\n\t`High-level worker API exposed to scripts (all async):`,\n\t`- ${escapeValue(\"await api.tree.getNodesOfTypes(...types: string[]): Node[]\")}`,\n\t`- ${escapeValue(\"await api.tree.getNode(id: string): Node | null\")}`,\n\t`- ${escapeValue(\"await api.tree.getNodes(ids: string[]): Node[]\")}`,\n\t`- ${escapeValue(\"await api.tree.getRect(nodeOrId: string | Node): { x: number, y: number, width: number, height: number } | null\")} - full rounded measured rect for layout calculations`,\n\t`- ${escapeValue(\"await api.tree.getScopeNodeFor(id: string): Node | null\")}`,\n\t`- ${escapeValue(\"await api.tree.getGroundNodeFor(id: string): Node | null\")}`,\n\t`- ${escapeValue(\"await api.tree.getParentNodeFor(id: string): Node | null\")}`,\n\t`- ${escapeValue(\"await api.tree.getAncestorsFor(id: string): Node[]\")} - ancestor chain from parent upward`,\n\t`- ${escapeValue(\"await api.controls.components(componentIds: string[]): Record<string, { controls: Record<string, unknown> } | { error: string }>\")} - read controls by component id from ${escapeValue(`<${Components.metadataTag}>`)}`,\n\t`- ${escapeValue(\"await api.controls.iconSets(iconSetNames: string[]): Record<string, { controls: Record<string, unknown> } | { error: string }>\")} - read controls by icon set name from ${escapeValue(`<${VectorSets.availableSetsMetadataTag}>`)}`,\n\t`- ${escapeValue(\"await api.icons.list(iconSetName: string): string[]\")} - list the static icon catalog for one icon set by name from ${escapeValue(\"<available-icon-sets>\")}. Use JavaScript primitives like ${escapeValue(\"filter\")}, ${escapeValue(\"RegExp\")}, and ${escapeValue(\"startsWith\")} to find exact icon names for ${escapeValue(`+${IconNodeClass}`)} commands.`,\n\t`- ${escapeValue(\"await api.controls.layoutTemplates(layoutTemplateIds: string[]): Record<string, { controls: Record<string, unknown> } | { error: string }>\")} - read controls by layout template id such as ${escapeValue(\"$layoutTemplateId\")}`,\n\t`- ${escapeValue(\"await api.controls.shaders(shaderNames: string[]): Record<string, { controls: Record<string, unknown> } | { error: string }>\")} - read controls by shader name from ${escapeValue(`<${Shaders.availableShadersTag}>`)}`,\n\t`- ${escapeValue(\"await api.updateProject(projectUpdate: string): Node[]\")} - update the project with a ${escapeValue(PROJECT_UPDATE_LABEL)} template string, e.g. ${escapeValue(`await api.updateProject(${escapeValue(`${CommandType.Update} \\${id} fill=\"\\${fill}\";`)})`)}`,\n\t`- ${escapeValue(\"await api.files.readText(fileIdOrName: string): string\")} - read an attached text file, such as JSON or Markdown`,\n\t`- ${escapeValue(\"await api.files.parseCsv(fileIdOrName: string, options?: { asObjects?: boolean, skipEmptyLines?: boolean, delimiter?: string }): unknown[]\")} - parse an attached CSV or TSV file. When ${escapeValue(\"asObjects: true\")}, the first row is treated as headers and each remaining row is returned as an object keyed by those headers; otherwise rows are returned as string arrays.`,\n\t`- ${escapeValue(\"await api.replaceText(node: string | Node, searchText: string, replaceText: string): boolean\")} - replace text in a node with a new text, accepts any text-like node e.g. ${escapeValue(`await api.replaceText(${escapeValue(\"<node-id>\")}, \"old text\", \"new text\")`)}`,\n\t`- ${escapeValue(\"await api.analyze(prompt: string, nodes: Array<string | Node>, ): string\")} - prompt a large language model for arbitrary analysis of a set of nodes.`,\n\t`- ${escapeValue(\"await api.extractDesignPatterns(nodes: Array<string | Node>): { spacing, colors, components, radii, typography, surfaces, layout, shadows, colorsToAvoid, textStylesToAvoid }\")} - extract dense structured design patterns from reference nodes, with actionable rows containing concrete usage patterns and ${escapeValue(\"examples\")} as node id strings that can be inspected or duplicated. ${escapeValue(\"surfaces\")} includes page backgrounds, card surfaces, image fills, gradients, and other material/background patterns; ${escapeValue(\"colors\")} is for reusable color values. Color tokens in ${escapeValue(\"colorsToAvoid\")} and text style presets in ${escapeValue(\"textStylesToAvoid\")} exist in the project but were not observed in the references and should not be used from this extraction.`,\n\t`- ${escapeValue(\"await api.search(prompt: string, nodes: Array<string | Node>): AsyncGenerator<Array<{id: string; reason: string }>>\")} - prompt a large language model for arbitrary search of a set of nodes, yields results in batches when they become available.`,\n\t`- ${escapeValue('await api.serialize(node: string | Node, options?: { depth?: number, ancestors?: number, attributeFilter?: string[], ancestorPath?: boolean }): Node | { node: Node, ancestorPath: { id: string, type: Node[\"type\"], name?: string }[] } | null')} - re-serialize a node with optional descendant depth, serialized ancestor context with truncated siblings, attribute filters, and optional ancestor path`,\n\t`- ${escapeValue('await api.serializeNodes(nodes: Array<string | Node>, options?: { depth?: number, ancestors?: number, attributeFilter?: string[], ancestorPath?: boolean }): Array<Node | { node: Node, ancestorPath: { id: string, type: Node[\"type\"], name?: string }[] }>')} - batch version of ${escapeValue(\"api.serialize\")}`,\n\t`- ${escapeValue(\"await api.paginate(items: unknown[]): { keyName: string, totalResults: number, cursor: number, results: unknown[], nextCursor?: number }\")} - store a large array and return a token-budgeted page`,\n\t`- ${escapeValue(\"await api.paginate(keyName: string, cursor: number)\")} - continue loading pages from a previous paginate result.`,\n\t`- ${escapeValue(\"await api.store(key: string, value: unknown): void\")} - persist a JSON-serializable value for future scripts in this agent context`,\n\t`- ${escapeValue(\"await api.load(key: string): unknown\")} - load a previously stored value by key, throws when the key is missing and includes the available stored keys in the error message`,\n\t`- ${escapeValue(\"await api.analytics.query(sql: string, range: { from: Date, to?: Date }): unknown[]\")} - run a read-only ClickHouse query against this site's analytics events over the given date range (${escapeValue(\"to\")} defaults to now). Request the ${escapeValue(\"Analytics\")} guide before non-trivial queries \u2014 it documents the schema, the range parameter, and example queries.`,\n\t`- ${escapeValue(\"await fetch(url: string): Response\")} - fetch a public URL from script, then call ${escapeValue(\"await response.text()\")} or ${escapeValue(\"await response.json()\")}`,\n\t`Helper functions that are exposed to the script:`,\n\t`- ${escapeValue(\"walkWithSkipChildren(node: Node): IterableIterator<{ node: Node, skipChildren: () => void }>\")} - local iterator helper for selective traversal: ${escapeValue(\"for (const { node } of walkWithSkipChildren(nodes)) { ... }\")}.`,\n\t`- ${escapeValue(\"getInnerText(node: RichTextNode): string\")}: local helper that recursively aggregates readable text from a ${escapeValue(ClassDiscriminator.RichTextNode)} and its descendants, with special handling for ${TextRunClass} and ${TextBlockClass}; returns ${escapeValue('\"\"')} when text is missing.`,\n\t`Always return a value from the script body. There should never be scripts that don't return a value.`,\n\t`If a ${escapeValue(SCRIPT_TOOL_NAME)} response includes ${escapeValue(\"errorType\")}, adapt your retry strategy:`,\n\t`- ${escapeValue(\"timeout\")}: Narrow the script scope and reduce API calls; prefer batched lookups (${escapeValue(\"getNodes\")}) over repeated single-node requests.`,\n\t`- ${escapeValue(\"worker_crash\")}: Return only JSON-serializable values (plain objects/arrays/primitives). Avoid functions, class instances, cyclic objects, and non-transferable values.`,\n\t`- ${escapeValue(\"script_error\")}: Use ${escapeValue(\"line\")} (if present) plus stack/error text to patch the failing statement directly.`,\n\t`- ${escapeValue(\"abort\")}: Re-run only if the task still requires this data.`,\n\tscriptNodeDiscoveryGuidance,\n\tMarkdown.section(\n\t\t\"Example Scripts\",\n\t\t\"Read the structure/style of a specific page/breakpoint:\",\n\t\treferenceScript(scriptExamplesSource, \"readPageOrBreakpoint\"),\n\t\t\"Find and replace exact fill colors on a page:\",\n\t\treferenceScript(scriptExamplesSource, \"replaceColorsOnPage\"),\n\t\t`Find ${escapeValue(ComponentNodeClass)} that could be button-like:`,\n\t\treferenceScript(scriptExamplesSource, \"findComponents\"),\n\t\t`Replace an exact string across the project:`,\n\t\treferenceScript(scriptExamplesSource, \"replaceTextInProject\"),\n\t\t\"Find text fragments containing a specific string:\",\n\t\treferenceScript(scriptExamplesSource, \"findTextContentFragments\"),\n\t\t\"Find existing icons on the canvas:\",\n\t\treferenceScript(scriptExamplesSource, \"findExistingIcons\"),\n\t\t\"Find icon catalog candidates:\",\n\t\treferenceScript(scriptExamplesSource, \"findIconCandidates\"),\n\t\t\"Count unique collection reference names:\",\n\t\treferenceScript(scriptExamplesSource, \"countUniqueCollectionReferences\"),\n\t\t\"List CMS collections and their schema:\",\n\t\treferenceScript(scriptExamplesSource, \"listCmsCollections\"),\n\t\t\"Create CMS collection items from an attached CSV or JSON file:\",\n\t\treferenceScript(scriptExamplesSource, \"createCmsItemsFromImportFile\"),\n\t\t\"Create CMS collection items from sourced URL content:\",\n\t\treferenceScript(scriptExamplesSource, \"createCmsItemsFromUrl\"),\n\t\t\"List available layout templates:\",\n\t\treferenceScript(scriptExamplesSource, \"listLayoutTemplates\"),\n\t\t\"Extract design patterns from reference scopes and inspect one example:\",\n\t\treferenceScript(scriptExamplesSource, \"extractDesignPatterns\"),\n\t\t\"Duplicate a concrete example node from extracted design patterns:\",\n\t\treferenceScript(scriptExamplesSource, \"duplicateDesignPatternExample\"),\n\t\t\"Convert a multi-collection-reference variable into a plain string variable (CMS schema migration):\",\n\t\treferenceScript(scriptExamplesSource, \"changeMultiReferenceVariableToString\"),\n\t\t\"Get all the text that is contained within a specific node:\",\n\t\treferenceScript(scriptExamplesSource, \"getTextWithinNode\"),\n\t\t\"Find all the text with a specific color:\",\n\t\treferenceScript(scriptExamplesSource, \"findTextWithColor\"),\n\t\t\"Count nodes of a specific type:\",\n\t\treferenceScript(scriptExamplesSource, \"countNodesOfType\"),\n\t\t\"Read the sitemap with an optional path filter:\",\n\t\treferenceScript(scriptExamplesSource, \"readSitemap\"),\n\t\t\"Paginate large computed arrays:\",\n\t\treferenceScript(scriptExamplesSource, \"paginateLargeArray\"),\n\t\t\"Create a CMS rich text table through script-generated DSL:\",\n\t\treferenceScript(scriptExamplesSource, \"createCmsRichTextTable\"),\n\t),\n)\n\nconst localTreeInspectionApis = Markdown.section(\n\t\"Tree Inspection APIs\",\n\t`Use ids from ${escapeValue(`${GET_AGENT_CONTEXT_API_METHOD}({ pagePath })`)} or previous reads as starting points for ${escapeValue(\"getNodeForAgent\")} / ${escapeValue(\"getNodesForAgent\")}.`,\n\t`Use ${escapeValue(\"getNodeForAgent({ id }, { pagePath })\")} / ${escapeValue(\"getNodesForAgent({ ids }, { pagePath })\")} for cheaper traversal when full metadata is not needed.`,\n\t`Use ${escapeValue(\"getScopeNodeForAgent({ id }, { pagePath })\")}, ${escapeValue(\"getGroundNodeForAgent({ id }, { pagePath })\")}, ${escapeValue(\"getParentNodeForAgent({ id }, { pagePath })\")}, and ${escapeValue(\"getAncestorsForAgent({ id }, { pagePath })\")} to pivot from a selected or referenced node to surrounding context.`,\n\t`Use ${escapeValue(\"serializeForAgent({ id, depth, attributeFilter, ancestorPath }, { pagePath })\")} / ${escapeValue(\"serializeNodesForAgent({ ids, depth, attributeFilter, ancestorPath }, { pagePath })\")} when you need full metadata, controlled depth, ancestor paths, or targeted attributes.`,\n\t...serializeNodeGuidance,\n\t...attributeFilterGuidance,\n\t`- Include ${escapeValue('attributeFilter: [\"$rect\"]')} for the measued pixel dimensions of the node.`,\n\t`Use ${escapeValue(\"paginateForAgent\")} for large computed arrays before returning them to the caller.`,\n)\n\nconst publishTool = (source: Source) => {\n\tconst toolRef = toolReference(source, PUBLISH_TOOL_NAME)\n\treturn Markdown.section(\n\t\tforSource(source, { \"in-app\": PUBLISH_TOOL_NAME, local: TOOL_TO_API_METHOD[PUBLISH_TOOL_NAME] }),\n\t\t`${toolRef} previews and publishes the current site with a confirmation flow.`,\n\t\t`- Always call ${toolRef} to publish when the user asks to ship, publish, or deploy the site.`,\n\t\t`- Start with ${escapeValue(JSON.stringify({ action: PREVIEW_ACTION }))}. It does not publish; it returns readiness diagnostics (changes/errors/warnings), URLs, and a ${escapeValue(\"confirmationHash\")}.`,\n\t\t`- To actually publish after preview, call ${toolRef} with ${escapeValue(\n\t\t\tJSON.stringify({ action: CONFIRM_PUBLISH_ACTION, confirmationHash: \"<confirmation-hash>\" }),\n\t\t)}.`,\n\t\t`- ${escapeValue(CONFIRM_PUBLISH_ACTION)} requires the exact hash from the latest preview; if the hash is stale/mismatched, re-run preview and use the returned hash.`,\n\t\t`- If preview reports blocking errors, publishing is blocked. If ${escapeValue(CONFIRM_PUBLISH_ACTION)} or ${escapeValue(DEPLOY_TO_PRODUCTION_ACTION)} reports blocked/failed due to issues, run ${escapeValue(JSON.stringify({ action: PREVIEW_ACTION }))} again to inspect and resolve.`,\n\t\t`- Staging-enabled preview/confirmation responses include a current version and a ${escapeValue(\"versions\")} list (up to 50 entries) with full ${escapeValue(\"id\")}, ${escapeValue(\"timestamp\")}, and optional ${escapeValue(\"publishedBy\")}.`,\n\t\t`- To deploy a specific staging version to production custom domain, call ${toolRef} with ${escapeValue(\n\t\t\tJSON.stringify({ action: DEPLOY_TO_PRODUCTION_ACTION, version: \"<version-id>\" }),\n\t\t)}.`,\n\t\t`- ${escapeValue(DEPLOY_TO_PRODUCTION_ACTION)} requires a full version ${escapeValue(\"id\")} from preview/confirmation; this action fails if staging is disabled or the version id is invalid/not found.`,\n\t)\n}\n\nconst createComponentFromFrameTool = (source: Source) => {\n\tconst toolRef = toolReference(source, CREATE_COMPONENT_FROM_FRAME_TOOL_NAME)\n\treturn Markdown.section(\n\t\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\t\t`${toolRef} creates a local ${escapeValue(ComponentNodeClass)} from an existing ${ClassDiscriminator.FrameNode} ${escapeValue(\"id\")} and replaces the source with a ${escapeValue(ComponentInstanceNodeClass)}.`,\n\t\t`It returns ${escapeValue(CREATE_COMPONENT_FROM_FRAME_SUCCESS_STATUS)} with the serialized ${escapeValue(\"component\")} and ${escapeValue(\"instances\")}.`,\n\t\t`**Always** use ${toolRef} instead of recreating the layers in a new ${escapeValue(ComponentNodeClass)} from scratch - failing to use the tool always results in sloppier conversions.`,\n\t\t`Start ${escapeValue(ComponentNodeClass)} implementations based on a source with this tool, then proceed with the rest of the implementation.`,\n\t)\n}\n\nconst flattenComponentInstanceTool = (source: Source) => {\n\tconst toolRef = toolReference(source, FLATTEN_COMPONENT_INSTANCE_TOOL_NAME)\n\tconst makeLocalRef = toolReference(source, MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME)\n\treturn Markdown.section(\n\t\tforSource(source, {\n\t\t\t\"in-app\": FLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\t\t\tlocal: TOOL_TO_API_METHOD[FLATTEN_COMPONENT_INSTANCE_TOOL_NAME],\n\t\t}),\n\t\t`${toolRef} flattens a ${escapeValue(ComponentInstanceNodeClass)} into raw editable layers. The ${escapeValue(ComponentInstanceNodeClass)} is replaced by its underlying frame structure.`,\n\t\tMarkdown.section(\"Arguments\", `- ${escapeValue(\"id\")}: The id of the ${escapeValue(ComponentInstanceNodeClass)}.`),\n\t\tMarkdown.section(\n\t\t\t\"Response statuses\",\n\t\t\t`- ${escapeValue(FLATTEN_SUCCESS_STATUS)}: Operation completed. The result includes ${escapeValue(REPLACEMENT_ID_FIELD)}, the id of the new root node that replaced the ${escapeValue(ComponentInstanceNodeClass)}.`,\n\t\t\t`- ${escapeValue(FLATTEN_BLOCKED_STATUS)}: The operation cannot be performed. The ${escapeValue(\"message\")} explains why.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Guidelines\",\n\t\t\t`- Only works on local ${escapeValue(ComponentInstanceNodeClass)}. For external ${escapeValue(ComponentInstanceNodeClass)}, use ${makeLocalRef} first to convert them to local, then flatten.`,\n\t\t),\n\t)\n}\n\nconst makeExternalComponentLocalTool = (source: Source) => {\n\tconst toolRef = toolReference(source, MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME)\n\tconst flattenRef = toolReference(source, FLATTEN_COMPONENT_INSTANCE_TOOL_NAME)\n\treturn Markdown.section(\n\t\tforSource(source, {\n\t\t\t\"in-app\": MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\t\t\tlocal: TOOL_TO_API_METHOD[MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME],\n\t\t}),\n\t\t`${toolRef} converts an external component into a local project component and updates the ${escapeValue(ComponentInstanceNodeClass)} to reference the now local component.`,\n\t\tMarkdown.section(\n\t\t\t\"Arguments\",\n\t\t\tforSource(source, {\n\t\t\t\t\"in-app\": `- ${escapeValue(\"id\")}: The id of the external ${escapeValue(ComponentInstanceNodeClass)} (from selection context or a previous read).`,\n\t\t\t\tlocal: `- ${escapeValue(\"id\")}: The id of the external ${escapeValue(ComponentInstanceNodeClass)} (from a previous read).`,\n\t\t\t}),\n\t\t\t`- ${escapeValue(REPLACE_ALL_FIELD)} (optional): When ${escapeValue(\"true\")}, replace all ${escapeValue(ComponentInstanceNodeClass)} of this external component with the local component. When ${escapeValue(\"false\")}, replace only this ${escapeValue(ComponentInstanceNodeClass)}. Required when the tool returns ${escapeValue(NEEDS_CONFIRMATION_STATUS)} status.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Response statuses\",\n\t\t\t`- ${escapeValue(SUCCESS_STATUS)}: Operation completed. The result includes ${escapeValue(\"component.id\")} for follow-up commands and ${escapeValue(\"component.displayName\")} for prose.`,\n\t\t\tforSource(source, {\n\t\t\t\t\"in-app\": `- ${escapeValue(NEEDS_CONFIRMATION_STATUS)}: The component has multiple ${escapeValue(ComponentInstanceNodeClass)}. Use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} to ask the user whether to replace only this ${escapeValue(ComponentInstanceNodeClass)} or all ${escapeValue(ComponentInstanceNodeClass)}, then retry with ${escapeValue(REPLACE_ALL_FIELD)} set to the user's choice.`,\n\t\t\t\tlocal: `- ${escapeValue(NEEDS_CONFIRMATION_STATUS)}: The component has multiple ${escapeValue(ComponentInstanceNodeClass)}. Confirm with the user whether to replace only this ${escapeValue(ComponentInstanceNodeClass)} or all ${escapeValue(ComponentInstanceNodeClass)}, then retry with ${escapeValue(REPLACE_ALL_FIELD)} set to the user's choice.`,\n\t\t\t}),\n\t\t\t`- ${escapeValue(BLOCKED_STATUS)}: The operation cannot be performed. The ${escapeValue(\"message\")} explains why.`,\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Guidelines\",\n\t\t\t`- For ${escapeValue(REPLACE_ALL_FIELD)}: default to ${escapeValue(\"false\")} (replace only the selected/referenced ${escapeValue(ComponentInstanceNodeClass)}) unless the user explicitly says \"all\", \"everywhere\", or \"replace all instances\".`,\n\t\t\t...forSource(source, {\n\t\t\t\t\"in-app\": [\n\t\t\t\t\t`- If the tool returns ${escapeValue(NEEDS_CONFIRMATION_STATUS)}, use ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} to ask the user whether to replace only this ${escapeValue(ComponentInstanceNodeClass)} or all ${escapeValue(ComponentInstanceNodeClass)}, then retry with ${escapeValue(REPLACE_ALL_FIELD)} set to the user's choice.`,\n\t\t\t\t],\n\t\t\t\tlocal: emptyArray<string>(),\n\t\t\t}),\n\t\t\t`- When the success message suggests flattening, follow up by calling ${flattenRef} on the same ${escapeValue(ComponentInstanceNodeClass)} id.`,\n\t\t),\n\t)\n}\n\nexport function buildToolsPrompt(source: Source) {\n\tswitch (source.prompt) {\n\t\tcase \"in-app\": {\n\t\t\tconst toolNames = [\n\t\t\t\t...(canUseChecklistTools(source)\n\t\t\t\t\t? [CHECKLIST_CREATE_TOOL_NAME, CHECKLIST_COMPLETE_TASK_TOOL_NAME]\n\t\t\t\t\t: emptyArray<string>()),\n\t\t\t\tREAD_PROJECT_TOOL_NAME,\n\t\t\t\tREVIEW_CHANGES_TOOL_NAME,\n\t\t\t\tASK_CLARIFICATION_TOOL_NAME,\n\t\t\t\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\t\t\t\tQUERY_IMAGES_TOOL_NAME,\n\t\t\t\tVIEW_IMAGE_TOOL_NAME,\n\t\t\t\tSCRIPT_TOOL_NAME,\n\t\t\t\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\t\t\t\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\t\t\t\tPUBLISH_TOOL_NAME,\n\t\t\t\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\t\t\t\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\t\t\t]\n\t\t\treturn Markdown.section(\n\t\t\t\t\"Tools\",\n\t\t\t\t\"You can **always** use native function/tool calls at any point in the request/response loop to request more information about the project in order to accurately respond to the user's request.\",\n\t\t\t\t\"Never emit pseudo function-calls as plain-text json.\",\n\t\t\t\t\"The following native function/tools are available to you:\",\n\t\t\t\tjoin.linesFrom(toolNames.map(tool => `- ${tool}`)),\n\t\t\t\t...buildChecklistToolPrompts(source),\n\t\t\t\tbuildReadProjectToolPrompt(source),\n\t\t\t\treviewChangesTool(source),\n\t\t\t\tbuildAskClarificationToolPrompt(),\n\t\t\t\tfetchUrlTool,\n\t\t\t\tqueryImagesTool(source),\n\t\t\t\tviewImageTool,\n\t\t\t\tscriptTool,\n\t\t\t\trequestCodeFileChangesTool,\n\t\t\t\tcreateComponentFromFrameTool(source),\n\t\t\t\tpublishTool(source),\n\t\t\t\tflattenComponentInstanceTool(source),\n\t\t\t\tmakeExternalComponentLocalTool(source),\n\t\t\t)\n\t\t}\n\t\tcase \"local\": {\n\t\t\tconst apiMethodNames = [\n\t\t\t\tTOOL_TO_API_METHOD[READ_PROJECT_TOOL_NAME],\n\t\t\t\tTOOL_TO_API_METHOD[REVIEW_CHANGES_TOOL_NAME],\n\t\t\t\tTOOL_TO_API_METHOD[PUBLISH_TOOL_NAME],\n\t\t\t\tTOOL_TO_API_METHOD[QUERY_IMAGES_TOOL_NAME],\n\t\t\t\tTOOL_TO_API_METHOD[FLATTEN_COMPONENT_INSTANCE_TOOL_NAME],\n\t\t\t\tTOOL_TO_API_METHOD[MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME],\n\t\t\t\t\"getNodeForAgent\",\n\t\t\t\t\"getNodesForAgent\",\n\t\t\t\t\"getNodesOfTypesForAgent\",\n\t\t\t\t\"getScopeNodeForAgent\",\n\t\t\t\t\"getGroundNodeForAgent\",\n\t\t\t\t\"getParentNodeForAgent\",\n\t\t\t\t\"getAncestorsForAgent\",\n\t\t\t\t\"serializeForAgent\",\n\t\t\t\t\"serializeNodesForAgent\",\n\t\t\t\t\"paginateForAgent\",\n\t\t\t]\n\t\t\treturn Markdown.section(\n\t\t\t\t\"Tools\",\n\t\t\t\t`The following plugin-api methods read from and mutate the project. Call each one when the described capability is needed; the project context returned by ${escapeValue(`${GET_AGENT_CONTEXT_API_METHOD}({ pagePath })`)} provides the starting metadata.`,\n\t\t\t\t`Changes to the project itself are made by passing a DSL string to ${escapeValue(`${APPLY_AGENT_CHANGES_API_METHOD}(dsl, { pagePath })`)} \u2014 see \"Updating the Project\" below for the grammar.`,\n\t\t\t\tjoin.linesFrom(apiMethodNames.map(method => `- ${escapeValue(method)}`)),\n\t\t\t\tlocalTreeInspectionApis,\n\t\t\t\tbuildReadProjectToolPrompt(source),\n\t\t\t\treviewChangesTool(source),\n\t\t\t\tpublishTool(source),\n\t\t\t\tqueryImagesTool(source),\n\t\t\t\tflattenComponentInstanceTool(source),\n\t\t\t\tmakeExternalComponentLocalTool(source),\n\t\t\t)\n\t\t}\n\t\tdefault:\n\t\t\treturn assertNever(source, \"Unknown prompt source\")\n\t}\n}\n", "import { linkRules } from \"app/ai/agents/prompt/linkRules.ts\"\nimport type { LanguageModel } from \"../../languageModels.ts\"\nimport { PROJECT_UPDATE_LABEL } from \"../DocumentParser.ts\"\nimport { getNodeExamplesIndex, initExamplesCache } from \"../examples/exampleLoader.ts\"\nimport type { Source } from \"../source.ts\"\nimport { ASK_CLARIFICATION_TOOL_NAME, READ_PROJECT_TOOL_NAME, REVIEW_CHANGES_TOOL_NAME } from \"../tools/toolNames.ts\"\nimport { cms } from \"./cms.ts\"\nimport { buildComponentRules, buildVariables } from \"./componentRules.ts\"\nimport { buildCoreExamples } from \"./coreExamples.ts\"\nimport { buildCorePrinciples } from \"./corePrinciples.ts\"\nimport { buildLayoutRules, designRules, richTextRules } from \"./designRules.ts\"\nimport { eventHandlers } from \"./eventHandlers.ts\"\nimport { formRules } from \"./formRules.ts\"\nimport { buildIconRules } from \"./iconRules.ts\"\nimport { buildImplementationStrategy, ImplementationStrategy } from \"./implementation.ts\"\nimport { implementationStrategySectionNames } from \"./implementationNames.ts\"\nimport { buildLayoutTemplateRules } from \"./layoutTemplateRules.ts\"\nimport { Markdown } from \"./markdown.ts\"\nimport { overlayRules } from \"./overlayRules.ts\"\nimport { overview } from \"./overview.ts\"\nimport { buildProjectUpdates } from \"./projectUpdates.ts\"\nimport { buildReplicas } from \"./replicas.ts\"\nimport { buildResponse } from \"./response.ts\"\nimport { scopeTypes } from \"./scopeTypes.ts\"\nimport { AgentSystemPromptDictionary } from \"./systemPromptDictionary.ts\"\nimport { buildToolsPrompt } from \"./tools.ts\"\nimport { transitions } from \"./transitions.ts\"\nimport { escapeValue, formatNestedArray } from \"./utils.ts\"\n\ninterface BuildSystemPromptOptions {\n\tsource: Source\n\tmodel: LanguageModel\n}\n\n/** Build the system prompt - called each time to include current examples */\nexport async function buildSystemPrompt({ source, model }: BuildSystemPromptOptions): Promise<string> {\n\tawait initExamplesCache()\n\n\tconst nodeExamplesIndex = await getNodeExamplesIndex()\n\n\treturn Markdown.serialize(\n\t\toverview,\n\t\tbuildResponse(model, source),\n\t\tbuildImplementationStrategy(source),\n\t\tbuildToolsPrompt(source),\n\t\tMarkdown.section(\"Design Rules\", ...designRules),\n\t\tbuildProjectUpdates(source),\n\t\tMarkdown.section(\"Core Principles\", buildCorePrinciples(source)),\n\t\tMarkdown.section(\n\t\t\t\"How Projects Work\",\n\t\t\t\"The sections below explain how to interact with a project.\",\n\t\t\tscopeTypes,\n\t\t\tbuildLayoutTemplateRules(source),\n\t\t\tbuildReplicas(source),\n\t\t\tMarkdown.section(\"Icons\", buildIconRules(source).trim()),\n\t\t\tbuildComponentRules(source),\n\t\t\tcms(source),\n\t\t\tbuildVariables(source),\n\t\t\tformRules,\n\t\t\tMarkdown.section(\"Transitions\", ...transitions),\n\t\t\toverlayRules,\n\t\t\teventHandlers(source),\n\t\t\tMarkdown.section(\"Rich Text Structure\", formatNestedArray(richTextRules)),\n\t\t\tbuildLayoutRules(source),\n\t\t\tlinkRules,\n\t\t\tMarkdown.section(\n\t\t\t\t\"Localization\",\n\t\t\t\t`Framer has built in Localization functionality that cannot currently be implemented with the current tools or ${escapeValue(PROJECT_UPDATE_LABEL)} commands available. You should not translate existing text into another language when asked to 'localize'.\"`,\n\t\t\t),\n\t\t\tMarkdown.section(\n\t\t\t\t\"A/B Testing\",\n\t\t\t\t`Framer has a built in A/B testing feature that cannot currently be implemented with the current tools or ${escapeValue(PROJECT_UPDATE_LABEL)} commands available.`,\n\t\t\t),\n\t\t),\n\t\tMarkdown.section(AgentSystemPromptDictionary.ImplementationGuidanceDocumentationIndex, ...nodeExamplesIndex),\n\t\tMarkdown.section(\n\t\t\tAgentSystemPromptDictionary.CoreExamples,\n\t\t\t\"Use these examples to guide resolving ambiguous user requests into concrete Framer outputs.\",\n\t\t\t`Pay careful attention to \"Description\" and \"Example Context\" of the examples to understand when the Output is expected.`,\n\t\t\tawait buildCoreExamples(source),\n\t\t),\n\t\tMarkdown.section(\n\t\t\t\"Critical Reminders\",\n\t\t\t`- First apply the Response capability gate. For supported implementation requests, always make the appropriate ${escapeValue(READ_PROJECT_TOOL_NAME)} queries to efficiently implement the user's request, carefully referencing the \"Tools\" section.`,\n\t\t\t`- Always request and consult the most relevant Guides: e.g. \"Navigations\" for navigation-related requests, \"Overlays\" for overlay-related requests, etc.`,\n\t\t\t`- Always make sure that ${escapeValue(PROJECT_UPDATE_LABEL)} blocks follow the described syntax.`,\n\t\t\t`- Always use CMS Collections and CMS Collection Lists to display list-like data unless explicitly stated otherwise.`,\n\t\t\t`- If you already implemented a request and the user says they do not like the result, undo the changes from that implementation before continuing, then restart from scratch.`,\n\t\t\t`- **Always follow strategies outlined in the \"${implementationStrategySectionNames.implementation}\" section:**`,\n\t\t\t`1. When the user requests requires parts that may benefit from the documentation available in the \"${AgentSystemPromptDictionary.ImplementationGuidanceDocumentationIndex}\", request them to guide your implementation.`,\n\t\t\t`2. For requests handled with the \"${ImplementationStrategy.Creation}\" strategy, follow the \"${implementationStrategySectionNames.creation}\" in the \"${implementationStrategySectionNames.implementation}\" section to decide when and how to use ${escapeValue(READ_PROJECT_TOOL_NAME)} or ${escapeValue(ASK_CLARIFICATION_TOOL_NAME)} before planning.`,\n\t\t\t`3. Search for specific fonts to match the visual style of the request.`,\n\t\t\t`4. Review the changes made to the project using ${escapeValue(REVIEW_CHANGES_TOOL_NAME)}:`,\n\t\t\t`- Ensure changes are visually pleasing and correct.`,\n\t\t\t`- **Silently** resolve any errors, warnings, or changes without mentioning them to the user.`,\n\t\t),\n\t)\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport type { TextStreamPart, ToolSet } from \"ai\"\nimport { isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { abortableStream } from \"./abortableStream.ts\"\n\nconst responseFailedEventType = \"response.failed\"\n\nexport type AgentStreamPart<T extends ToolSet> = Extract<\n\tTextStreamPart<T>,\n\t{ type: \"reasoning-start\" | \"reasoning-delta\" | \"reasoning-end\" | \"text-delta\" | \"tool-call\" }\n>\n\ninterface ErrorWithOpenRouterDetails extends Error {\n\tcode?: string | number\n\tmetadata?: Record<string, unknown>\n}\n\nexport async function* abortableAgentStream<T extends ToolSet>(\n\tstream: AsyncIterable<TextStreamPart<T>>,\n\tabortSignal: AbortSignal | undefined,\n): AsyncGenerator<AgentStreamPart<T>, void, unknown> {\n\tfor await (const part of abortableStream(stream, abortSignal)) {\n\t\tswitch (part.type) {\n\t\t\tcase \"reasoning-start\":\n\t\t\tcase \"reasoning-delta\":\n\t\t\tcase \"reasoning-end\":\n\t\t\tcase \"text-delta\":\n\t\t\tcase \"tool-call\":\n\t\t\t\tyield part\n\t\t\t\tbreak\n\t\t\tcase \"error\":\n\t\t\t\tthrow toThrowable(part.error)\n\t\t\tcase \"raw\": {\n\t\t\t\tconst responseFailedError = getResponseFailedError(part.rawValue)\n\t\t\t\tif (responseFailedError) throw responseFailedError\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"finish-step\":\n\t\t\t\tif (part.finishReason === \"error\") throw new Error(\"Response failed.\")\n\t\t\t\tbreak\n\t\t\tcase \"abort\":\n\t\t\tcase \"file\":\n\t\t\tcase \"finish\":\n\t\t\tcase \"source\":\n\t\t\tcase \"start\":\n\t\t\tcase \"start-step\":\n\t\t\tcase \"text-end\":\n\t\t\tcase \"text-start\":\n\t\t\tcase \"tool-approval-request\":\n\t\t\tcase \"tool-error\":\n\t\t\tcase \"tool-input-delta\":\n\t\t\tcase \"tool-input-end\":\n\t\t\tcase \"tool-input-start\":\n\t\t\tcase \"tool-output-denied\":\n\t\t\tcase \"tool-result\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(part, \"Unhandled stream part\")\n\t\t}\n\t}\n}\n\nfunction getResponseFailedError(rawValue: unknown): Error | undefined {\n\tif (!isObject(rawValue) || rawValue.type !== responseFailedEventType) return\n\n\tconst response = rawValue.response\n\tif (!isObject(response)) return new Error(\"Response failed.\", { cause: rawValue })\n\n\tconst responseError = response.error\n\tif (!isObject(responseError)) return new Error(\"Response failed.\", { cause: rawValue })\n\n\tconst message = isString(responseError.message) ? responseError.message : \"Response failed.\"\n\treturn createErrorWithOpenRouterDetails(\n\t\tmessage,\n\t\trawValue,\n\t\tgetErrorCode(responseError.code),\n\t\tgetErrorMetadata(responseError.metadata),\n\t)\n}\n\nfunction toThrowable(error: unknown): unknown {\n\tif (error instanceof Error) return error\n\tif (isString(error)) return new Error(error)\n\treturn error\n}\n\nfunction getErrorCode(value: unknown): string | number | undefined {\n\tif (isString(value) || isNumber(value)) return value\n\treturn\n}\n\nfunction getErrorMetadata(value: unknown): Record<string, unknown> | undefined {\n\tif (isObject(value)) return value\n\treturn\n}\n\nfunction createErrorWithOpenRouterDetails(\n\tmessage: string,\n\tcause: unknown,\n\tcode: string | number | undefined,\n\tmetadata: Record<string, unknown> | undefined,\n): ErrorWithOpenRouterDetails {\n\tconst error: ErrorWithOpenRouterDetails = new Error(message, { cause })\n\tif (code !== undefined) error.code = code\n\tif (metadata !== undefined) error.metadata = metadata\n\treturn error\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\n\ninterface SynchronizeAgentContextOptions {\n\tctx: AgentContext\n\tengine: VekterEngine\n\tfullSync?: boolean\n\tscheduleUpdate: (fn: VoidFunction) => Promise<void>\n}\n\nexport async function synchronizeAgentContext({\n\tctx,\n\tengine,\n\tfullSync = true,\n\tscheduleUpdate,\n}: SynchronizeAgentContextOptions): Promise<void> {\n\tawait ctx.deferred.flush(ctx)\n\tctx.virtualText.finalize()\n\tawait ctx.deferred.flushTextFitUpdates(engine, scheduleUpdate)\n\tctx.issues.finalizeStep(ctx.treeResolver.getUninsertedNodes())\n\n\tif (fullSync === false) return\n\n\tawait ctx.files.finalize()\n\tawait ctx.forms.finalize()\n}\n", "import type { ImagePart, ModelMessage, ToolContent, ToolResultPart, UserContent } from \"ai\"\nimport type { LanguageModel } from \"app/ai/languageModels.ts\"\nimport {\n\tgetMaxAttachmentDimensionForModel,\n\tgetMaxVisionImagesForModel,\n\tgetMaxVisionImageSizeKBForModel,\n\thasAnyVisionImageLimitForModel,\n} from \"app/ai/models.ts\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { isFramerAssetUrl } from \"../../context/files.ts\"\nimport type { ReadProjectResult } from \"../readProject.ts\"\nimport { SCREENSHOT_QUERY } from \"../readProjectQueryTypes.ts\"\nimport { getReadProjectToolResultOutput } from \"../readProjectToolResultOutput.ts\"\nimport { VIEW_IMAGE_TOOL_NAME } from \"../toolNames.ts\"\nimport { getScreenshotRequestKey, isScreenshotResult } from \"../utils/AgentScreenshots.ts\"\nimport { getViewImageToolResultOutput, parseViewImageToolResultOutput, type ViewImageResponse } from \"../viewImage.ts\"\nimport {\n\tisReadProjectToolResultPart,\n\tisUserModelMessage,\n\tisToolModelMessage,\n\tisToolResultModelPart,\n\tparseReadProjectToolResultOutput,\n\tisImageUserContentPart,\n} from \"./utils.ts\"\n\ntype ContentToolResultOutput = Extract<ToolResultPart[\"output\"], { type: \"content\" }>\ntype ContentToolResultPart = ContentToolResultOutput[\"value\"][number]\n\nfunction imagePartToURL(image: ImagePart[\"image\"]): string | undefined {\n\tif (typeof image === \"string\") return image\n\tif (image instanceof URL) return image.toString()\n}\n\n/**\n * Transforms image URLs and redacts outdated screenshots to try and stay within the model's image limits.\n * - If an image exceeds the model's max dimension it will be transformed to a scaled image URL.\n * - If a screenshot has been repeated the earlier results are redacted to avoid triggering lower size limits (when > 20 images the max dimension size is much smaller)\n * - If there are too many vision images for the model, older image parts are removed while preserving their URLs in text/JSON.\n */\nexport function applyImageSizeLimitsAndRedact(ctx: AgentContext) {\n\treturn async (messages: ModelMessage[], model: LanguageModel): Promise<ModelMessage[]> => {\n\t\tif (!hasAnyVisionImageLimitForModel(model)) return messages\n\n\t\tlet result: ModelMessage[] | undefined = undefined\n\t\tconst screenshotsRequestsSeen = new Set<string>()\n\t\tconst maxDimension = getMaxAttachmentDimensionForModel(model)\n\t\tconst { redactExcessImagesFromToolOutput, redactExcessImagesFromUserContentImagePart } =\n\t\t\tgetVisionImageRedacter(model)\n\n\t\tfor (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex--) {\n\t\t\tconst message = messages[messageIndex]\n\t\t\tif (!message) continue\n\n\t\t\tif (isUserModelMessage(message) && isArray(message.content)) {\n\t\t\t\tlet content: UserContent | undefined = undefined\n\t\t\t\tfor (let partIndex = message.content.length - 1; partIndex >= 0; partIndex--) {\n\t\t\t\t\tconst part = message.content[partIndex]\n\t\t\t\t\tif (!isImageUserContentPart(part)) continue\n\n\t\t\t\t\tconst redactedPart = redactExcessImagesFromUserContentImagePart(part)\n\t\t\t\t\tif (redactedPart !== part) {\n\t\t\t\t\t\tcontent ??= [...message.content]\n\t\t\t\t\t\tcontent[partIndex] = redactedPart\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst imageUrl = imagePartToURL(part.image)\n\t\t\t\t\tif (!imageUrl || !isFramerAssetUrl(imageUrl)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst scaledImageUrl = await ctx.files.getScaledImageUrl(imageUrl, maxDimension)\n\t\t\t\t\tif (scaledImageUrl === imageUrl) continue\n\n\t\t\t\t\tcontent ??= [...message.content]\n\t\t\t\t\tcontent[partIndex] = {\n\t\t\t\t\t\t...part,\n\t\t\t\t\t\timage: scaledImageUrl,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!content) continue\n\n\t\t\t\tresult ??= [...messages]\n\t\t\t\tresult[messageIndex] = { ...message, content }\n\t\t\t}\n\n\t\t\tif (isToolModelMessage(message)) {\n\t\t\t\tlet content: ToolContent | undefined = undefined\n\t\t\t\tfor (let partIndex = message.content.length - 1; partIndex >= 0; partIndex--) {\n\t\t\t\t\tconst part = message.content[partIndex]\n\t\t\t\t\tif (!part || !isToolResultModelPart(part)) continue\n\n\t\t\t\t\tlet output = part.output\n\t\t\t\t\tif (isReadProjectToolResultPart(part)) {\n\t\t\t\t\t\tconst toolResponse = parseReadProjectToolResultOutput(part.output)\n\t\t\t\t\t\tif (toolResponse) {\n\t\t\t\t\t\t\tlet replacedAnyImageUrl = false\n\t\t\t\t\t\t\tconst updatedQueryResults: ReadProjectResult[] = []\n\t\t\t\t\t\t\tfor (const queryResult of toolResponse.queryResults) {\n\t\t\t\t\t\t\t\tif (!isScreenshotResult(queryResult)) {\n\t\t\t\t\t\t\t\t\tupdatedQueryResults.push(queryResult)\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst requestKey = getScreenshotRequestKey(queryResult)\n\t\t\t\t\t\t\t\tif (screenshotsRequestsSeen.has(requestKey)) {\n\t\t\t\t\t\t\t\t\t// preemptively redact older screenshots to avoid triggering lower size limits (when > 20 images the max dimension size is much smaller)\n\t\t\t\t\t\t\t\t\tupdatedQueryResults.push({\n\t\t\t\t\t\t\t\t\t\ttype: SCREENSHOT_QUERY,\n\t\t\t\t\t\t\t\t\t\tredacted: true,\n\t\t\t\t\t\t\t\t\t\treason: \"Redacted screenshot due to superceding screenshot request.\",\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\treplacedAnyImageUrl = true\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tscreenshotsRequestsSeen.add(requestKey)\n\n\t\t\t\t\t\t\t\tconst scaledUrl = await ctx.files.getScaledImageUrl(queryResult.image_url, maxDimension)\n\t\t\t\t\t\t\t\tif (scaledUrl === queryResult.image_url) {\n\t\t\t\t\t\t\t\t\tupdatedQueryResults.push(queryResult)\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treplacedAnyImageUrl = true\n\t\t\t\t\t\t\t\tupdatedQueryResults.push({\n\t\t\t\t\t\t\t\t\t...queryResult,\n\t\t\t\t\t\t\t\t\timage_url: scaledUrl,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (replacedAnyImageUrl) {\n\t\t\t\t\t\t\t\toutput = getReadProjectToolResultOutput({ ...toolResponse, queryResults: updatedQueryResults })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (part.toolName === VIEW_IMAGE_TOOL_NAME) {\n\t\t\t\t\t\tconst toolResponse = parseViewImageToolResultOutput(part.output)\n\t\t\t\t\t\tif (toolResponse) {\n\t\t\t\t\t\t\tconst updatedResponse = await getScaledViewImageResponse(ctx, toolResponse, maxDimension)\n\t\t\t\t\t\t\tif (updatedResponse) output = getViewImageToolResultOutput(updatedResponse)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\toutput = redactExcessImagesFromToolOutput(output)\n\n\t\t\t\t\tif (output === part.output) continue\n\n\t\t\t\t\tcontent ??= [...message.content]\n\t\t\t\t\tcontent[partIndex] = {\n\t\t\t\t\t\t...part,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!content) continue\n\n\t\t\t\tresult ??= [...messages]\n\t\t\t\tresult[messageIndex] = { ...message, content }\n\t\t\t}\n\t\t}\n\n\t\treturn result ?? messages\n\t}\n}\n\nasync function getScaledViewImageResponse(\n\tctx: AgentContext,\n\tresponse: ViewImageResponse,\n\tmaxDimension: number | undefined,\n): Promise<ViewImageResponse | undefined> {\n\tlet results: ViewImageResponse[\"results\"] | undefined = undefined\n\n\tfor (const [index, result] of response.results.entries()) {\n\t\tif (!(\"image_url\" in result) || !isFramerAssetUrl(result.image_url)) continue\n\n\t\tconst scaledImageUrl = await ctx.files.getScaledImageUrl(result.image_url, maxDimension)\n\t\tif (scaledImageUrl === result.image_url) continue\n\n\t\tresults ??= [...response.results]\n\t\tresults[index] = {\n\t\t\t...result,\n\t\t\timage_url: scaledImageUrl,\n\t\t}\n\t}\n\n\tif (!results) return\n\treturn {\n\t\t...response,\n\t\tresults,\n\t}\n}\n\nfunction getVisionImageRedacter(model: LanguageModel) {\n\tconst maxVisionImages = getMaxVisionImagesForModel(model)\n\tconst maxVisionImageSizeKB = getMaxVisionImageSizeKBForModel(model)\n\tlet currentVisionImages = 0\n\tconst isUnderVisionLimit = () => {\n\t\tif (!maxVisionImages) return true\n\t\tif (currentVisionImages >= maxVisionImages) return false\n\t\tcurrentVisionImages++\n\t\treturn true\n\t}\n\n\treturn {\n\t\tmaxVisionImages,\n\t\tcurrentVisionImages,\n\t\tredactExcessImagesFromToolOutput:\n\t\t\tmaxVisionImages || maxVisionImageSizeKB\n\t\t\t\t? (output: ToolResultPart[\"output\"]) =>\n\t\t\t\t\t\trewriteToolOutputWithVisionImageLimits(output, isUnderVisionLimit, maxVisionImageSizeKB)\n\t\t\t\t: (output: ToolResultPart[\"output\"]) => output,\n\t\tredactExcessImagesFromUserContentImagePart:\n\t\t\tmaxVisionImages || maxVisionImageSizeKB\n\t\t\t\t? (part: ImagePart) => {\n\t\t\t\t\t\tconst url = imagePartToURL(part.image)\n\t\t\t\t\t\tif (isVisionSuitableImage(url, maxVisionImageSizeKB) && isUnderVisionLimit()) return part\n\t\t\t\t\t\treturn textPartForRemovedImage(url)\n\t\t\t\t\t}\n\t\t\t\t: (part: ImagePart) => part,\n\t}\n}\n\n/** Image attachments include a `kb` query param with the image size in KB. Some models have a hard limit on the KB size of any single image. */\nfunction isVisionSuitableImage(url: string | undefined, maxVisionImageSizeKB: number | undefined): boolean {\n\tif (!url) return false\n\tif (!maxVisionImageSizeKB) return true\n\tconst imageSizeKB = getImageSizeKB(url)\n\tif (!imageSizeKB) return true\n\treturn imageSizeKB <= maxVisionImageSizeKB\n}\n\nfunction getImageSizeKB(url: string): number | undefined {\n\tconst imageUrl = new URL(url)\n\tconst sizeKB = imageUrl.searchParams.get(\"kb\")\n\treturn sizeKB ? parseInt(sizeKB) : undefined\n}\n\nfunction rewriteToolOutputWithVisionImageLimits(\n\toutput: ToolResultPart[\"output\"],\n\tisUnderVisionLimit: () => boolean,\n\tmaxVisionImageSizeKB: number | undefined,\n): ToolResultPart[\"output\"] {\n\tif (output.type !== \"content\") return output\n\n\tlet value: ContentToolResultPart[] | undefined = undefined\n\tfor (let partIndex = output.value.length - 1; partIndex >= 0; partIndex--) {\n\t\tconst part = output.value[partIndex]\n\t\tif (part?.type !== \"image-url\") continue\n\t\tif (isVisionSuitableImage(part.url, maxVisionImageSizeKB) && isUnderVisionLimit()) continue\n\n\t\tvalue ??= [...output.value]\n\t\tvalue.splice(partIndex, 1)\n\t}\n\n\tif (!value) return output\n\treturn { ...output, value }\n}\n\nfunction textPartForRemovedImage(imageUrl: string | undefined): Exclude<UserContent, string>[number] {\n\tconst text = imageUrl\n\t\t? `Image URL preserved without vision input due to model image limits: ${imageUrl}`\n\t\t: \"Image omitted due to model image limits.\"\n\treturn { type: \"text\", text }\n}\n", "import type { ModelMessage } from \"ai\"\nimport type { LanguageModel } from \"app/ai/languageModels.ts\"\n\n/** Transforms messages before a step. Must return the original reference when no modifications are needed. */\nexport type MessageTransformer = (\n\tmessages: ModelMessage[],\n\tmodel: LanguageModel,\n) => Promise<ModelMessage[]> | ModelMessage[]\n\n/**\n * Applies a list of message transformers in sequence.\n * Returns the original messages if no transformations were applied.\n */\nexport async function applyMessageTransformers(\n\tmessages: ModelMessage[],\n\tmodel: LanguageModel,\n\ttransformers: MessageTransformer[],\n): Promise<ModelMessage[]> {\n\tlet result = messages\n\tfor (const transformer of transformers) {\n\t\tresult = await transformer(result, model)\n\t}\n\treturn result\n}\n", "import type { ModelMessage } from \"ai\"\nimport { employeesOnlySettings } from \"app/employeesOnlySettings.ts\"\nimport type { AgentContext } from \"../../context/AgentContext.ts\"\nimport { REDACTED_EXAMPLE_MESSAGE } from \"../../prompt/tools.ts\"\nimport { type ReadProjectResult, isExampleErrorResult, isNodeExampleResult } from \"../readProject.ts\"\nimport {\n\tisReadProjectToolResultPart,\n\tisToolModelMessage,\n\tisToolResultModelPart,\n\tparseReadProjectToolResultOutput,\n\trewriteReadProjectToolResultOutput,\n} from \"./utils.ts\"\n\nfunction redactQueryResults(\n\tqueryResults: ReadProjectResult[],\n\tloadedExampleNames: Set<string>,\n\tseenLoadedExampleNames: Set<string>,\n): ReadProjectResult[] {\n\treturn queryResults.map(result => {\n\t\tif (!isNodeExampleResult(result)) return result\n\t\tif (isExampleErrorResult(result)) return result\n\n\t\tconst isLoaded = loadedExampleNames.has(result.name)\n\t\tconst hasBeenSeen = seenLoadedExampleNames.has(result.name)\n\t\tif (isLoaded && !hasBeenSeen) {\n\t\t\tseenLoadedExampleNames.add(result.name)\n\t\t\treturn result\n\t\t}\n\n\t\treturn { ...result, guide: REDACTED_EXAMPLE_MESSAGE }\n\t})\n}\n\nexport function redactUnloadedExamples(ctx: AgentContext) {\n\treturn (messages: ModelMessage[]): ModelMessage[] => {\n\t\tif (employeesOnlySettings.isOn(\"disableAIAgentMessageRedaction\")) return messages\n\t\t// Create the set on invocation to create a fresh list.\n\t\tconst loadedExampleNames = new Set(ctx.examples.loadedExampleNames)\n\t\tconst seenLoadedExampleNames = new Set<string>()\n\t\tconst updatedMessages = [...messages]\n\n\t\tfor (let messageIndex = updatedMessages.length - 1; messageIndex >= 0; messageIndex--) {\n\t\t\tconst message = updatedMessages[messageIndex]\n\t\t\tif (!message || !isToolModelMessage(message)) continue\n\n\t\t\tupdatedMessages[messageIndex] = {\n\t\t\t\t...message,\n\t\t\t\tcontent: message.content.map(part => {\n\t\t\t\t\tif (!isToolResultModelPart(part) || !isReadProjectToolResultPart(part)) {\n\t\t\t\t\t\treturn part\n\t\t\t\t\t}\n\n\t\t\t\t\tconst toolResponse = parseReadProjectToolResultOutput(part.output)\n\t\t\t\t\tif (!toolResponse) return part\n\t\t\t\t\tconst rewrittenOutput = rewriteReadProjectToolResultOutput(part.output, {\n\t\t\t\t\t\tqueryResults: redactQueryResults(toolResponse.queryResults, loadedExampleNames, seenLoadedExampleNames),\n\t\t\t\t\t\tsystemState: toolResponse.systemState,\n\t\t\t\t\t})\n\t\t\t\t\tif (!rewrittenOutput) return part\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...part,\n\t\t\t\t\t\toutput: rewrittenOutput,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t}\n\t\t}\n\n\t\treturn updatedMessages\n\t}\n}\n", "import { LogLevel, assert, assertNever, getLogger, murmurHash } from \"@framerjs/shared\"\nimport {\n\ttype LanguageModelUsage,\n\ttype ModelMessage,\n\ttype StreamTextOnStepFinishCallback,\n\tstreamText as aiStreamText,\n\tstepCountIs,\n} from \"ai\"\nimport { getOpenRouterCostFromMetadata } from \"app/ai/utils/openRouterUsage.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { BaseEngineScheduler } from \"document/base-engine/BaseEngine.ts\"\nimport type { Changeset } from \"document/models/CanvasTree/Changeset.ts\"\nimport type { NodeID, ScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport type { Loaded } from \"document/models/CanvasTree/traits/WithScopeLoader.ts\"\nimport type { TreeStore } from \"document/stores/TreeStore.ts\"\nimport { LockQueue } from \"document/utils/LockQueue.ts\"\nimport { objectKeys } from \"library/utils/objectKeys.ts\"\nimport { isObject, isUndefined } from \"utils/typeChecks.ts\"\nimport {\n\tResponsesProviderRoute,\n\tcreateBasetenLanguageModel,\n\tcreateResponsesProvider,\n\tcreateVekterOpenRouterExtraBody,\n\tgetBasetenProviderOptionsForEffort,\n\tisBasetenModelId,\n\tisOpenAIResponsesModelId,\n\topenRouter,\n\ttoOpenAIResponsesModelId,\n} from \"../config/openRouter.ts\"\nimport { LanguageModel } from \"../languageModels.ts\"\nimport {\n\ttype AgentReasoningEffort,\n\tgetOpenAIResponsesReasoningEffort,\n\tgetProviderForModel,\n\tgetReasoningForEffort,\n} from \"../models.ts\"\nimport type { AgentInteractionHandle } from \"../raindrop/AgentInteraction.ts\"\nimport { ScreenshotTargetCollector, type CaptureScreenshots } from \"../raindrop/ScreenshotTargetCollector.ts\"\nimport { createAgentStreamTracer, type AgentStreamTracer } from \"../raindrop/agentStreamTrace.ts\"\nimport {\n\tRAINDROP_SELF_DIAGNOSTICS_TOOL_NAME,\n\tfilterRaindropSelfDiagnosticsMessages,\n\tgetRaindropTracesOnlyAI,\n} from \"../raindrop/client.ts\"\nimport type { OpenRouterFeatureTraceConfig } from \"../tracing/openRouterTrace.ts\"\nimport { createDocumentParser } from \"./DocumentParser.ts\"\nimport { withPromptCaching } from \"./cache/cache.ts\"\nimport { getCommandCollectionTargetId, getCommandCreatedIds, getCommandTouchedNodeIds } from \"./commandTargets.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { isVariableReferenceHandle } from \"./context/dynamicValues.ts\"\nimport { DSLParserError, type CommandDiagnostics } from \"./context/issues.ts\"\nimport { isVirtualNodeId, parseVirtualNodeId } from \"./context/richtext/document.ts\"\nimport { parseRichTextTarget } from \"./context/richtext/targets.ts\"\nimport { logAgentRequest } from \"./debug/logAgentRequest.ts\"\nimport { logStepUsage } from \"./debug/logStepUsage.ts\"\nimport { logStreamConfig } from \"./debug/logStreamConfig.ts\"\nimport { type Command, CommandType, QUOTE_REPAIR_WARNING, isAddVariableCommandAttributes } from \"./dsl.ts\"\nimport { isQueueInterruptedError, isUserStopError } from \"./errors.ts\"\nimport { AgentTrainingDataCollector, type AgentTrainingStep } from \"./evals/export/AgentTrainingDataCollector.ts\"\nimport { isAgentInvalidToolCall, toAgentInvalidToolCall } from \"./messages.ts\"\nimport { hasMutatingNodes, type NodesMutatedByAgent } from \"./nodesMutatedByAgent.ts\"\nimport { createProcessCommand } from \"./processCommand.ts\"\nimport { buildSystemPrompt } from \"./prompt/systemPrompt.ts\"\nimport type { Source } from \"./source.ts\"\nimport { abortableAgentStream } from \"./streamParts.ts\"\nimport { synchronizeAgentContext } from \"./synchronizeAgentContext.ts\"\nimport { getStreamRequestTokenEstimates } from \"./tokens.ts\"\nimport type { ClarificationAnswerProvider } from \"./tools/askClarification.ts\"\nimport type { RequestCodeFileChangesExecutor, RequestCodeFileHistoryChange } from \"./tools/requestCodeFileChanges.ts\"\nimport type { AgentScriptInstrumentation } from \"./tools/script/bridge.ts\"\nimport {\n\tASK_CLARIFICATION_TOOL_NAME,\n\tCHECKLIST_COMPLETE_TASK_TOOL_NAME,\n\tCHECKLIST_CREATE_TOOL_NAME,\n\tCREATE_COMPONENT_FROM_FRAME_TOOL_NAME,\n\tFETCH_EXTERNAL_URL_TOOL_NAME,\n\tFLATTEN_COMPONENT_INSTANCE_TOOL_NAME,\n\tMAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME,\n\tPUBLISH_TOOL_NAME,\n\tQUERY_IMAGES_TOOL_NAME,\n\tREAD_PROJECT_TOOL_NAME,\n\tREQUEST_CODE_FILE_CHANGES_TOOL_NAME,\n\tREVIEW_CHANGES_TOOL_NAME,\n\tSCRIPT_TOOL_NAME,\n\tVIEW_IMAGE_TOOL_NAME,\n} from \"./tools/toolNames.ts\"\nimport {\n\tcreateToolSet,\n\tisAgentTypedToolResult,\n\ttoAgentTypedToolCall,\n\ttype AgentToolSet,\n\ttype AgentTypedToolResult,\n} from \"./tools/toolSet.ts\"\nimport { applyImageSizeLimitsAndRedact } from \"./tools/transformers/imageTransformer.ts\"\nimport { applyMessageTransformers } from \"./tools/transformers/messageTransformer.ts\"\nimport { redactUnloadedExamples } from \"./tools/transformers/unloadedExamplesTransformer.ts\"\nimport type { EmitChatPart } from \"./types.ts\"\n\nconst defaultMaxSteps = 100\n\nconst log = getLogger(\"ai:agents\")\n\ntype StreamTextFn = typeof aiStreamText\ntype StreamTextProviderOptions = NonNullable<Parameters<StreamTextFn>[0][\"providerOptions\"]>\ntype StreamTextStepFinish = Parameters<StreamTextOnStepFinishCallback<AgentToolSet>>[0]\ntype RaindropStreamTextTelemetryOptions = Pick<Parameters<StreamTextFn>[0], \"experimental_telemetry\">\n\ninterface TrainingStepInput {\n\tstepIndex: number\n\tmessages: readonly ModelMessage[]\n}\n\ninterface StreamContext {\n\ttrainingStepInput: TrainingStepInput\n}\n\nconst traingStepInputKey = \"trainingStepInput\" satisfies keyof StreamContext\nfunction isStreamContext(value: unknown): value is StreamContext {\n\treturn isObject(value) && traingStepInputKey in value\n}\n\nfunction getActiveToolsForSource(tools: AgentToolSet, source: Source): (keyof AgentToolSet)[] | undefined {\n\tif (source.agent === \"app\") return\n\tif (source.agent === \"user-agent\") return objectKeys(tools)\n\n\tconst activeTools: (keyof AgentToolSet)[] = []\n\tfor (const name of objectKeys(tools)) {\n\t\tswitch (name) {\n\t\t\tcase ASK_CLARIFICATION_TOOL_NAME:\n\t\t\tcase CHECKLIST_CREATE_TOOL_NAME:\n\t\t\tcase CHECKLIST_COMPLETE_TASK_TOOL_NAME:\n\t\t\t\tbreak\n\t\t\tcase VIEW_IMAGE_TOOL_NAME:\n\t\t\tcase READ_PROJECT_TOOL_NAME:\n\t\t\tcase REVIEW_CHANGES_TOOL_NAME:\n\t\t\tcase QUERY_IMAGES_TOOL_NAME:\n\t\t\tcase FETCH_EXTERNAL_URL_TOOL_NAME:\n\t\t\tcase FLATTEN_COMPONENT_INSTANCE_TOOL_NAME:\n\t\t\tcase MAKE_EXTERNAL_COMPONENT_LOCAL_TOOL_NAME:\n\t\t\tcase REQUEST_CODE_FILE_CHANGES_TOOL_NAME:\n\t\t\tcase SCRIPT_TOOL_NAME:\n\t\t\tcase PUBLISH_TOOL_NAME:\n\t\t\tcase CREATE_COMPONENT_FROM_FRAME_TOOL_NAME:\n\t\t\t\tactiveTools.push(name)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(name)\n\t\t}\n\t}\n\treturn activeTools\n}\n\nfunction shouldEnableRaindropSelfDiagnostics(source: Source, ctx: AgentContext): boolean {\n\tconst user = ctx.sessionStore.user\n\treturn source.agent === \"app\" && experiments.isOn(\"raindropSelfDiagnostics\") && user?.isFramerEmployee === true\n}\n\nfunction getSystemPromptHash(prompt: string): string {\n\treturn murmurHash(prompt).toString(36)\n}\n\ninterface MessageOptions {\n\tmodel: LanguageModel\n\treasoningEffort?: AgentReasoningEffort\n\tabortSignal?: AbortSignal\n\timageFiles?: readonly File[]\n\tselection?: readonly NodeID[]\n}\n\nexport interface StreamLifeCycleHooks {\n\tonPart?: EmitChatPart\n\tonContext?: (context: AgentContext) => void\n\tonStepFinish?: (step: Partial<StreamTextStepFinish>) => void | Promise<void>\n\tonPrepareStep?: () => readonly ModelMessage[] | undefined | Promise<readonly ModelMessage[] | undefined>\n\t/**\n\t * Receives the code-file history metadata produced during this request so the caller can persist\n\t * it on the corresponding message and restore those file versions later if the request is undone.\n\t */\n\tonCodeFileHistoryChanges?: (changes: readonly RequestCodeFileHistoryChange[]) => void\n\tonSystemPromptHash?: (hash: string) => void\n\tonSystemPromptSnapshot?: (prompt: string) => void\n\t/** Unparsed assistant text, one entry per step, for attaching to the Raindrop turn event. */\n\tonRawAssistantText?: (textByStep: readonly string[]) => void\n\tonFirstToken?: () => void\n\tonInputEstimate?: (estimatedTokens: number) => void\n\tonStepUsage?: (usage: LanguageModelUsage) => void\n\tonCommandReceived?: (command: Command, raw: string) => void\n\tonCommandApplied?: (command: Command, diagnostics: CommandDiagnostics, raw: string) => void\n\tonCommandFailed?: (raw: string, error: unknown) => void\n\tonUpdateNodes?: (mutatingNodes: NodesMutatedByAgent) => void\n\tonCaptureScreenshots?: CaptureScreenshots\n\tonParseError?: (line: string, error: unknown) => void\n\twaitForUserAnswers?: ClarificationAnswerProvider\n\t/** Fires once per inner-agent step with the SFT-ready (system, tools, messages) \u2192 response training row. */\n\tonTrainingStep?: (step: AgentTrainingStep) => void\n}\n\ninterface StreamOptions extends MessageOptions, StreamLifeCycleHooks {\n\tmaxSteps?: number\n\tmessages?: readonly ModelMessage[]\n\tsource: Source\n\t/** Present for in-app turns; plugin/eval callers omit this and tools run without a parent interaction. */\n\tagentInteraction?: AgentInteractionHandle\n\traindropEventId?: string\n\traindropTelemetryOptions?: RaindropStreamTextTelemetryOptions\n\tdisableRaindropTelemetry?: boolean\n\ttraceConfig: OpenRouterFeatureTraceConfig\n\tturnId?: string\n\taiServiceMetaUserPrompt?: string\n\tqueue?: LockQueue\n\trequestCodeFileChangesExecutor?: RequestCodeFileChangesExecutor\n\tscriptEvalInstrumentation?: AgentScriptInstrumentation\n}\n\ninterface AgentStepModelOptions extends Pick<\n\tStreamOptions,\n\t\"model\" | \"reasoningEffort\" | \"traceConfig\" | \"turnId\" | \"aiServiceMetaUserPrompt\"\n> {\n\tstepIndex: number\n}\n\nconst openAIProvider = createResponsesProvider({ route: ResponsesProviderRoute.OpenAI })\n\nfunction getAgentProviderOptions({\n\tmodel,\n\treasoningEffort,\n}: Pick<AgentStepModelOptions, \"model\" | \"reasoningEffort\">): StreamTextProviderOptions | undefined {\n\tif (isBasetenModelId(model)) {\n\t\tconst basetenOptions = getBasetenProviderOptionsForEffort(reasoningEffort, model)\n\t\treturn basetenOptions ? { baseten: basetenOptions } : undefined\n\t}\n\n\tif (!isOpenAIResponsesModelId(model)) return\n\n\tconst openAIReasoningEffort = getOpenAIResponsesReasoningEffort(reasoningEffort, model)\n\n\t// Stored Responses items can turn prior function calls into item references, but follow-up\n\t// function outputs must include the matching function call in the proxied request.\n\treturn openAIReasoningEffort\n\t\t? { openai: { reasoningEffort: openAIReasoningEffort, store: false } }\n\t\t: { openai: { store: false } }\n}\n\n// Current GPT 5.x Responses models need the OpenRouter proxy path for provider routing and billing.\n// GPT Next is only available through the direct OpenAI Responses route.\nfunction shouldUseOpenRouterResponsesProvider(model: LanguageModel): boolean {\n\tswitch (model) {\n\t\tcase LanguageModel.GPTNEXT:\n\t\t\treturn false\n\t\tcase LanguageModel.GPT51:\n\t\tcase LanguageModel.GPT52:\n\t\tcase LanguageModel.GPT52Codex:\n\t\tcase LanguageModel.GPT51CodexMini:\n\t\tcase LanguageModel.GPT53Codex:\n\t\tcase LanguageModel.GPT54:\n\t\tcase LanguageModel.GPT54Mini:\n\t\tcase LanguageModel.GPT55:\n\t\t\treturn !experiments.isOn(\"agentUseOpenAIResponsesAPI\")\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n\nfunction createAgentOpenRouterResponsesProvider({ stepIndex, ...options }: AgentStepModelOptions) {\n\treturn createResponsesProvider({\n\t\troute: ResponsesProviderRoute.OpenRouter,\n\t\tprovider: getProviderForModel(options.model),\n\t\tmetadata: {\n\t\t\tfeatureCategory: \"agents\",\n\t\t\tfeatureName: options.traceConfig.featureName,\n\t\t\tstep: options.traceConfig.step,\n\t\t\tstepIndex,\n\t\t\tsessionId: options.traceConfig.sessionId,\n\t\t\tturnId: options.turnId,\n\t\t\tuserPrompt: stepIndex === 0 ? options.aiServiceMetaUserPrompt : undefined,\n\t\t},\n\t})\n}\n\nfunction createAgentStepModel({ stepIndex, ...options }: AgentStepModelOptions) {\n\tif (isBasetenModelId(options.model)) {\n\t\treturn createBasetenLanguageModel(options.model)\n\t}\n\n\tif (isOpenAIResponsesModelId(options.model)) {\n\t\treturn shouldUseOpenRouterResponsesProvider(options.model)\n\t\t\t? createAgentOpenRouterResponsesProvider({ stepIndex, ...options }).model(options.model)\n\t\t\t: openAIProvider.model(toOpenAIResponsesModelId(options.model))\n\t}\n\n\treturn openRouter(options.model, {\n\t\tprovider: getProviderForModel(options.model),\n\t\treasoning: getReasoningForEffort(options.reasoningEffort, options.model),\n\t\textraBody: createVekterOpenRouterExtraBody({\n\t\t\tfeatureCategory: \"agents\",\n\t\t\tmodel: options.model,\n\t\t\treasoningEffort: options.reasoningEffort,\n\t\t\tstepIndex,\n\t\t\tturnId: options.turnId,\n\t\t\t// For tracking purposes, send the user prompt in the first step,\n\t\t\t// the following steps will be associated with the prompt in BigQuery.\n\t\t\tuserPrompt: stepIndex === 0 ? options.aiServiceMetaUserPrompt : undefined,\n\t\t\t...options.traceConfig,\n\t\t}),\n\t})\n}\n\nfunction closeUnsuccessfulRootTrace(tracer: AgentStreamTracer | undefined, rootError: unknown): void {\n\tif (!tracer) return\n\n\tif (isUserStopError(rootError)) {\n\t\ttracer.endRootCancelled(\"user-stopped\")\n\t\treturn\n\t}\n\tif (isQueueInterruptedError(rootError)) {\n\t\ttracer.endRootCancelled(\"queue-interrupted\")\n\t\treturn\n\t}\n\ttracer.endRootFailure(rootError)\n}\n\nasync function closeUnsuccessfulRootTraceAfterQueuedCommandsDrain(\n\tqueue: LockQueue,\n\ttracer: AgentStreamTracer | undefined,\n\trootError: unknown,\n\tonQueueDrained?: () => void | Promise<void>,\n): Promise<void> {\n\t// Queued DSL handlers close command/group spans in their own finally blocks. Wait for that\n\t// snapshot to drain before ending the root span so cancelled/error traces keep valid nesting.\n\ttry {\n\t\tawait queue.synchronize()\n\t} catch (error) {\n\t\tlog.reportError(error)\n\t}\n\n\ttry {\n\t\tawait onQueueDrained?.()\n\t} catch (error) {\n\t\tlog.reportError(error)\n\t}\n\n\tcloseUnsuccessfulRootTrace(tracer, rootError)\n}\n\nexport async function stream(\n\tchangeset: Changeset,\n\ttreeStore: TreeStore,\n\tinsertionScopeNode: Loaded<ScopeNode>,\n\tscheduler: BaseEngineScheduler,\n\tmessages: ModelMessage[],\n\tctx: AgentContext,\n\toptions: StreamOptions,\n): Promise<{\n\tusage: LanguageModelUsage\n\tinitialUsage: LanguageModelUsage\n\ttotalUsage: LanguageModelUsage\n\t/**\n\t * Sum of provider-reported USD (OpenRouter `usage.cost`) across all steps for the main\n\t * agent model. Always 0 for providers that don't report cost (e.g. direct OpenAI Responses).\n\t */\n\tproviderReportedCost: number\n\t/** Sum of sub-model tool costs (e.g. script analyze/search) accrued across all steps. */\n\tsubModelCost: number\n\telapsedMs: number\n\tttftMs?: number\n\tresponseMessages: readonly ModelMessage[]\n\ttext: string\n}> {\n\toptions.model ??= LanguageModel.GPT52\n\toptions.maxSteps ??= defaultMaxSteps\n\tconst streamStartedAt = performance.now()\n\n\tlet tracer: AgentStreamTracer | undefined\n\ttry {\n\t\ttracer = createAgentStreamTracer(options.raindropEventId)\n\t} catch (error) {\n\t\tlog.reportError(error)\n\t}\n\n\tlet streamCompletedSuccessfully = false\n\tlet rootError: unknown\n\n\t// Accumulate the unparsed assistant text per step so it can be attached to the Raindrop turn\n\t// event for debugging the DSL parser against the model's literal output. Declared outside the\n\t// try so the finally can flush buffered text on error/abort paths too.\n\tconst rawAssistantTextByStep: string[] = []\n\tlet currentStepRawText = \"\"\n\tconst flushRawAssistantStepText = () => {\n\t\tif (currentStepRawText.length === 0) return\n\t\trawAssistantTextByStep.push(currentStepRawText)\n\t\tcurrentStepRawText = \"\"\n\t\toptions.onRawAssistantText?.(rawAssistantTextByStep)\n\t}\n\n\t// Processing a single command may require awaiting an async task. It's important that\n\t// subsequent commands are recorded as they are received from the streamer, but also important\n\t// that they are executed on the document subsequently. The LockQueue guarantees this, allowing\n\t// the entire chain to be awaited before resolving the stream.\n\tconst queue = options.queue ?? new LockQueue()\n\tconst screenshotTargets = new ScreenshotTargetCollector(ctx, options.agentInteraction, options.onCaptureScreenshots)\n\n\ttry {\n\t\t// Open the root span first; parser / command-pipeline setup and executeStreamRequest preflight\n\t\t// all run under the same try/finally so any failure closes the span (finish_reason error).\n\t\ttracer?.getRootTraceParent()\n\n\t\t// Let errors (sync or async) propagate out of `scheduleAgentChanges` so `processCommand`\n\t\t// rejects and the single catch in `onDSLCommand` below owns the failure lifecycle (close\n\t\t// trace with error, record issue, log, invoke `onCommandFailed`). Swallowing here caused\n\t\t// the same command to be reported as both failed *and* applied.\n\t\tconst processCommand = createProcessCommand(treeStore, insertionScopeNode, ctx, fn =>\n\t\t\tscheduler.scheduleAgentChanges(() =>\n\t\t\t\tchangeset.append(() => {\n\t\t\t\t\tfn()\n\t\t\t\t\t// Trying to apply deferred changes immediately after originally attempting them\n\t\t\t\t\t// is guaranteed to fail, but in exchange we apply deferred changes one command\n\t\t\t\t\t// sooner (after the subsequent update, instead of before the next update). This\n\t\t\t\t\t// is a conscious UX tradeoff: the deferred queue is typically small (currently\n\t\t\t\t\t// only size-related), and paying a bit more CPU to reapply failed changes\n\t\t\t\t\t// earlier keeps the canvas state feeling responsive and avoids intermediate\n\t\t\t\t\t// broken layouts.\n\t\t\t\t\tctx.deferred.applyTraits(ctx)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\tconst createDSLCommandHandler = (persistParts?: boolean) => {\n\t\t\treturn (parsed: Command | Error, raw: string) => {\n\t\t\t\tif (options.abortSignal?.aborted) return\n\n\t\t\t\tif (parsed instanceof Error) {\n\t\t\t\t\tconst parserError = new DSLParserError(raw, parsed)\n\t\t\t\t\tctx.issues.error(raw, parserError)\n\t\t\t\t\tlog.reportError(parserError, { rawCommand: raw })\n\t\t\t\t\toptions.onParseError?.(raw, parserError)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tctx.treeResolver.consumeResolutionError()\n\t\t\t\tconst collectScreenshotTargets = screenshotTargets.trackCommand(parsed)\n\n\t\t\t\t// Capture collection attribution before the command executes; remove commands\n\t\t\t\t// delete the target node, making it unresolvable in the tree afterward.\n\t\t\t\tconst collectionIdBeforeExecute = getCommandCollectionTargetId(parsed, ctx)\n\n\t\t\t\t// Send the command to the UI immediately - bypassing the lock queue, but ensuring that the\n\t\t\t\t// command never interrupts prose stream.\n\t\t\t\tconst patchPart = options.onPart?.({ type: \"command\", command: parsed }, persistParts)\n\n\t\t\t\tvoid queue.request(async () => {\n\t\t\t\t\toptions.onCommandReceived?.(parsed, raw)\n\n\t\t\t\t\tlog.trace(`Command received: ${JSON.stringify(parsed)}`)\n\t\t\t\t\tconst commandTrace = tracer?.openDSLCommandTrace(parsed)\n\t\t\t\t\tlet commandError: unknown\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait processCommand(parsed, raw)\n\n\t\t\t\t\t\tconst resolutionError = ctx.treeResolver.consumeResolutionError()\n\t\t\t\t\t\tif (resolutionError) {\n\t\t\t\t\t\t\tctx.issues.error(raw, resolutionError, { nodeIds: [resolutionError.nodeId] })\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toptions.onCommandApplied?.(parsed, ctx.issues.peekByRawCommand(raw), raw)\n\n\t\t\t\t\t\tconst mutatingNodes = ctx.treeResolver.drainMutatingNodes()\n\t\t\t\t\t\tif (hasMutatingNodes(mutatingNodes)) options.onUpdateNodes?.(mutatingNodes)\n\t\t\t\t\t\tconst affectedScopeIdAfterCommand = getScopeIdForRawCommand(parsed, ctx)\n\t\t\t\t\t\tconst resolvedNodeIdAfterCommand = getNodeIdForRawCommand(parsed, ctx)\n\n\t\t\t\t\t\t// Update the part with internal IDs for UI bookkeeping.\n\t\t\t\t\t\tpatchPart?.ui(current => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\tscopeId: affectedScopeIdAfterCommand,\n\t\t\t\t\t\t\t\tcollectionId: collectionIdBeforeExecute,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tpatchPart?.response?.(current => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\tnodeId: resolvedNodeIdAfterCommand,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tcollectScreenshotTargets()\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tcommandError = error\n\t\t\t\t\t\tpatchPart?.ui(current => ({ ...current, failed: true }))\n\t\t\t\t\t\tif (!(error instanceof Error)) return\n\t\t\t\t\t\tconst nodeIds = getCommandTouchedNodeIds(parsed, ctx)\n\t\t\t\t\t\tctx.issues.error(raw, error, { nodeIds })\n\t\t\t\t\t\tlog.reportError(error, { rawCommand: raw })\n\t\t\t\t\t\toptions.onCommandFailed?.(raw, error)\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (tracer) {\n\t\t\t\t\t\t\ttracer.closeDSLCommandTrace(commandTrace, getDSLCommandTraceResult(ctx, raw, commandError))\n\t\t\t\t\t\t\ttracer.closeCurrentDSLTraceGroupIfComplete()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst parser = createDocumentParser({\n\t\t\tonText: text => options.onPart?.({ type: \"text\", text }),\n\t\t\t// Annotations are always complete.\n\t\t\tonAnnotation: text => options.onPart?.({ type: \"annotation\", text, complete: true }),\n\t\t\tonDSLRepair: info => ctx.issues.warning(info.repairedRaw, { syntax: QUOTE_REPAIR_WARNING }),\n\t\t\tonDesignPlan: token => {\n\t\t\t\toptions.onPart?.({ type: \"design-plan\", text: token })\n\t\t\t\ttracer?.addDesignPlanTraceToken(token)\n\t\t\t},\n\t\t\tonDSLCommand: createDSLCommandHandler(),\n\t\t})\n\n\t\tlet previousStepUsage: LanguageModelUsage | undefined\n\t\tlet currentStepStartedAt = performance.now()\n\t\tlet initialUsage: LanguageModelUsage | undefined\n\t\tlet totalProviderReportedCost = 0\n\t\tlet totalSubModelCost = 0\n\n\t\tconst source = options.source\n\t\tconst system = await buildSystemPrompt({ source, model: options.model })\n\t\toptions.onSystemPromptHash?.(getSystemPromptHash(system))\n\t\toptions.onSystemPromptSnapshot?.(system)\n\n\t\tasync function synchronize(fullSync: boolean = true) {\n\t\t\tparser.finalize()\n\t\t\ttracer?.closeDesignPlanTrace()\n\t\t\tawait queue.synchronize()\n\n\t\t\tconst engine = ctx.hooks.getEngine()\n\t\t\tassert(engine, \"Engine is required\")\n\t\t\tawait synchronizeAgentContext({\n\t\t\t\tctx,\n\t\t\t\tengine,\n\t\t\t\tfullSync,\n\t\t\t\tscheduleUpdate: fn => scheduler.scheduleAgentChanges(() => changeset.append(fn)),\n\t\t\t})\n\t\t}\n\n\t\tconst getToolTraceContext = () => {\n\t\t\tif (!tracer?.raindropEventId) return undefined\n\t\t\treturn {\n\t\t\t\teventId: tracer?.raindropEventId,\n\t\t\t\tparent: tracer?.getRootTraceParent(),\n\t\t\t}\n\t\t}\n\n\t\tconst tools = createToolSet({\n\t\t\tctx,\n\t\t\ttreeStore,\n\t\t\ttraceConfig: options.traceConfig,\n\t\t\tabortSignal: options.abortSignal,\n\t\t\tagentInteraction: options.agentInteraction,\n\t\t\tcreateDSLCommandHandler,\n\t\t\tsynchronize,\n\t\t\tonPart: options.onPart,\n\t\t\tonCodeFileHistoryChanges: options.onCodeFileHistoryChanges,\n\t\t\twaitForUserAnswers: options.waitForUserAnswers,\n\t\t\tgetToolTraceContext,\n\t\t\tdisableRaindropTelemetry: options.disableRaindropTelemetry,\n\t\t\trequestCodeFileChangesExecutor: options.requestCodeFileChangesExecutor,\n\t\t\tscriptEvalInstrumentation: options.scriptEvalInstrumentation,\n\t\t})\n\n\t\tconst transformMessages = (msgs: ModelMessage[]) =>\n\t\t\tapplyMessageTransformers(msgs, options.model, [redactUnloadedExamples(ctx), applyImageSizeLimitsAndRedact(ctx)])\n\n\t\tconst streamPrompt = withPromptCaching({\n\t\t\tmodel: options.model,\n\t\t\tsystem,\n\t\t\tmessages,\n\t\t})\n\n\t\tlogStreamConfig(log, system, tools)\n\n\t\tconst streamText =\n\t\t\toptions.disableRaindropTelemetry === true\n\t\t\t\t? aiStreamText\n\t\t\t\t: getRaindropTracesOnlyAI({\n\t\t\t\t\t\tselfDiagnostics: shouldEnableRaindropSelfDiagnostics(source, ctx),\n\t\t\t\t\t}).streamText\n\n\t\tconst captureTrainingData = !isUndefined(options.onTrainingStep)\n\t\tconst trainingTools = AgentTrainingDataCollector.serializeTools(tools, captureTrainingData)\n\n\t\t// `onChunk` only fires for model-output chunks (text/reasoning/tool), not the synthetic\n\t\t// lifecycle parts (`start`, `start-step`) the SDK emits immediately on stream consumption, so\n\t\t// the first chunk marks the true time-to-first-token.\n\t\tlet firstTokenReceivedAt: number | undefined\n\n\t\tconst result = streamText({\n\t\t\tmodel: createAgentStepModel({ stepIndex: 0, ...options }),\n\t\t\tproviderOptions: getAgentProviderOptions(options),\n\t\t\t...streamPrompt,\n\t\t\tabortSignal: options.abortSignal,\n\t\t\ttools,\n\t\t\tactiveTools: getActiveToolsForSource(tools, source),\n\t\t\ttoolChoice: \"auto\",\n\t\t\tincludeRawChunks: isOpenAIResponsesModelId(options.model),\n\t\t\t...options.raindropTelemetryOptions,\n\t\t\tstopWhen: stepCountIs(options.maxSteps ?? 10),\n\t\t\tonChunk: () => {\n\t\t\t\tif (!isUndefined(firstTokenReceivedAt)) return\n\t\t\t\tfirstTokenReceivedAt = performance.now()\n\t\t\t\toptions.onFirstToken?.()\n\t\t\t},\n\t\t\tonStepFinish: async ({\n\t\t\t\tusage,\n\t\t\t\tproviderMetadata,\n\t\t\t\ttoolResults,\n\t\t\t\tstepNumber,\n\t\t\t\tfinishReason,\n\t\t\t\tresponse,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\t\t\texperimental_context,\n\t\t\t}) => {\n\t\t\t\tinitialUsage ??= usage\n\t\t\t\tconst stepProviderCost = getOpenRouterCostFromMetadata(providerMetadata)\n\t\t\t\tconst stepSubModelCost = ctx.consumeSubModelCost()\n\t\t\t\ttotalProviderReportedCost += stepProviderCost\n\t\t\t\ttotalSubModelCost += stepSubModelCost\n\t\t\t\toptions.onStepUsage?.(usage)\n\t\t\t\tconst stepElapsedMs = Math.round(performance.now() - currentStepStartedAt)\n\n\t\t\t\tif (log.level <= LogLevel.Debug) {\n\t\t\t\t\tlogStepUsage(log, usage, previousStepUsage, undefined, stepElapsedMs, stepProviderCost + stepSubModelCost)\n\t\t\t\t\tpreviousStepUsage = usage\n\t\t\t\t}\n\n\t\t\t\tawait synchronize()\n\n\t\t\t\tconst typedToolResults: AgentTypedToolResult[] = []\n\t\t\t\tfor (const toolResult of toolResults) {\n\t\t\t\t\t// The Raindrop self-diagnostics tool is injected by the SDK wrapper, executes as an\n\t\t\t\t\t// invisible side channel for telemetry, and is not part of our typed tool set.\n\t\t\t\t\tif (toolResult.toolName === RAINDROP_SELF_DIAGNOSTICS_TOOL_NAME) continue\n\t\t\t\t\tif (!isAgentTypedToolResult(toolResult)) continue\n\t\t\t\t\ttypedToolResults.push(toolResult)\n\t\t\t\t\toptions.onPart?.({ type: \"tool-result\", content: toolResult })\n\t\t\t\t}\n\n\t\t\t\tif (isStreamContext(experimental_context)) {\n\t\t\t\t\toptions.onTrainingStep?.({\n\t\t\t\t\t\tfinishReason,\n\t\t\t\t\t\tmessages: experimental_context.trainingStepInput.messages,\n\t\t\t\t\t\tmodel: options.model,\n\t\t\t\t\t\tresponseMessages: response.messages,\n\t\t\t\t\t\tstepIndex: stepNumber,\n\t\t\t\t\t\tsystem,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\ttools: trainingTools,\n\t\t\t\t\t\tusage,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tawait options.onStepFinish?.({\n\t\t\t\t\tusage,\n\t\t\t\t\tproviderMetadata,\n\t\t\t\t\ttoolResults: typedToolResults,\n\t\t\t\t\tstepNumber,\n\t\t\t\t})\n\n\t\t\t\tflushRawAssistantStepText()\n\n\t\t\t\ttracer?.endStep()\n\t\t\t},\n\t\t\tprepareStep: async ({ messages: stepMessages, stepNumber }) => {\n\t\t\t\tconst preparedMessages = (await options.onPrepareStep?.()) ?? stepMessages\n\n\t\t\t\tcurrentStepStartedAt = performance.now()\n\t\t\t\tconst transformedMessages = await transformMessages(Array.from(preparedMessages))\n\n\t\t\t\tconst requestEstimate = getStreamRequestTokenEstimates(transformedMessages, streamPrompt.system ?? \"\", tools)\n\t\t\t\toptions.onInputEstimate?.(requestEstimate.totalEstimatedTokens)\n\t\t\t\tlogAgentRequest(log, transformedMessages, requestEstimate)\n\n\t\t\t\t// Switch back to thinking because we are about to wait for LLM response.\n\t\t\t\toptions.onPart?.({ type: \"thinking\" })\n\n\t\t\t\treturn {\n\t\t\t\t\tmodel: createAgentStepModel({ stepIndex: stepNumber, ...options }),\n\t\t\t\t\tmessages: transformedMessages,\n\t\t\t\t\texperimental_context: captureTrainingData\n\t\t\t\t\t\t? { trainingStepInput: { stepIndex: stepNumber, messages: transformedMessages } }\n\t\t\t\t\t\t: undefined,\n\t\t\t\t}\n\t\t\t},\n\t\t\tonError: error => {\n\t\t\t\t// Throw the error from streamText so that we could handle it on a higher level, by\n\t\t\t\t// default it will be logged and swallowed.\n\t\t\t\tthrow error.error\n\t\t\t},\n\t\t})\n\n\t\tfor await (const textPart of abortableAgentStream(result.fullStream, options.abortSignal)) {\n\t\t\tswitch (textPart.type) {\n\t\t\t\tcase \"reasoning-start\":\n\t\t\t\t\tawait synchronize()\n\t\t\t\t\toptions.onPart?.({ type: \"thinking\" })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"reasoning-delta\":\n\t\t\t\t\toptions.onPart?.({ type: \"thinking\", text: textPart.text })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"reasoning-end\":\n\t\t\t\t\toptions.onPart?.({ type: \"thinking\", complete: true })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"text-delta\":\n\t\t\t\t\tcurrentStepRawText += textPart.text\n\t\t\t\t\tparser.addToken(textPart.text)\n\t\t\t\t\tbreak\n\t\t\t\tcase \"tool-call\":\n\t\t\t\t\t// Drop self-diagnostics tool calls before they reach the typed tool pipeline; the\n\t\t\t\t\t// SDK injects the tool and assertions in `toAgentTypedToolCall` would otherwise\n\t\t\t\t\t// reject the unknown tool name and abort the stream.\n\t\t\t\t\tif (textPart.toolName === RAINDROP_SELF_DIAGNOSTICS_TOOL_NAME) break\n\t\t\t\t\tif (isAgentInvalidToolCall(textPart)) {\n\t\t\t\t\t\toptions.onPart?.({ type: \"invalid-tool-call\", content: toAgentInvalidToolCall(textPart) })\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions.onPart?.({ type: \"tool-call\", content: toAgentTypedToolCall(textPart) })\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(textPart, \"Unhandled stream part\")\n\t\t\t}\n\t\t}\n\n\t\tconst text = parser.finalize()\n\n\t\tawait synchronize()\n\n\t\t// Flush any remaining code generations for scopes that were modified\n\t\tawait ctx.deferred.flushAllPendingCodeGenerations()\n\n\t\tconst rawResponseMessages = filterRaindropSelfDiagnosticsMessages((await result.response).messages)\n\t\tconst responseMessages = await transformMessages(rawResponseMessages)\n\n\t\tconst usage = await result.usage\n\t\tconst totalUsage = await result.totalUsage\n\t\tconst elapsedMs = Math.round(performance.now() - streamStartedAt)\n\t\tlog.info(\"Agent Result:\", {\n\t\t\ttext,\n\t\t\tusage,\n\t\t\ttotalUsage,\n\t\t\tproviderReportedCost: totalProviderReportedCost,\n\t\t\tsubModelCost: totalSubModelCost,\n\t\t\telapsedMs,\n\t\t\tresponseMessages,\n\t\t})\n\n\t\tvoid screenshotTargets.capture().catch(error => {\n\t\t\tlog.reportError(error)\n\t\t})\n\n\t\ttracer?.endRootSuccess()\n\t\tstreamCompletedSuccessfully = true\n\n\t\tconst ttftMs = !isUndefined(firstTokenReceivedAt) ? Math.round(firstTokenReceivedAt - streamStartedAt) : undefined\n\n\t\treturn {\n\t\t\tusage,\n\t\t\tinitialUsage: initialUsage ?? usage,\n\t\t\ttotalUsage,\n\t\t\tproviderReportedCost: totalProviderReportedCost,\n\t\t\tsubModelCost: totalSubModelCost,\n\t\t\telapsedMs,\n\t\t\tttftMs,\n\t\t\tresponseMessages,\n\t\t\ttext,\n\t\t}\n\t} catch (error) {\n\t\trootError = error\n\t\tthrow error\n\t} finally {\n\t\t// Flush on every exit path (including provider errors/aborts after text-delta chunks but\n\t\t// before the loop completes) so the partial raw text reaches the Raindrop turn event that\n\t\t// Agent.sendInternal finalizes on the error path. Idempotent on the success path.\n\t\tflushRawAssistantStepText()\n\n\t\tif (!streamCompletedSuccessfully) {\n\t\t\tawait closeUnsuccessfulRootTraceAfterQueuedCommandsDrain(queue, tracer, rootError, async () => {\n\t\t\t\tvoid screenshotTargets.capture().catch(error => {\n\t\t\t\t\tlog.reportError(error)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunction getDSLCommandTraceResult(\n\tctx: AgentContext,\n\traw: string,\n\tcommandError: unknown,\n): Parameters<AgentStreamTracer[\"closeDSLCommandTrace\"]>[1] {\n\tconst issueError = ctx.issues.peekByRawCommand(raw).error\n\tif (!isUndefined(issueError)) return { input: raw, error: issueError }\n\tif (isUndefined(commandError)) return { input: raw, output: \"OK\" }\n\tif (commandError instanceof Error) return { input: raw, error: commandError.message }\n\n\ttry {\n\t\treturn { input: raw, error: JSON.stringify(commandError) ?? \"Unknown command error\" }\n\t} catch {\n\t\treturn { input: raw, error: \"Unknown command error\" }\n\t}\n}\n\nfunction getScopeIdForRawCommand(command: Command, ctx: AgentContext): NodeID | undefined {\n\tswitch (command.type) {\n\t\tcase CommandType.Add: {\n\t\t\tconst id = isAddVariableCommandAttributes(command.attributes) ? command.attributes.scope : command.attributes.id\n\t\t\treturn ctx.treeResolver.getScopeNodeFor(id)?.id\n\t\t}\n\t\tcase CommandType.Update:\n\t\tcase CommandType.Move:\n\t\tcase CommandType.Remove: {\n\t\t\treturn getScopeIdsForCommandTargets([command.attributes.id], ctx)[0]\n\t\t}\n\t\tcase CommandType.Duplicate:\n\t\t\treturn ctx.treeResolver.getScopeNodeFor(command.attributes.newId)?.id\n\t\tcase CommandType.CreateVariant:\n\t\t\treturn ctx.treeResolver.getScopeNodeFor(command.attributes.from)?.id\n\t\tdefault:\n\t\t\tassertNever(command, \"Invalid command type\")\n\t}\n}\n\nfunction getNodeIdForRawCommand(command: Command, ctx: AgentContext): NodeID | undefined {\n\tconst llmId = getCommandCreatedIds(command)\n\tif (!llmId) return\n\treturn ctx.treeResolver.get(llmId)?.id\n}\n\nfunction getScopeIdsForCommandTargets(targetIds: readonly string[], ctx: AgentContext): NodeID[] {\n\tconst scopeIds = new Set<NodeID>()\n\tfor (const targetId of targetIds) {\n\t\tconst scopeId = getScopeIdForCommandTarget(targetId, ctx)\n\t\tif (scopeId) scopeIds.add(scopeId)\n\t}\n\treturn Array.from(scopeIds)\n}\n\nfunction getScopeIdForCommandTarget(targetId: string, ctx: AgentContext): NodeID | undefined {\n\tconst resolved = ctx.dynamicValues.getVariableReferenceHandleByVariableId(targetId)\n\tif (isVariableReferenceHandle(resolved)) return ctx.treeResolver.getScopeNodeFor(resolved.scopeId)?.id\n\n\treturn getScopeIdForVirtualTextTarget(targetId, ctx) ?? ctx.treeResolver.getScopeNodeFor(targetId)?.id\n}\n\nfunction getScopeIdForVirtualTextTarget(targetId: string, ctx: AgentContext): NodeID | undefined {\n\tif (!isVirtualNodeId(targetId)) return\n\n\tconst resolvedVirtualId = ctx.treeResolver.resolveVirtualId(targetId)\n\tif (!isVirtualNodeId(resolvedVirtualId)) return\n\n\tconst { richTextTarget } = parseVirtualNodeId(resolvedVirtualId)\n\tconst { nodeId } = parseRichTextTarget(richTextTarget)\n\treturn ctx.treeResolver.getScopeNodeFor(nodeId)?.id\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { type TextPart, generateText } from \"ai\"\nimport { type AgentAttachmentImage, getImageUrls } from \"app/agent/attachments.ts\"\nimport { createVekterOpenRouterExtraBody, openRouter } from \"app/ai/config/openRouter.ts\"\nimport { getProviderForModel, getReasoningForModel } from \"app/ai/models.ts\"\nimport { join } from \"utils/join.ts\"\nimport { LanguageModel } from \"../languageModels.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"../tracing/openRouterTrace.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { convertToModelMessages } from \"./messages.ts\"\nimport type { AgentRequest } from \"./types.ts\"\n\nconst prompt = `\nYou summarize a conversation history between a user and an AI Agent.\n\n# Rules:\n- Keep summary short and factual. Keep 'summary' value to 100 tokens or less.\n- Return only the summary text.\n\n# Summary Format:\n- Highlight key decisions and actions taken (e.g. User decided to use light mode for the whole site).\n- Record the current state of the project (e.g. \"/about\" was modified to add a footer and testimonials).\n- Record new pages and components that were created, and document the purpose when relevant:\n  - Created Pages:\n\t\t- /faq\n\t\t- /contact\n\t\t- /pricing\n  - Created components:\n\t\t- \"Submit Button\" to use for forms.\n\t\t- \"Navigation\" for use across the whole site.\n`.trim()\n\nfunction buildUserPayload(requests: readonly AgentRequest[], ctx: AgentContext): string {\n\treturn JSON.stringify(requests.flatMap(request => convertToModelMessages(request, ctx)))\n}\n\nfunction collectRequestMetadata(requests: readonly AgentRequest[]): {\n\timages: readonly AgentAttachmentImage[]\n} {\n\tconst images: AgentAttachmentImage[] = []\n\tconst seenImages = new Set<string>()\n\n\tfor (const request of requests) {\n\t\tfor (const uploadedImage of request.images) {\n\t\t\tconst referenceUrl = getImageUrls(uploadedImage).referenceUrl\n\t\t\tif (seenImages.has(referenceUrl)) continue\n\t\t\tseenImages.add(referenceUrl)\n\t\t\timages.push(uploadedImage)\n\t\t}\n\t}\n\n\treturn {\n\t\timages: images.length > 0 ? images : emptyArray(),\n\t}\n}\n\nexport async function summarizeRequests(\n\trequests: readonly AgentRequest[],\n\tctx: AgentContext,\n\ttraceConfig: OpenRouterFeatureStepTraceConfig,\n): Promise<string> {\n\tconst { text } = await generateText({\n\t\tmodel: openRouter(LanguageModel.Gemini3Flash, {\n\t\t\tprovider: getProviderForModel(LanguageModel.Gemini3Flash),\n\t\t\treasoning: getReasoningForModel(LanguageModel.Gemini3Flash),\n\t\t\textraBody: createVekterOpenRouterExtraBody({\n\t\t\t\t...traceConfig,\n\t\t\t\tfeatureCategory: \"agents\",\n\t\t\t\tstep: \"compact-turn\",\n\t\t\t}),\n\t\t}),\n\t\tsystem: prompt,\n\t\tmessages: [{ role: \"user\", content: buildUserPayload(requests, ctx) }],\n\t})\n\n\treturn text.trim()\n}\n\nexport function serializeSummary(summary: string, requests: readonly AgentRequest[]): TextPart[] {\n\tconst { images } = collectRequestMetadata(requests)\n\tconst imageUrls = images.map(getImageUrls)\n\tconst referenceImageURLs = imageUrls.map(image => image.referenceUrl)\n\treturn [\n\t\t{\n\t\t\ttype: \"text\",\n\t\t\ttext: join.lines(\n\t\t\t\t`<session_summary>`,\n\t\t\t\t`# Session Summary (compacted from previous messages):`,\n\t\t\t\tsummary,\n\t\t\t\t...(referenceImageURLs.length > 0\n\t\t\t\t\t? [`## User Uploaded Images`, ...referenceImageURLs.map(url => `- ${url}`)]\n\t\t\t\t\t: []),\n\t\t\t\t`</session_summary>`,\n\t\t\t),\n\t\t},\n\t]\n}\n", "import { type GlobalModuleId, type LocalModuleId, ModuleType, assertNever, getLogger } from \"@framerjs/shared\"\nimport type { ModuleSaveReference, ModulesStore } from \"document/stores/ModulesStore.ts\"\nimport { restoreCodeFileModule } from \"utils/codeFiles.ts\"\nimport type { RequestCodeFileHistoryChange } from \"../requestCodeFileChanges.ts\"\n\nconst log = getLogger(\"ai:agents:code-file-revert\")\n\n/** Describes the single final version a code file needs to be restored to. */\ninterface CodeFileRevertTarget {\n\tmoduleId: GlobalModuleId\n\t/** The version to restore to (oldest change's saveIdBeforeChange). */\n\ttargetVersion: ModuleSaveReference\n\t/**\n\t * All save IDs produced by the chain of agent changes for this file.\n\t * The live file may be at any of these if an external edit rolled it back to\n\t * an intermediate version; we still allow the restore in that case.\n\t */\n\texpectedCurrentSaveIds: Set<string>\n\t/** Whether a delete_file change is part of the chain (module needs un-deleting first). */\n\tneedsRestore: boolean\n}\n\n/**\n * Walk all code file changes (oldest \u2192 newest) and compute the single final\n * version each file needs to be restored to. This avoids restoring intermediate\n * versions when the same file was modified across multiple requests.\n */\nexport function collectCodeFileRevertTargets(\n\tcodeFileChanges: readonly RequestCodeFileHistoryChange[],\n): Map<LocalModuleId, CodeFileRevertTarget> {\n\tconst targets = new Map<LocalModuleId, CodeFileRevertTarget>()\n\n\tfor (const change of codeFileChanges) {\n\t\tif (change.operation === \"create_file\") continue\n\n\t\tconst existing = targets.get(change.localId)\n\t\tif (!existing) {\n\t\t\t// First (oldest) change for this file \u2014 its saveIdBeforeChange is the final target.\n\t\t\ttargets.set(change.localId, {\n\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\ttargetVersion: { moduleId: change.moduleId, saveId: change.saveIdBeforeChange },\n\t\t\t\texpectedCurrentSaveIds: change.operation === \"update_file\" ? new Set([change.saveId]) : new Set(),\n\t\t\t\tneedsRestore: change.operation === \"delete_file\",\n\t\t\t})\n\t\t} else {\n\t\t\t// Later change for the same file \u2014 record its produced version but keep\n\t\t\t// the oldest target.\n\t\t\tif (change.operation === \"update_file\") {\n\t\t\t\texisting.expectedCurrentSaveIds.add(change.saveId)\n\t\t\t}\n\t\t\tif (change.operation === \"delete_file\") {\n\t\t\t\texisting.needsRestore = true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn targets\n}\n\n/**\n * Pre-fetch source contents for the final revert targets in parallel.\n * Returns a Map keyed by `moduleId:saveId` to the fetched source string.\n */\nexport async function prefetchCodeFileSources(\n\tmodulesStore: ModulesStore,\n\ttargets: Map<LocalModuleId, CodeFileRevertTarget>,\n): Promise<Map<string, string>> {\n\tconst sourcesByKey = new Map<string, string>()\n\tif (targets.size === 0) return sourcesByKey\n\n\tconst fetchPromises = new Map<string, Promise<string>>()\n\tfor (const [, target] of targets) {\n\t\tconst cacheKey = `${target.moduleId}:${target.targetVersion.saveId}`\n\t\tif (fetchPromises.has(cacheKey)) continue\n\t\tfetchPromises.set(cacheKey, modulesStore.getSourceContentForModuleSave(target.targetVersion))\n\t}\n\n\tconst results = await Promise.allSettled(\n\t\t[...fetchPromises].map(async ([cacheKey, promise]) => ({\n\t\t\tcacheKey,\n\t\t\tsource: await promise,\n\t\t})),\n\t)\n\tfor (const result of results) {\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tsourcesByKey.set(result.value.cacheKey, result.value.source)\n\t\t}\n\t}\n\n\treturn sourcesByKey\n}\n\n/**\n * Restore code files to their pre-computed final target versions.\n * Each file is restored independently; per-file errors are logged but do not\n * propagate so that undo cleanup is never interrupted.\n */\nexport async function restoreCodeFilesToTargets(\n\tmodulesStore: ModulesStore,\n\ttargets: Map<LocalModuleId, CodeFileRevertTarget>,\n\tprefetchedSources: Map<string, string>,\n): Promise<void> {\n\tfor (const [localId, target] of targets) {\n\t\ttry {\n\t\t\tif (target.needsRestore) {\n\t\t\t\t// TODO: It is possible the local module name has since been taken by a new module,\n\t\t\t\t// meaning that this restore will fail. We can set a fallback name here.\n\t\t\t\tconst restoredModule = await modulesStore.restoreModule(target.moduleId)\n\t\t\t\tif (restoredModule.saveId === target.targetVersion.saveId) continue\n\t\t\t} else if (target.expectedCurrentSaveIds.size > 0) {\n\t\t\t\t// Verify the live file still matches one of the versions produced by agent\n\t\t\t\t// changes; otherwise we'd risk reverting over newer manual or remote edits.\n\t\t\t\t// Checking all intermediate versions (not just the newest) handles drift\n\t\t\t\t// scenarios where an external edit rolled the file back to an earlier save.\n\t\t\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(localId)\n\t\t\t\tif (!persistedModule) continue\n\t\t\t\tif (persistedModule.id !== target.moduleId || !target.expectedCurrentSaveIds.has(persistedModule.saveId)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst cacheKey = `${target.moduleId}:${target.targetVersion.saveId}`\n\t\t\tconst prefetched = prefetchedSources.get(cacheKey)\n\t\t\tif (prefetched !== undefined) {\n\t\t\t\tawait restoreCodeFileModule(modulesStore, localId, target.targetVersion, prefetched)\n\t\t\t} else {\n\t\t\t\tawait restoreCodeFileModule(modulesStore, localId, target.targetVersion)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error(\"Failed to restore code file during undo\", localId, error)\n\t\t}\n\t}\n}\n\nexport async function revertCodeFileHistoryChanges(\n\tmodulesStore: ModulesStore,\n\tcodeFileChanges: readonly RequestCodeFileHistoryChange[] | undefined,\n\texpectedCurrentVersionByLocalId: Map<LocalModuleId, ModuleSaveReference>,\n): Promise<void> {\n\tif (!codeFileChanges?.length) return\n\n\tfor (let i = codeFileChanges.length - 1; i >= 0; i--) {\n\t\tconst change = codeFileChanges[i]\n\t\tif (!change) continue\n\n\t\tswitch (change.operation) {\n\t\t\tcase \"create_file\": {\n\t\t\t\t// Create-file undo is intentionally a no-op for now.\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"update_file\": {\n\t\t\t\tlet expectedCurrentVersion = expectedCurrentVersionByLocalId.get(change.localId)\n\t\t\t\tif (!expectedCurrentVersion) {\n\t\t\t\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(change.localId)\n\t\t\t\t\tif (!persistedModule) continue\n\t\t\t\t\texpectedCurrentVersion = {\n\t\t\t\t\t\tmoduleId: persistedModule.id,\n\t\t\t\t\t\tsaveId: persistedModule.saveId,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (expectedCurrentVersion.moduleId !== change.moduleId || expectedCurrentVersion.saveId !== change.saveId) {\n\t\t\t\t\t// Only restore `versionBeforeChange` if the live file still matches the version produced\n\t\t\t\t\t// by this request; otherwise we'd risk reverting over newer manual or remote edits.\n\t\t\t\t\t// Deliberately do nothing if the file no longer matches the version produced by this request.\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tawait restoreCodeFileModule(modulesStore, change.localId, {\n\t\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\t\tsaveId: change.saveIdBeforeChange,\n\t\t\t\t})\n\t\t\t\texpectedCurrentVersionByLocalId.set(change.localId, {\n\t\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\t\tsaveId: change.saveIdBeforeChange,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"delete_file\": {\n\t\t\t\tconst restoredModule = await modulesStore.restoreModule(change.moduleId)\n\n\t\t\t\tif (restoredModule.saveId === change.saveIdBeforeChange) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tawait restoreCodeFileModule(modulesStore, change.localId, {\n\t\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\t\tsaveId: change.saveIdBeforeChange,\n\t\t\t\t})\n\n\t\t\t\texpectedCurrentVersionByLocalId.set(change.localId, {\n\t\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\t\tsaveId: change.saveIdBeforeChange,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(change, \"Invalid code file change operation\")\n\t\t}\n\t}\n}\n\n/**\n * Re-apply code file changes that were previously reverted via {@link revertCodeFileHistoryChanges},\n * by walking the changes forward to their post-change state. The inverse of revert.\n */\nexport async function reapplyCodeFileHistoryChanges(\n\tmodulesStore: ModulesStore,\n\tcodeFileChanges: readonly RequestCodeFileHistoryChange[] | undefined,\n): Promise<void> {\n\tif (!codeFileChanges?.length) return\n\n\tfor (const change of codeFileChanges) {\n\t\tswitch (change.operation) {\n\t\t\tcase \"create_file\": {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"update_file\": {\n\t\t\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(change.localId)\n\t\t\t\tif (!persistedModule || persistedModule.id !== change.moduleId) continue\n\t\t\t\tconst expectedSaveId = change.saveIdAfterRevert ?? change.saveIdBeforeChange\n\t\t\t\tif (persistedModule.saveId !== expectedSaveId) continue\n\n\t\t\t\tawait restoreCodeFileModule(modulesStore, change.localId, {\n\t\t\t\t\tmoduleId: change.moduleId,\n\t\t\t\t\tsaveId: change.saveId,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"delete_file\": {\n\t\t\t\tif (change.saveIdAfterRevert) {\n\t\t\t\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(change.localId)\n\t\t\t\t\tif (!persistedModule || persistedModule.id !== change.moduleId) continue\n\t\t\t\t\tif (persistedModule.saveId !== change.saveIdAfterRevert) continue\n\t\t\t\t} else {\n\t\t\t\t\tif (!modulesStore.getModuleEntryByLocalId(change.localId)) continue\n\t\t\t\t}\n\t\t\t\tawait modulesStore.forType(ModuleType.Code).getByLocalId(change.localId).delete()\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(change, \"Invalid code file change operation\")\n\t\t}\n\t}\n}\n", "import { assert, emptySet, getLogger } from \"@framerjs/shared\"\nimport type { LanguageModelUsage, ModelMessage } from \"ai\"\nimport { getImageUrls, type AgentAttachmentImage } from \"app/agent/attachments.ts\"\nimport { isNumber, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { LanguageModel } from \"../languageModels.ts\"\nimport { ContextLimitCap, getContextLimitForModel } from \"../models.ts\"\nimport { createCachedUserMessage, shouldUseAnthropicPromptCachingOnCurrentTurn } from \"./cache/cache.ts\"\nimport type { AgentContext } from \"./context/AgentContext.ts\"\nimport { registerTrustedFileUrlsFromModelMessages, stripImageAttachmentMessages } from \"./context/files.ts\"\nimport { metadataTags } from \"./context/metadataTags.ts\"\nimport { convertToModelMessages, type AnyLanguageModelUsage } from \"./messages.ts\"\nimport { serializeSummary } from \"./summarizeHistory.ts\"\nimport { estimateTextTokens } from \"./tokens.ts\"\nimport type { AgentRequest } from \"./types.ts\"\n\nconst log = getLogger(\"ai:agents\")\nconst summaryCompactionStartRatio = 0.75\nconst summaryCompactionTargetRatio = 0.5\n\ntype TokenSavings = Pick<LanguageModelUsage, \"inputTokens\" | \"outputTokens\" | \"totalTokens\">\n\nfunction estimateTokenSavings(\n\tusage: LanguageModelUsage | undefined,\n\taccumulator: TokenSavings | undefined,\n\tfloorInputTokenUsage: number,\n): TokenSavings | undefined {\n\tif (!usage) return accumulator\n\n\tconst inputTokens = Math.max(0, (usage.inputTokens ?? 0) - floorInputTokenUsage)\n\tconst outputTokens = usage.outputTokens ?? 0\n\n\treturn {\n\t\tinputTokens: (accumulator?.inputTokens ?? 0) + inputTokens,\n\t\toutputTokens: (accumulator?.outputTokens ?? 0) + outputTokens,\n\t\ttotalTokens: (accumulator?.totalTokens ?? 0) + inputTokens + outputTokens,\n\t}\n}\n\nfunction getFloorInputTokenUsage(messages: readonly AgentRequest[]): number {\n\tconst firstUsageMessage = messages.find(message => !isUndefined(message.initialUsage?.inputTokens))\n\treturn firstUsageMessage?.initialUsage?.inputTokens ?? 0\n}\n\nfunction isSelectionMessage(message: string): boolean {\n\treturn (\n\t\tmessage.startsWith(`<${metadataTags.selectedNodes}>`) || message.startsWith(`<${metadataTags.selectedNodeIds}>`)\n\t)\n}\n\nfunction registerSummarizedAttachmentImages(requests: readonly AgentRequest[], ctx: AgentContext): void {\n\tconst images = collectAttachmentImages(requests)\n\tif (images.length === 0) return\n\n\tctx.files.referenceUrls(images)\n}\n\nfunction collectAttachmentImages(requests: readonly AgentRequest[]): readonly AgentAttachmentImage[] {\n\tconst images: AgentAttachmentImage[] = []\n\tconst seenReferenceUrls = new Set<string>()\n\n\tfor (const request of requests) {\n\t\tfor (const image of request.images) {\n\t\t\tconst referenceUrl = getImageUrls(image).referenceUrl\n\t\t\tif (seenReferenceUrls.has(referenceUrl)) continue\n\t\t\tseenReferenceUrls.add(referenceUrl)\n\t\t\timages.push(image)\n\t\t}\n\t}\n\n\treturn images\n}\n\nexport async function transformHistoryToModelMessages(\n\thistory: readonly AgentRequest[],\n\tctx: AgentContext,\n\tcurrentModel: LanguageModel,\n): Promise<ModelMessage[]> {\n\tconst messages: ModelMessage[] = []\n\tconst shouldCacheCurrentTurnInitialUserMessage = shouldUseAnthropicPromptCachingOnCurrentTurn(currentModel)\n\tconst currentTurnIndex = history.length - 1\n\tconst summaryCompactionBoundaryIndex = getSummaryCompactionBoundaryIndex(history, currentTurnIndex)\n\n\tfor (let i = history.length - 1; i >= 0; i--) {\n\t\tconst request = history[i]\n\t\tif (!request) continue\n\t\t// If this turn is outside the persisted summary frontier, include the full turn.\n\t\tif (i > summaryCompactionBoundaryIndex || summaryCompactionBoundaryIndex === -1) {\n\t\t\tconst requestMessages = convertToModelMessages(request, ctx)\n\t\t\tif (i !== currentTurnIndex || !shouldCacheCurrentTurnInitialUserMessage) {\n\t\t\t\tmessages.unshift(...requestMessages)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst [initialUserMessage, ...responseMessages] = requestMessages\n\t\t\tassert(initialUserMessage?.role === \"user\", \"Turn messages must start with a user message\")\n\t\t\tmessages.unshift(createCachedUserMessage(initialUserMessage), ...responseMessages)\n\t\t\tcontinue\n\t\t}\n\n\t\t// If this turn is at the summary frontier, include the summary of this and all previous turns.\n\t\ttry {\n\t\t\tconst latestSummary = await request.summary\n\t\t\t// If the summary is an empty string, we should fallback until we have a summary.\n\t\t\tif (!latestSummary) {\n\t\t\t\tconst requestMessages = convertToModelMessages(request, ctx)\n\t\t\t\tmessages.unshift(...requestMessages)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst initialRequest = history[0]\n\t\t\tassert(initialRequest, \"Initial request must exist\")\n\n\t\t\tconst summarizedRequests = history.slice(0, i + 1)\n\t\t\tconst floorInputTokenUsage = getFloorInputTokenUsage(summarizedRequests)\n\n\t\t\tconst tokens = summarizedRequests.reduce<TokenSavings | undefined>(\n\t\t\t\t(acc, message) => estimateTokenSavings(message.usage, acc, floorInputTokenUsage),\n\t\t\t\tundefined,\n\t\t\t)\n\n\t\t\t// This is rough estimate because we don't replace initial context messages which do cost some\n\t\t\t// tokens (e.g. icons).\n\t\t\tlog.debug(`Using summarized message for ${summarizedRequests.length} turn(s) replaced ~tokens:`, {\n\t\t\t\ttokens,\n\t\t\t\tsummary: latestSummary,\n\t\t\t})\n\n\t\t\t// Then add the summary up to this point. Include the initial context messages and summary in\n\t\t\t// one user message, but exclude selected nodes from the initial context.\n\t\t\t//\n\t\t\t// AGENTS @TODO: Store the selection in data on the request instead of in messages to easily\n\t\t\t// re-serialize them.\n\t\t\tconst summaryMessages: ModelMessage[] = [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: stripImageAttachmentMessages(initialRequest.contextMessages)\n\t\t\t\t\t\t.filter(message => !isSelectionMessage(message))\n\t\t\t\t\t\t.map(message => ({ type: \"text\", text: message }) as const),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: serializeSummary(latestSummary, summarizedRequests),\n\t\t\t\t},\n\t\t\t]\n\t\t\tregisterSummarizedAttachmentImages(summarizedRequests, ctx)\n\t\t\tregisterTrustedFileUrlsFromModelMessages(summaryMessages, ctx)\n\t\t\tmessages.unshift(...summaryMessages)\n\t\t\tbreak\n\t\t} catch {\n\t\t\t// If the summary fails, include the turn in the messages.\n\t\t\tconst requestMessages = convertToModelMessages(request, ctx)\n\t\t\tmessages.unshift(...requestMessages)\n\t\t}\n\t}\n\n\treturn messages\n}\n\nfunction getSummaryCompactionBoundaryIndex(history: readonly AgentRequest[], currentTurnIndex: number): number {\n\tfor (let i = currentTurnIndex - 1; i >= 0; i--) {\n\t\tif (history[i]?.summarizedForContext) return i\n\t}\n\treturn -1\n}\n\nexport function getRequestIdsToAdvanceSummaryCompactionBoundary(\n\thistory: readonly AgentRequest[],\n\tmodel: LanguageModel,\n): ReadonlySet<string> {\n\tconst latestInputTokens = getLatestKnownInputTokens(history)\n\tif (latestInputTokens === undefined) return emptySet()\n\n\tconst contextLimit = getContextLimitForModel(model, ContextLimitCap.Lower)\n\tif (latestInputTokens / contextLimit <= summaryCompactionStartRatio) return emptySet()\n\n\tlet requiredSavings = latestInputTokens - contextLimit * summaryCompactionTargetRatio\n\tif (requiredSavings <= 0) return emptySet()\n\n\tconst currentTurnIndex = history.length - 1\n\tconst summaryCompactionBoundaryIndex = getSummaryCompactionBoundaryIndex(history, currentTurnIndex)\n\tconst requestIds = new Set<string>()\n\tlet pendingReplayInputTokens = 0\n\n\tfor (let i = summaryCompactionBoundaryIndex + 1; i < currentTurnIndex; i++) {\n\t\tconst request = history[i]\n\t\tif (!request) continue\n\t\tif (request.summarizedForContext) continue\n\t\tpendingReplayInputTokens += getEstimatedRequestReplayInputTokens(history, i)\n\t\tif (!hasResolvedSummary(request)) continue\n\t\trequiredSavings -= pendingReplayInputTokens\n\t\tpendingReplayInputTokens = 0\n\t\trequestIds.add(request.id)\n\t\tif (requiredSavings <= 0) break\n\t}\n\n\treturn requestIds\n}\n\n/** A request is only eligible once its async turn summary has resolved to non-empty text. */\nfunction hasResolvedSummary(request: AgentRequest): request is AgentRequest & { summary: string } {\n\treturn isString(request.summary) && request.summary.length > 0\n}\n\n/**\n * Find the latest provider-reported input token count across the conversation.\n */\nfunction getLatestKnownInputTokens(history: readonly AgentRequest[]): number | undefined {\n\tfor (let requestIndex = history.length - 1; requestIndex >= 0; requestIndex--) {\n\t\tconst request = history[requestIndex]\n\t\tif (!request) continue\n\t\tfor (let stepIndex = request.steps.length - 1; stepIndex >= 0; stepIndex--) {\n\t\t\tconst inputTokens = request.steps[stepIndex]?.metadata.usage?.inputTokens\n\t\t\tif (isNumber(inputTokens)) return inputTokens\n\t\t}\n\t\tif (isNumber(request.usage?.inputTokens)) return request.usage.inputTokens\n\t}\n}\n\n/**\n * Return the final known usage for a request, preferring per-step usage over turn usage.\n * This is only used for estimating token savings for summary compaction.\n */\nfunction getRequestFinalUsage(request: AgentRequest): AnyLanguageModelUsage | undefined {\n\tfor (let stepIndex = request.steps.length - 1; stepIndex >= 0; stepIndex--) {\n\t\tconst usage = request.steps[stepIndex]?.metadata.usage\n\t\tif (usage) return usage\n\t}\n\treturn request.usage\n}\n\n/**\n * Retrieve the most recent provider-reported input token count from the history.\n * Useful for restoring context usage on hydration when no persisted usage exists.\n */\nexport function getLatestInputTokensFromHistory(history: readonly AgentRequest[]): number | undefined {\n\treturn getLatestKnownInputTokens(history)\n}\n\n/**\n * Estimate the context token count after the next compaction pass. Simulates what\n * `advanceSummaryCompactionBoundary` would do on the next `send()` call and uses tokenx to\n * estimate the cost of the summary text that replaces the compacted turns.\n *\n * Returns `undefined` when no compaction would be triggered.\n */\nexport function estimatePostCompactionInputTokens(\n\thistory: readonly AgentRequest[],\n\tmodel: LanguageModel,\n): number | undefined {\n\tconst latestInputTokens = getLatestKnownInputTokens(history)\n\tif (latestInputTokens === undefined) return undefined\n\n\tconst contextLimit = getContextLimitForModel(model, ContextLimitCap.Lower)\n\tif (latestInputTokens / contextLimit <= summaryCompactionStartRatio) return undefined\n\n\tconst requiredSavings = latestInputTokens - contextLimit * summaryCompactionTargetRatio\n\tif (requiredSavings <= 0) return undefined\n\n\t// Simulate compaction as if a new turn were about to start, so that all existing\n\t// history entries (including the just-completed turn) are compaction candidates.\n\tconst simulatedCurrentTurnIndex = history.length\n\tconst summaryBoundaryIndex = getSummaryCompactionBoundaryIndex(history, simulatedCurrentTurnIndex)\n\n\tlet totalSavings = 0\n\tlet pendingReplayTokens = 0\n\tlet latestSummary: string | undefined\n\tlet latestSummaryIndex = -1\n\n\tfor (let requestIndex = summaryBoundaryIndex + 1; requestIndex < simulatedCurrentTurnIndex; requestIndex++) {\n\t\tconst request = history[requestIndex]\n\t\tif (!request) continue\n\t\tif (request.summarizedForContext) continue\n\n\t\tpendingReplayTokens += getEstimatedRequestReplayInputTokens(history, requestIndex)\n\t\tif (!hasResolvedSummary(request)) continue\n\n\t\ttotalSavings += pendingReplayTokens\n\t\tpendingReplayTokens = 0\n\t\tlatestSummaryIndex = requestIndex\n\t\tlatestSummary = request.summary\n\n\t\tif (totalSavings >= requiredSavings) break\n\t}\n\n\tif (latestSummaryIndex === -1 || !latestSummary) return undefined\n\n\t// The first request's replay cost has no predecessor to delta against, so it includes the\n\t// full input (system prompt + tools + context). Subtract the initialUsage floor since that\n\t// overhead persists after compaction.\n\tif (summaryBoundaryIndex === -1) {\n\t\ttotalSavings = Math.max(0, totalSavings - getFloorInputTokenUsage(history))\n\t}\n\n\tconst summarizedRequests = history.slice(0, latestSummaryIndex + 1)\n\tconst summaryContent = serializeSummary(latestSummary, summarizedRequests)\n\tconst summaryTokens = summaryContent.reduce((tokenCount, part) => tokenCount + estimateTextTokens(part.text), 0)\n\n\treturn Math.max(0, latestInputTokens - totalSavings + summaryTokens)\n}\n\n/**\n * Estimate one request's future replay cost. The input delta approximates user/context plus any\n * earlier tool-loop output that was already replayed inside the turn; the final output is added\n * because it will become input on the next send.\n */\nfunction getEstimatedRequestReplayInputTokens(history: readonly AgentRequest[], index: number): number {\n\tconst request = history[index]\n\tif (!request) return 0\n\tconst finalUsage = getRequestFinalUsage(request)\n\tif (!finalUsage) return 0\n\tconst finalInputTokens = finalUsage.inputTokens\n\tif (finalInputTokens === undefined) return 0\n\n\tconst previousRequest = history[index - 1]\n\tconst outputTokens = finalUsage.outputTokens ?? 0\n\tif (!previousRequest) return finalInputTokens + outputTokens\n\tconst previousFinalInputTokens = getRequestFinalUsage(previousRequest)?.inputTokens\n\tconst baselineInputTokens = previousFinalInputTokens ?? request?.initialUsage?.inputTokens ?? 0\n\treturn Math.max(0, finalInputTokens - baselineInputTokens) + outputTokens\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport type { LanguageModelUsage } from \"ai\"\nimport type { AgentAttachmentFile, AgentAttachmentImage } from \"app/agent/attachments.ts\"\nimport type { AgentInputSegment } from \"app/agent/editor/agentInputSchema.ts\"\nimport type { LatestAgentSchemas } from \"document/agentSnapshotMigration/schemas.ts\"\nimport type { Changeset } from \"document/models/CanvasTree/Changeset.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { AiCreditLimitReason } from \"../aiServiceError.ts\"\nimport type { LanguageModel } from \"../languageModels.ts\"\nimport type { AgentReasoningEffort } from \"../models.ts\"\nimport type { Command } from \"./dsl.ts\"\nimport type { AgentRequestCrdtSnapshotMarkers } from \"./evals/export/evalExportTypes.ts\"\nimport type { AssistantResponsePartUpdater, ToolStep } from \"./messages.ts\"\nimport type { ClarificationQuestion } from \"./tools/askClarification.ts\"\nimport type { RequestCodeFileHistoryChange } from \"./tools/requestCodeFileChanges.ts\"\nimport type { AgentInvalidToolCall, AgentTypedToolCall, AgentTypedToolResult } from \"./tools/toolSet.ts\"\n\nexport type EmitChatPart = <T extends ChatPart>(\n\tpart: T,\n\tpersist?: boolean,\n) => { ui: ChatPartUpdater<T>; response?: AssistantResponsePartUpdater<Command> } | undefined\n\nexport interface QueuedPrompt {\n\tid: string\n\tparts: readonly AgentInputSegment[]\n\timages: readonly AgentAttachmentImage[]\n\tfiles: readonly AgentAttachmentFile[]\n\tmodel: LanguageModel\n\treasoningEffort?: AgentReasoningEffort\n\timplicitSelection: readonly NodeID[]\n\tcollectionItemOverlaySelection?: AgentCollectionItemOverlaySelection\n}\n\nexport interface AgentCollectionItemOverlaySelection {\n\tcollectionId: NodeID\n\tcollectionItemId: NodeID\n}\n\nexport type Message<T> = T & {\n\ttimestamp?: number\n\tdurationMs?: number\n}\nexport type ReadTaskSubType = \"review\"\n\nexport type BlockingTaskType =\n\t| \"font-search\"\n\t| \"screenshot\"\n\t| \"image-search\"\n\t| \"deprecated-design-plan\"\n\t| \"fetch\"\n\t| \"publish\"\n\t| \"search-with-script\"\n\t| \"analyze\"\n\t| \"search\"\n\t| \"make-external-component-local\"\n\nexport type CodePatchOperation = \"create_file\" | \"update_file\" | \"delete_file\"\nexport type AgentChatThinkingTraceVariant = \"review\" | \"create-component\"\n\nexport type ChatPartUpdater<T extends ChatPart> = (fn: (current: T, timestamp: number) => Partial<T>) => void\n\nexport type ChatPart =\n\t| Message<{\n\t\t\ttype: \"thinking\"\n\t\t\ttext?: string\n\t\t\tcomplete?: boolean\n\t\t\t/** Some reasoning stages use special UI variants. */\n\t\t\tvariant?: AgentChatThinkingTraceVariant\n\t  }>\n\t| Message<{\n\t\t\ttype: \"scripting\"\n\t\t\tcompletedAt?: number\n\t\t\t/** Set when the script runs an analytics query, so the UI can label it accordingly. */\n\t\t\ttask?: \"analytics\"\n\t  }>\n\t| Message<{\n\t\t\ttype: \"script-read\"\n\t\t\tcount: number\n\t  }>\n\t| Message<{\n\t\t\ttype: \"design-plan\"\n\t\t\ttext?: string\n\t\t\tcomplete?: boolean\n\t\t\tscopeId?: NodeID\n\t  }>\n\t| Message<{\n\t\t\ttype: \"step\"\n\t\t\ttext: string\n\t\t\tcomplete?: boolean\n\t\t\tscopeId?: NodeID\n\t  }>\n\t| Message<{\n\t\t\ttype: \"create-component\"\n\t\t\ttext: string\n\t\t\tcomplete?: boolean\n\t\t\tscopeId?: NodeID\n\t  }>\n\t| Message<{\n\t\t\ttype: \"annotation\"\n\t\t\ttext: string\n\t\t\tcomplete?: boolean\n\t\t\tscopeId?: NodeID\n\t  }>\n\t| Message<{\n\t\t\ttype: \"text\"\n\t\t\ttext: string\n\t\t\tcomplete?: boolean\n\t  }>\n\t| Message<{\n\t\t\ttype: \"command\"\n\t\t\tcommand: Command\n\t\t\tscopeId?: NodeID\n\t\t\t/** Collection parent ID captured before the command executes; used by the change summary when the target is removed. */\n\t\t\tcollectionId?: NodeID\n\t\t\tfailed?: boolean\n\t  }>\n\t| Message<{\n\t\t\ttype: \"command-error\"\n\t\t\traw: string\n\t  }>\n\t| Message<{\n\t\t\ttype: \"clarification\"\n\t\t\tquestions?: readonly ClarificationQuestion[]\n\t\t\tanswers?: readonly string[]\n\t  }>\n\t| Message<{\n\t\t\ttype: \"read\"\n\t\t\ttask?: ReadTaskSubType\n\t  }>\n\t| Message<{\n\t\t\ttype: \"blocking-task\"\n\t\t\ttask: BlockingTaskType\n\t\t\tmessage?: string\n\t\t\tcompletedAt?: number\n\t\t\tmetadata?: Record<string, unknown>\n\t  }>\n\t| Message<{\n\t\t\ttype: \"code-patch\"\n\t\t\tcontent: string\n\t\t\tfileName?: string\n\t\t\toperation?: CodePatchOperation\n\t\t\tcomplete?: boolean\n\t\t\tfailed?: boolean\n\t\t\t/** Guarantee part uniqueness by ensuring identical parts can't be merged if they span multiple tool calls */\n\t\t\ttoolCallId?: string\n\t  }>\n\t| Message<{\n\t\t\ttype: \"code-agent-status\"\n\t\t\ttext: string\n\t  }>\n\t| Message<{\n\t\t\ttype: \"tool-call\"\n\t\t\tcontent: AgentTypedToolCall\n\t  }>\n\t| Message<{\n\t\t\ttype: \"invalid-tool-call\"\n\t\t\tcontent: AgentInvalidToolCall\n\t  }>\n\t| Message<{\n\t\t\ttype: \"tool-result\"\n\t\t\tcontent: AgentTypedToolResult\n\t  }>\n\t| Message<{\n\t\t\ttype: \"changes\"\n\t\t\tchanges: readonly AgentChange[]\n\t  }>\n\nexport interface AgentChange {\n\tid: string\n\tname: string\n\tchanges: number\n\tsource: \"node\" | \"code-file\"\n\tkind: AgentChangeKind\n}\n\nexport type AgentChangeKind = \"collection\" | \"component\" | \"page\" | \"layer\" | \"code-file\" | \"text-style\" | \"link-style\"\n\n// Don't push non ui types\nexport type TransientTurnMessage = Exclude<\n\tChatPart,\n\t{ type: \"tool-call\" | \"invalid-tool-call\" | \"tool-result\" | \"command-error\" }\n>\n\nexport type CodePatchChatPart = Extract<ChatPart, { type: \"code-patch\" }>\nexport type CodePatchPart = Omit<CodePatchChatPart, \"type\" | \"complete\"> & { reset?: boolean }\nexport type EmitCodePatchPart = (part: CodePatchChatPart) => ChatPartUpdater<CodePatchChatPart> | undefined\ninterface TransientTurnState {\n\tmessages: TransientTurnMessage[]\n}\n\nexport function getScopeIdFromPart(part: ChatPart): NodeID | undefined {\n\tswitch (part.type) {\n\t\tcase \"create-component\":\n\t\tcase \"step\":\n\t\tcase \"command\":\n\t\t\treturn part.scopeId\n\t\tcase \"design-plan\":\n\t\tcase \"thinking\":\n\t\tcase \"text\":\n\t\tcase \"clarification\":\n\t\tcase \"read\":\n\t\tcase \"script-read\":\n\t\tcase \"blocking-task\":\n\t\tcase \"code-patch\":\n\t\tcase \"code-agent-status\":\n\t\tcase \"annotation\":\n\t\tcase \"command-error\":\n\t\tcase \"scripting\":\n\t\tcase \"tool-call\":\n\t\tcase \"invalid-tool-call\":\n\t\tcase \"tool-result\":\n\t\tcase \"changes\":\n\t\t\treturn undefined\n\t\tdefault:\n\t\t\tassertNever(part, \"Invalid part type\")\n\t}\n}\n\nexport interface AgentRequest {\n\tid: string\n\tparts: readonly AgentInputSegment[]\n\timages: readonly AgentAttachmentImage[]\n\tfiles: readonly AgentAttachmentFile[]\n\tcontextMessages: string[]\n\tsteps: ToolStep[]\n\tchangeset?: Changeset[]\n\tcodeFileChanges?: RequestCodeFileHistoryChange[]\n\trevertedChangeset?: Changeset[]\n\trevertedCodeFileChanges?: RequestCodeFileHistoryChange[]\n\tselection?: readonly NodeID[]\n\tcollectionItemOverlaySelection?: AgentCollectionItemOverlaySelection\n\tscopeId?: NodeID\n\tdone: boolean\n\tstate: TransientTurnState\n\t/** Pending while the turn summary is generated, then replaced with the resolved text so it can be persisted. */\n\tsummary?: string | Promise<string | undefined>\n\t/** Whether this turn is included in the monotonic summary frontier for future model context. */\n\tsummarizedForContext?: boolean\n\t/** Total token usage across all steps (debug bar Cost section). */\n\tusage?: LanguageModelUsage\n\tinitialUsage?: LanguageModelUsage\n\tmodel?: LanguageModel\n\treasoningEffort?: AgentReasoningEffort\n\t/**\n\t * Estimated USD for the turn (OpenRouter `usage.cost` when present; otherwise list-price\n\t * estimate from token counts). Shown in the debug bar Cost section and status bar.\n\t */\n\tcost?: number\n\t/** Total elapsed time in ms for the stream (debug bar Cost section). */\n\telapsedMs?: number\n\t/** Time-to-first-token in ms (latency from stream start to first token received). */\n\tttftMs?: number\n\t/** If the request was aborted for some reason. */\n\taborted?: AgentRequestAbortedReason\n\t/** Raindrop trace event ID for the turn; used to locate the trace when receiving a report. */\n\traindropEventId?: string\n\t/** CRDT row marker captured after turn finalization for eval export. */\n\tcrdtSnapshot?: AgentRequestCrdtSnapshotMarkers\n}\n\nexport type PersistedAgentRequest = LatestAgentSchemas.PersistedAgentSnapshot[\"history\"][number]\n// Forces fields to be persisted or explicitly handled to avoid accidental omission.\ntype EnsurePersistedAgentRequestKeys<T> = Exclude<keyof T, keyof PersistedAgentRequest> extends never ? T : never\nexport type SerializableAgentRequest = EnsurePersistedAgentRequestKeys<\n\tOmit<AgentRequest, \"changeset\" | \"summary\" | \"revertedChangeset\"> & {\n\t\tchangeset?: ReturnType<Changeset[\"serialize\"]>[]\n\t\trevertedChangeset?: ReturnType<Changeset[\"serialize\"]>[]\n\t\tsummary?: string\n\t}\n>\n\ninterface AgentRequestError {\n\treason: \"error\"\n\tcode?: string | number\n\tmessage?: string\n\tmetadata?: Record<string, unknown>\n}\n\ninterface AgentRequestUserStopped {\n\treason: \"user-stopped\"\n}\n\ninterface AgentRequestQueueInterrupted {\n\treason: \"queue-interrupted\"\n}\n\ninterface AgentRequestCreditLimitReached {\n\treason: \"credit-limit-reached\"\n\tmessage: string\n\tcreditLimitReason: AiCreditLimitReason\n}\n\ninterface AgentRequestAiDisabled {\n\treason: \"ai-disabled\"\n\tmessage: string\n}\n\ninterface AgentRequestUnknown {\n\treason: \"unknown\"\n}\n\nexport type AgentRequestAbortedReason =\n\t| AgentRequestError\n\t| AgentRequestUserStopped\n\t| AgentRequestQueueInterrupted\n\t| AgentRequestCreditLimitReached\n\t| AgentRequestAiDisabled\n\t| AgentRequestUnknown\n", "import { assert, LogLevel, type LocalModuleId, assertNever, diffValues, emptyArray, getLogger } from \"@framerjs/shared\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport type { LanguageModelUsage, ModelMessage } from \"ai\"\nimport type { AgentAttachmentFile, AgentAttachmentImage } from \"app/agent/attachments.ts\"\nimport type { AgentInputSegment, CmsTagSegment } from \"app/agent/editor/agentInputSchema.ts\"\nimport { extractCmsTagSegments, extractSelectionNodeIds, segmentsToTextContent } from \"app/agent/editor/utils/input.ts\"\nimport { generateSessionTitle } from \"app/agent/workers/generateSessionTitle.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { LatestAgentSchemas } from \"document/agentSnapshotMigration/schemas.ts\"\nimport type { CrdtTreeCommitter } from \"document/crdt/sync/CrdtTreeCommitter.ts\"\nimport type { Changeset } from \"document/models/CanvasTree/Changeset.ts\"\nimport { type CanvasTree, type NodeID, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { isFixedOrRelativeOverlay } from \"document/models/CanvasTree/nodes/utils/overlayHelpers.ts\"\nimport type { ModuleSaveReference } from \"document/stores/ModulesStore.ts\"\nimport { LockQueue } from \"document/utils/LockQueue.ts\"\nimport {\n\tgetActiveCollectionStackElement,\n\ttype OverlayStackElement,\n} from \"document/utils/contentManagementOverlayStack.ts\"\nimport { randomID } from \"library/render/types/randomID.ts\"\nimport { defaultAgentModel, isLanguageModel, type LanguageModel } from \"../languageModels.ts\"\nimport { getReasoningForEffort } from \"../models.ts\"\nimport type { AgentReasoningEffort } from \"../models.ts\"\nimport {\n\tcreateAgentInteraction,\n\tgetTrackedInputTokens,\n\ttype AgentInteractionHandle,\n} from \"../raindrop/AgentInteraction.ts\"\nimport type { OpenRouterFeatureStepTraceConfig } from \"../tracing/openRouterTrace.ts\"\nimport { resolveAgentTurnUsdCost } from \"../utils/languageModelUsdEstimate.ts\"\nimport { hydrateLanguageModelUsages, hydratePersistedAgentRequest, normalizeHydratedState } from \"./agentHydration.ts\"\nimport { buildAgentSummaryForRequest } from \"./changeSummary.ts\"\nimport { collectLlmToCanvasMappingsFromHistory } from \"./collectIdMappingsFromHistory.ts\"\nimport { getCommandOverlayTargetNode } from \"./commandTargets.ts\"\nimport {\n\tAgentContext,\n\tcloneContextRuntimeState,\n\ttype AgentContextDependencies,\n\ttype ContextRuntimeState,\n} from \"./context/AgentContext.ts\"\nimport type { CmsSelectionGroupByCollection } from \"./context/collections.ts\"\nimport { logStepUsage } from \"./debug/logStepUsage.ts\"\nimport { isCommand, type Command } from \"./dsl.ts\"\nimport {\n\tisUserStopError,\n\ttoAgentRequestError,\n\tuserStopError,\n\tqueueInterruptedError,\n\tisQueueInterruptedError,\n} from \"./errors.ts\"\nimport {\n\ttype AssistantResponsePart,\n\tupdateOrAppendPart,\n\ttype FlatAssistantResponsePart,\n\tgetFlatAssistantResponsePart,\n\ttype ToolStep,\n} from \"./messages.ts\"\nimport { stream, type StreamLifeCycleHooks } from \"./stream.ts\"\nimport { summarizeRequests } from \"./summarizeHistory.ts\"\nimport type { ClarificationAnswer, ClarificationAnswerProvider } from \"./tools/askClarification.ts\"\nimport { createNodeByIdCursorStoreState, type NodeByIdCursorStoreState } from \"./tools/nodeById/cursorStore.ts\"\nimport type { RequestCodeFileChangesExecutor, RequestCodeFileHistoryChange } from \"./tools/requestCodeFileChanges.ts\"\nimport {\n\tcollectCodeFileRevertTargets,\n\tprefetchCodeFileSources,\n\treapplyCodeFileHistoryChanges,\n\trestoreCodeFilesToTargets,\n\trevertCodeFileHistoryChanges,\n} from \"./tools/requestCodeFileChanges/revertCodeFileHistoryChanges.ts\"\nimport type { AgentScriptInstrumentation } from \"./tools/script/bridge.ts\"\nimport {\n\testimatePostCompactionInputTokens,\n\tgetLatestInputTokensFromHistory,\n\tgetRequestIdsToAdvanceSummaryCompactionBoundary,\n\ttransformHistoryToModelMessages,\n} from \"./transformHistoryToModelMessages.ts\"\nimport {\n\ttype AgentRequest,\n\ttype QueuedPrompt,\n\ttype ChatPart,\n\ttype TransientTurnMessage,\n\ttype ChatPartUpdater,\n\ttype SerializableAgentRequest,\n\ttype PersistedAgentRequest,\n\ttype AgentCollectionItemOverlaySelection,\n\tgetScopeIdFromPart,\n} from \"./types.ts\"\n\nconst log = getLogger(\"ai:agents\")\n\nconst defaultMaxSteps = 100\n\nfunction isSamePartType<T extends ChatPart>(expected: T, actual: ChatPart): actual is T {\n\treturn actual.type === expected.type\n}\n\nexport type AgentID = NodeID\nexport type AgentState =\n\t// A session that has never been started, or has been undone back to the initial state\n\t| \"idle\"\n\t// A session that has had at least one assistant response.\n\t| \"follow-up\"\n\t// A session that is currently generating a response.\n\t| \"generating\"\n\t// A session that is waiting for the user to answer clarification questions.\n\t| \"waiting-for-clarification\"\n\t// A session that has errored.\n\t| \"error\"\n\ninterface AgentDependencies extends AgentContextDependencies {\n\tisFollowModeEnabled: () => boolean\n\tselectScopeByAgent: (nodeId: NodeID) => void\n\tgetActiveScopeId: () => NodeID\n}\n\nexport interface AgentLifeCycleHooks extends Omit<StreamLifeCycleHooks, \"onStepFinish\"> {\n\tonTurnStart?: (agent: Agent) => void\n\tonTurnEnd?: (agent: Agent) => void | Promise<void>\n\tonStepFinish?: (agent: Agent) => void | Promise<void>\n}\n\ninterface AgentSendResult {\n\trequest: AgentRequest\n\tresponseMessages: readonly ModelMessage[]\n}\n\nexport interface AgentTurnOptions {\n\tonCancelled?: () => void\n\tskipTitleGeneration?: boolean\n\tskipHistoryCommit?: boolean\n\tskipSummaryGeneration?: boolean\n\tdisableRaindropTelemetry?: boolean\n\tpropagateErrors?: boolean\n\tmaxSteps?: number\n\twaitForUserAnswers?: ClarificationAnswerProvider\n\trequestCodeFileChangesExecutor?: RequestCodeFileChangesExecutor\n\tcollectionItemOverlaySelection?: AgentCollectionItemOverlaySelection\n\tscriptEvalInstrumentation?: AgentScriptInstrumentation\n}\n\ninterface AgentResumeOptions extends AgentTurnOptions {\n\tmodel?: LanguageModel\n\treasoningEffort?: AgentReasoningEffort\n\t/** Eval replay can resume from a completed persisted turn without showing it as interrupted first. */\n\tforce?: boolean\n}\n\ntype AgentContextUsageSource = \"estimated\" | \"actual\"\n\nexport interface AgentContextUsage {\n\tmodel: LanguageModel\n\tinputTokens: number\n\tsource: AgentContextUsageSource\n}\n\ninterface AgentInitialState {\n\thistory?: AgentRequest[]\n\tusage?: LanguageModelUsage[]\n\ttitle?: string\n\tstate?: AgentState\n\tpromptQueue?: readonly QueuedPrompt[]\n\tnodeByIdCursorStoreState?: NodeByIdCursorStoreState\n\tcontextUsage?: AgentContextUsage\n}\n\ninterface TurnClock {\n\twallClockBaseMs: number\n\tmonotonicBaseMs: number\n}\n\nfunction serializeAgentRequest(request: AgentRequest): PersistedAgentRequest {\n\tconst persistedRequest = {\n\t\t...request,\n\t\tfiles: request.files.map(serializeAgentAttachmentFile),\n\t\tchangeset: request.changeset?.map(c => c.serialize()),\n\t\trevertedChangeset: request.revertedChangeset?.map(c => c.serialize()),\n\n\t\t// We can't persist a summary that is a promise, so we only store a resolved string.\n\t\tsummary: typeof request.summary === \"string\" ? request.summary : undefined,\n\t} satisfies SerializableAgentRequest\n\n\treturn LatestAgentSchemas.persistedAgentRequestSchema.parse(persistedRequest, { reportInput: true })\n}\n\nexport type SelectionForContext = Map<\n\tNodeID,\n\tboolean /* skimmed: true if the node should be provided as a skimmed version, false if the full node should be provided. */\n>\n\ninterface ResolvedTurnSelection {\n\t// Selection recorded on the request. Used to determine what to highlight on the canvas, and\n\t// reused as the implicit selection when editing/resuming a request.\n\tselectionForRequest: readonly NodeID[]\n\t// Selection context that we provide to the model.\n\tselectionForContext: readonly NodeID[]\n\tcollectionItemOverlaySelection?: AgentCollectionItemOverlaySelection\n}\n\nexport class Agent {\n\tprivate readonly subscribers = new Set<() => void>()\n\n\tprivate ctx: AgentContext | null = null\n\tprivate activeInteraction: AgentInteractionHandle | undefined\n\tprivate history: AgentRequest[] = []\n\n\treadonly usage: LanguageModelUsage[] = []\n\n\tprivate _contextUsage: AgentContextUsage | undefined\n\tget contextUsage(): AgentContextUsage | undefined {\n\t\treturn this._contextUsage\n\t}\n\n\tprivate abortController: AbortController | null = null\n\n\tprivate clarificationResolver: {\n\t\tresolve: (answers: ClarificationAnswer[]) => void\n\t\treject: (reason: unknown) => void\n\t} | null = null\n\n\tprivate _promptQueue: { paused: boolean; prompts: QueuedPrompt[] } = { paused: false, prompts: [] }\n\tprivate nodeByIdCursorStoreState: NodeByIdCursorStoreState = createNodeByIdCursorStoreState()\n\tprivate evalCrdtBaseCapture: { base: Uint8Array; baseRowIndex: number } | undefined\n\n\tprivate turnClock: TurnClock | null = null\n\tprivate currentTurnPromise: Promise<unknown> | undefined\n\t/** Counter to track the latest turn. NOT the same as request ID, a single request can consist of multiple turns (retries). */\n\tprivate currentTurnId = 0\n\n\tget turnId() {\n\t\treturn this.currentTurnId\n\t}\n\n\tprivate _state: AgentState = \"idle\"\n\tget state(): AgentState {\n\t\treturn this._state\n\t}\n\tprivate set state(value: AgentState) {\n\t\tthis._state = value\n\t\tthis.notifyChange()\n\t}\n\n\tget isBusy(): boolean {\n\t\treturn this._state === \"generating\" || this._state === \"waiting-for-clarification\"\n\t}\n\n\tprivate _title: string | undefined = undefined\n\tget title(): string | undefined {\n\t\treturn this._title\n\t}\n\n\tprivate get traceConfig(): OpenRouterFeatureStepTraceConfig {\n\t\treturn { featureName: \"agents\", sessionId: this.id }\n\t}\n\n\t// Counter to track title generation; incremented on reset to ignore stale responses\n\tprivate titleGenerationId = 0\n\n\tconstructor(\n\t\treadonly id: AgentID,\n\t\t/**\n\t\t * Scope ID where the agent was created. We only show agents in the active scope. We can't use the\n\t\t * selection because the selected nodes can be manipulated/deleted by the agent task.\n\t\t */\n\t\tpublic scopeId: NodeID,\n\t\t/**\n\t\t * Any explicit selection that the agent is attached to when a turn starts. For the chat\n\t\t * panel, this is the selection referenced as context in the input. It is not necessarily\n\t\t * the same as the selection we send to the LLM, which could be derived from implicit\n\t\t * selections. We use it to determine which target nodes to highlight, for example.\n\t\t */\n\t\tpublic selection: readonly NodeID[] | undefined,\n\t\t/**\n\t\t * The dependencies of the agent.\n\t\t */\n\t\tprivate readonly dependencies: AgentDependencies,\n\t\t/**\n\t\t * Lifecycle of each request hooks for debugging/instrumentation\n\t\t */\n\t\tprivate readonly lifecycleHooks?: AgentLifeCycleHooks,\n\t\tinitialState?: AgentInitialState,\n\t) {\n\t\tthis.history = initialState?.history ?? []\n\t\tthis.usage.push(...(initialState?.usage ?? []))\n\t\tthis._title = initialState?.title\n\t\tthis._state = initialState?.state ?? \"idle\"\n\n\t\tif (initialState?.promptQueue?.length) {\n\t\t\tthis._promptQueue = {\n\t\t\t\tpaused: true,\n\t\t\t\tprompts: [...initialState.promptQueue],\n\t\t\t}\n\t\t}\n\t\tif (initialState?.nodeByIdCursorStoreState) {\n\t\t\tthis.nodeByIdCursorStoreState = initialState.nodeByIdCursorStoreState\n\t\t}\n\n\t\tif (initialState?.contextUsage) {\n\t\t\tthis._contextUsage = initialState.contextUsage\n\t\t} else {\n\t\t\tthis.estimateContextUsageFromHistory()\n\t\t}\n\t}\n\n\tstatic hydrate(\n\t\tsnapshot: LatestAgentSchemas.PersistedAgentSnapshot,\n\t\tdependencies: AgentDependencies,\n\t\tlifecycleHooks?: AgentLifeCycleHooks,\n\t): Agent {\n\t\tconst lineage = dependencies.treeStore.tree.lineage\n\t\treturn new Agent(snapshot.id, snapshot.scopeId, snapshot.selection, dependencies, lifecycleHooks, {\n\t\t\thistory: snapshot.history.map(request =>\n\t\t\t\thydratePersistedAgentRequest(request, serializedChangeset => lineage.restoreChangeset(serializedChangeset)),\n\t\t\t),\n\t\t\tusage: hydrateLanguageModelUsages(snapshot.usage),\n\t\t\ttitle: snapshot.title,\n\t\t\tstate: normalizeHydratedState(snapshot.state, snapshot.history.length),\n\t\t\tpromptQueue: snapshot.promptQueue?.map(prompt => ({\n\t\t\t\t...prompt,\n\t\t\t\tfiles: prompt.files ?? [],\n\t\t\t\tcollectionItemOverlaySelection: prompt.collectionItemOverlaySelection,\n\t\t\t})),\n\t\t\tnodeByIdCursorStoreState: snapshot.nodeByIdCursorStoreState,\n\t\t\tcontextUsage:\n\t\t\t\tsnapshot.contextUsage && isLanguageModel(snapshot.contextUsage.model)\n\t\t\t\t\t? { ...snapshot.contextUsage, model: snapshot.contextUsage.model }\n\t\t\t\t\t: undefined,\n\t\t})\n\t}\n\n\t/**\n\t * Subscribe to changes in this agent.\n\t * @returns Unsubscribe function\n\t */\n\tsubscribe(callback: () => void): () => void {\n\t\tthis.subscribers.add(callback)\n\t\treturn () => this.subscribers.delete(callback)\n\t}\n\n\tprivate notifyChange() {\n\t\tthis.subscribers.forEach(cb => cb())\n\t}\n\n\tserialize(): LatestAgentSchemas.PersistedAgentSnapshot {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tscopeId: this.scopeId,\n\t\t\tselection: this.selection,\n\t\t\tstate: this.state,\n\t\t\ttitle: this.title,\n\t\t\thistory: this.history.map(serializeAgentRequest),\n\t\t\tusage: this.usage as LatestAgentSchemas.PersistedAgentSnapshot[\"usage\"],\n\t\t\tpromptQueue: this._promptQueue.prompts.map(prompt => ({\n\t\t\t\t...prompt,\n\t\t\t\timages: prompt.images.map(img => ({\n\t\t\t\t\treferenceImage: serializeAgentAttachmentImagePart(img.referenceImage),\n\t\t\t\t\t...(img.modelImage ? { modelImage: serializeAgentAttachmentImagePart(img.modelImage) } : {}),\n\t\t\t\t})),\n\t\t\t\tfiles: prompt.files.map(serializeAgentAttachmentFile),\n\t\t\t})),\n\t\t\tnodeByIdCursorStoreState: this.nodeByIdCursorStoreState,\n\t\t\tcontextUsage: this._contextUsage,\n\t\t}\n\t}\n\n\tgetEvalCrdtBaseCapture(): { base: Uint8Array; baseRowIndex: number } | undefined {\n\t\treturn this.evalCrdtBaseCapture\n\t}\n\n\thydrateEvalCrdtBaseCapture(capture: { base: Uint8Array; baseRowIndex: number }): void {\n\t\tthis.evalCrdtBaseCapture = {\n\t\t\tbase: new Uint8Array(capture.base),\n\t\t\tbaseRowIndex: capture.baseRowIndex,\n\t\t}\n\t}\n\n\tgetContextRuntimeState(): ContextRuntimeState {\n\t\tconst runtimeState = this.getCurrentContextRuntimeState()\n\t\tassert(runtimeState, \"Context runtime state is only available after context initialization or history hydration.\")\n\t\treturn runtimeState\n\t}\n\n\t/**\n\t * Return and filter the history to only include user and assistant messages.\n\t */\n\tget chatMessages(): readonly AgentRequest[] {\n\t\treturn this.history\n\t}\n\n\tget debugContext() {\n\t\treturn this.ctx\n\t}\n\tget userMessageCount(): number {\n\t\treturn this.history.length\n\t}\n\n\t/**\n\t * Return user message parts at the given index, or undefined if out of bounds.\n\t */\n\tgetUserMessageParts(index: number): readonly AgentInputSegment[] | undefined {\n\t\treturn this.history[index]?.parts\n\t}\n\n\tget queuedPrompts(): readonly QueuedPrompt[] {\n\t\treturn this._promptQueue.prompts\n\t}\n\n\tenqueuePrompt(\n\t\tparts: readonly AgentInputSegment[],\n\t\timages: readonly AgentAttachmentImage[],\n\t\tmodel: LanguageModel,\n\t\treasoningEffort: AgentReasoningEffort,\n\t\timplicitSelection: readonly NodeID[],\n\t\tfiles: readonly AgentAttachmentFile[] = [],\n\t): void {\n\t\tthis._promptQueue.prompts.push({\n\t\t\tid: randomID(),\n\t\t\tparts,\n\t\t\timages,\n\t\t\tfiles,\n\t\t\tmodel,\n\t\t\treasoningEffort,\n\t\t\timplicitSelection,\n\t\t\tcollectionItemOverlaySelection: getCollectionItemOverlaySelection(this.dependencies.hooks.getEngine()),\n\t\t})\n\n\t\t// Since user is intentionally sending a new prompt, we should unpause the queue even if\n\t\t// previous state was error.\n\t\tthis._promptQueue.paused = false\n\n\t\tthis.notifyChange()\n\n\t\t// If nothing is generating anymore we can drain the queue.\n\t\tif (!this.isBusy) this.drainQueue()\n\t}\n\n\tremoveFromQueue(id: string): void {\n\t\tthis._promptQueue.prompts = this._promptQueue.prompts.filter(p => p.id !== id)\n\t\tthis.notifyChange()\n\t}\n\n\tmoveQueueItem(fromIndex: number, toIndex: number): void {\n\t\tconst prompts = this._promptQueue.prompts\n\t\tif (fromIndex < 0 || fromIndex >= prompts.length || toIndex < 0 || toIndex >= prompts.length) return\n\t\tif (fromIndex === toIndex) return\n\t\tconst next = [...prompts]\n\t\tconst [item] = next.splice(fromIndex, 1)\n\t\tif (!item) return\n\t\tnext.splice(toIndex, 0, item)\n\t\tthis._promptQueue.prompts = next\n\t\tthis.notifyChange()\n\t}\n\n\t/**\n\t * Update the text/images/model of a queued prompt. The implicit selection is preserved\n\t * from when the prompt was originally queued -- editing the prompt text shouldn't change\n\t * the selection context the user had in mind.\n\t */\n\tupdateQueueItem(\n\t\tid: string,\n\t\tparts: readonly AgentInputSegment[],\n\t\timages: readonly AgentAttachmentImage[],\n\t\tmodel: LanguageModel,\n\t\treasoningEffort: AgentReasoningEffort,\n\t\tfiles: readonly AgentAttachmentFile[] = [],\n\t): void {\n\t\tconst index = this._promptQueue.prompts.findIndex(p => p.id === id)\n\t\tif (index === -1) return\n\t\tconst existing = this._promptQueue.prompts[index]\n\t\tif (!existing) return\n\t\tthis._promptQueue.prompts[index] = {\n\t\t\t...existing,\n\t\t\tparts,\n\t\t\timages,\n\t\t\tfiles,\n\t\t\tmodel,\n\t\t\treasoningEffort,\n\t\t}\n\t\tthis.notifyChange()\n\t}\n\n\t/**\n\t * Remove the given queue item and submit it immediately.\n\t * If generating, move to front of queue and abort so drainQueue picks it up.\n\t * If not generating, send directly.\n\t */\n\tsubmitImmediately(id: string, shouldResumeQueue: boolean = true): void {\n\t\tconst index = this._promptQueue.prompts.findIndex(p => p.id === id)\n\t\tif (index === -1) return\n\t\tconst [item] = this._promptQueue.prompts.splice(index, 1)\n\t\tif (!item) return\n\n\t\t// Not calling resumeQueue because we want to force drain the queue, we don't care about the error state here\n\t\t// and we want to abort or send depending on the state.\n\t\tif (shouldResumeQueue) this._promptQueue.paused = false\n\n\t\tif (this.isBusy) {\n\t\t\tthis._promptQueue.prompts.unshift(item)\n\n\t\t\tthis.notifyChange()\n\n\t\t\tthis.abortTurn(queueInterruptedError)\n\t\t} else {\n\t\t\tthis.notifyChange()\n\t\t\tvoid this.send(item.parts, item.implicitSelection, item.model, item.reasoningEffort, item.images, item.files, {\n\t\t\t\tcollectionItemOverlaySelection: item.collectionItemOverlaySelection,\n\t\t\t})\n\t\t}\n\t}\n\n\tpauseQueue(): void {\n\t\tthis._promptQueue.paused = true\n\t}\n\n\tresumeQueue(): void {\n\t\t// If a generation has finished meanwhile and has an error we cannot resume the queue.\n\t\tif (this._state === \"error\") return\n\n\t\tthis._promptQueue.paused = false\n\n\t\t// If nothing is generating anymore we can drain the queue.\n\t\tif (!this.isBusy) this.drainQueue()\n\t}\n\n\tprivate drainQueue(force: boolean = false): void {\n\t\tif (!force && this._promptQueue.paused) return\n\n\t\tconst next = this._promptQueue.prompts.shift()\n\t\tif (!next) return\n\n\t\tthis.notifyChange()\n\n\t\tvoid this.send(next.parts, next.implicitSelection, next.model, next.reasoningEffort, next.images, next.files, {\n\t\t\tcollectionItemOverlaySelection: next.collectionItemOverlaySelection,\n\t\t})\n\t}\n\n\tprivate createAgentRequest(\n\t\tparts: readonly AgentInputSegment[],\n\t\tcanvasSelectionNodeIds: readonly NodeID[] | undefined,\n\t\tmodel?: LanguageModel,\n\t\treasoningEffort?: AgentReasoningEffort,\n\t\timages: readonly AgentAttachmentImage[] = [],\n\t\tfiles: readonly AgentAttachmentFile[] = [],\n\t\tcollectionItemOverlaySelection?: AgentCollectionItemOverlaySelection,\n\t\traindropEventId?: string,\n\t): AgentRequest {\n\t\tconst request: AgentRequest = {\n\t\t\tid: randomID(),\n\t\t\tparts,\n\t\t\timages,\n\t\t\tfiles,\n\t\t\tcontextMessages: [],\n\t\t\t// Step entries are created lazily from stream `onPrepareStep`, including step 0 before\n\t\t\t// first model output is emitted.\n\t\t\tsteps: [],\n\t\t\tchangeset: [],\n\t\t\tcodeFileChanges: [],\n\t\t\tselection: canvasSelectionNodeIds,\n\t\t\tcollectionItemOverlaySelection,\n\t\t\tscopeId: this.scopeId,\n\t\t\tdone: false,\n\t\t\tstate: {\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\ttimestamp: this.getCurrentTurnTimestamp(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\tmodel,\n\t\t\treasoningEffort,\n\t\t\t// Must be set before notifyChange(): persist runs synchronously inside the subscriber and\n\t\t\t// would otherwise snapshot the new turn before sendInternal assigns the trace id.\n\t\t\traindropEventId,\n\t\t}\n\n\t\tthis.history.push(request)\n\n\t\tthis.notifyChange()\n\n\t\treturn request\n\t}\n\n\tprivate clearStaleRevertedChanges(): void {\n\t\tfor (const prior of this.history) {\n\t\t\tif (!prior.revertedChangeset?.length && !prior.revertedCodeFileChanges?.length) continue\n\t\t\tprior.revertedChangeset = []\n\t\t\tprior.revertedCodeFileChanges = []\n\t\t}\n\t}\n\n\tprivate getModelForRequest(request: AgentRequest): LanguageModel {\n\t\tif (request.model) return request.model\n\t\tif (this._contextUsage?.model) return this._contextUsage.model\n\t\treturn defaultAgentModel\n\t}\n\n\t/**\n\t * Send a message to the agent, starting a new Agent Loop from the previous message history.\n\t */\n\tasync send(\n\t\tparts: readonly AgentInputSegment[],\n\t\timplicitSelection: readonly NodeID[],\n\t\tmodel: LanguageModel,\n\t\treasoningEffort?: AgentReasoningEffort,\n\t\timages: readonly AgentAttachmentImage[] = [],\n\t\tfiles: readonly AgentAttachmentFile[] = [],\n\t\toptions?: AgentTurnOptions,\n\t): Promise<AgentSendResult | undefined> {\n\t\tconst turnOptions = this.withSubmittedCollectionItemOverlaySelection(options)\n\t\treturn this.runTurn(\n\t\t\tparts,\n\t\t\timplicitSelection,\n\t\t\tasync (resolvedSelection, cmsSelectionSegments) => {\n\t\t\t\tconst interaction = createAgentInteraction(\n\t\t\t\t\tthis.id,\n\t\t\t\t\tthis.dependencies.sessionStore.user,\n\t\t\t\t\tthis.dependencies.source.agent,\n\t\t\t\t\tthis.dependencies.projectId,\n\t\t\t\t\t{ disableRaindropTelemetry: turnOptions.disableRaindropTelemetry },\n\t\t\t\t)\n\n\t\t\t\treturn this.sendInternal(\n\t\t\t\t\tparts,\n\t\t\t\t\tresolvedSelection,\n\t\t\t\t\tcmsSelectionSegments,\n\t\t\t\t\tmodel,\n\t\t\t\t\treasoningEffort,\n\t\t\t\t\timages,\n\t\t\t\t\tfiles,\n\t\t\t\t\tturnOptions.maxSteps ?? defaultMaxSteps,\n\t\t\t\t\tinteraction,\n\t\t\t\t\tundefined,\n\t\t\t\t\tturnOptions,\n\t\t\t\t)\n\t\t\t},\n\t\t\tturnOptions,\n\t\t)\n\t}\n\n\tprivate withSubmittedCollectionItemOverlaySelection(options?: AgentTurnOptions): AgentTurnOptions {\n\t\tconst collectionItemOverlaySelectionKey: keyof AgentTurnOptions = \"collectionItemOverlaySelection\"\n\t\tif (options && collectionItemOverlaySelectionKey in options) return options\n\n\t\treturn {\n\t\t\t...options,\n\t\t\tcollectionItemOverlaySelection: getCollectionItemOverlaySelection(this.dependencies.hooks.getEngine()),\n\t\t}\n\t}\n\n\t/**\n\t * Resume the latest interrupted request in-place, preserving the same turn, but creating a new\n\t * ToolStep. Eval replay can force this for a completed request that was truncated to a checkpoint.\n\t */\n\tasync resumeLastRequest(options?: AgentResumeOptions): Promise<AgentRequest | undefined> {\n\t\tconst request = this.getLastUserMessage()\n\t\tif (!request) return undefined\n\t\tif (!request.aborted && options?.force !== true) return request\n\n\t\tconst model = options?.model ?? this.getModelForRequest(request)\n\t\tconst reasoningEffort = options?.reasoningEffort ?? request.reasoningEffort\n\t\tconst turnOptions = {\n\t\t\tskipTitleGeneration: true,\n\t\t\tcollectionItemOverlaySelection: request.collectionItemOverlaySelection,\n\t\t\t...options,\n\t\t}\n\n\t\t// Set the most recent non-empty step as retried. A new step will be created by the next send,\n\t\t// ensuring multiple retries are supported in a single Request. Empty steps are ignored.\n\t\tfor (let i = request.steps.length - 1; i >= 0; i--) {\n\t\t\tconst step = request.steps[i]\n\t\t\tif (!step || step.content.length === 0) continue\n\t\t\tstep.retried = true\n\t\t\tbreak\n\t\t}\n\n\t\tawait this.runTurn(\n\t\t\trequest.parts,\n\t\t\trequest.selection ?? emptyArray(),\n\t\t\tasync (resolvedSelection, cmsSelectionSegments) => {\n\t\t\t\tconst interaction = createAgentInteraction(\n\t\t\t\t\tthis.id,\n\t\t\t\t\tthis.dependencies.sessionStore.user,\n\t\t\t\t\tthis.dependencies.source.agent,\n\t\t\t\t\tthis.dependencies.projectId,\n\t\t\t\t\t{ disableRaindropTelemetry: turnOptions.disableRaindropTelemetry },\n\t\t\t\t)\n\n\t\t\t\tawait this.sendInternal(\n\t\t\t\t\trequest.parts,\n\t\t\t\t\tresolvedSelection,\n\t\t\t\t\tcmsSelectionSegments,\n\t\t\t\t\tmodel,\n\t\t\t\t\treasoningEffort,\n\t\t\t\t\trequest.images,\n\t\t\t\t\trequest.files,\n\t\t\t\t\tturnOptions.maxSteps ?? defaultMaxSteps,\n\t\t\t\t\tinteraction,\n\t\t\t\t\trequest,\n\t\t\t\t\tturnOptions,\n\t\t\t\t)\n\t\t\t},\n\t\t\tturnOptions,\n\t\t)\n\n\t\treturn request\n\t}\n\n\tprivate async runTurn<TResult>(\n\t\tparts: readonly AgentInputSegment[],\n\t\timplicitCanvasSelectionNodeIds: readonly NodeID[],\n\t\tsend: (resolvedSelection: ResolvedTurnSelection, cmsTagSegments: readonly CmsTagSegment[]) => Promise<TResult>,\n\t\toptions?: AgentTurnOptions,\n\t): Promise<TResult | undefined> {\n\t\tassert(this._state !== \"generating\", \"Already generating\")\n\t\tassert(this._state !== \"waiting-for-clarification\", \"Already waiting for clarification\")\n\t\tassert(this.scopeId, \"Scope ID required\")\n\n\t\tthis.abortController = new AbortController()\n\t\tlet forceDrainQueue = false\n\t\tthis.turnClock = createTurnClock()\n\t\tconst turnId = ++this.currentTurnId\n\t\tconst turnPromise = (async (): Promise<TResult | undefined> => {\n\t\t\ttry {\n\t\t\t\tthis.state = \"generating\"\n\n\t\t\t\tconst explicitSelection = extractSelectionNodeIds(parts)\n\t\t\t\tconst explicitCmsTagSegments = extractCmsTagSegments(parts)\n\t\t\t\tconst collectionItemOverlaySelection = options?.collectionItemOverlaySelection\n\n\t\t\t\tconst dataTree = this.dependencies.treeStore.getDataTreeOrPartialTree()\n\n\t\t\t\tconst rawSelectionForRequest: readonly NodeID[] =\n\t\t\t\t\texplicitSelection.length > 0 ? explicitSelection : implicitCanvasSelectionNodeIds\n\n\t\t\t\t// `Agent.selection` drives UI only, so keeping it canvas-only (no CMS tags) is fine for now.\n\t\t\t\tthis.selection = explicitSelection\n\n\t\t\t\tconst selectionForRequest = dataTree\n\t\t\t\t\t.withoutDescendants(dataTree.getNodes(rawSelectionForRequest))\n\t\t\t\t\t.map(node => node.id)\n\n\t\t\t\tthis.lifecycleHooks?.onTurnStart?.(this)\n\n\t\t\t\tif (!this.history.length && !options?.skipTitleGeneration) {\n\t\t\t\t\tvoid this.generateTitle(parts)\n\t\t\t\t}\n\n\t\t\t\tconst result = await send(\n\t\t\t\t\t{\n\t\t\t\t\t\tselectionForContext: explicitSelection.length > 0 ? explicitSelection : selectionForRequest,\n\t\t\t\t\t\tselectionForRequest,\n\t\t\t\t\t\tcollectionItemOverlaySelection,\n\t\t\t\t\t},\n\t\t\t\t\texplicitCmsTagSegments,\n\t\t\t\t)\n\n\t\t\t\tthis.state = \"follow-up\"\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tthis.state = \"error\"\n\n\t\t\t\tconst isQueueInterrupted = isQueueInterruptedError(error)\n\t\t\t\tif (!isQueueInterrupted) {\n\t\t\t\t\t// Should pause the queue here if error or user cancelled generation.\n\t\t\t\t\tthis.pauseQueue()\n\t\t\t\t}\n\t\t\t\tforceDrainQueue = isQueueInterrupted\n\n\t\t\t\tif (!isUserStopError(error) && !isQueueInterrupted) {\n\t\t\t\t\tif (options?.propagateErrors) throw error\n\t\t\t\t\tlog.reportError(error)\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tthis.abortController = null\n\t\t\t\tthis.turnClock = null\n\t\t\t\tthis.estimateContextUsageAfterCompaction()\n\t\t\t\tthis.notifyChange()\n\t\t\t\ttry {\n\t\t\t\t\tawait this.lifecycleHooks?.onTurnEnd?.(this)\n\t\t\t\t} finally {\n\t\t\t\t\tthis.drainQueue(forceDrainQueue)\n\t\t\t\t\tif (this.currentTurnId === turnId) {\n\t\t\t\t\t\tthis.currentTurnPromise = undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})()\n\n\t\tthis.currentTurnPromise = turnPromise\n\t\treturn turnPromise\n\t}\n\n\t/**\n\t * Generate a title for the agent session based on the first message.\n\t * This is called automatically for panel sessions after the first message is sent.\n\t */\n\tprivate async generateTitle(parts: readonly AgentInputSegment[]): Promise<void> {\n\t\tconst generationId = ++this.titleGenerationId\n\t\ttry {\n\t\t\tconst displayText = segmentsToTextContent(this.dependencies.treeStore.getDataTreeOrPartialTree(), parts)\n\t\t\tconst title = await generateSessionTitle(displayText, this.traceConfig)\n\t\t\tif (!title || generationId !== this.titleGenerationId) return\n\t\t\tthis._title = title\n\t\t\tthis.notifyChange()\n\t\t} catch {\n\t\t\t// Silently fail - title generation is non-critical\n\t\t}\n\t}\n\n\tprivate initChangeset(): Changeset {\n\t\treturn this.dependencies.treeStore.tree.changeset({\n\t\t\tname: \"agent-response\",\n\t\t})\n\t}\n\n\tprivate syncScopeNode() {\n\t\tconst scopeNode = this.dependencies.treeStore.tree.getNodeWithTrait(this.scopeId, isScopeNode)\n\t\tif (scopeNode) return scopeNode\n\n\t\t// The original scope might not exist anymore in the tree (e.g. when you resume an existing\n\t\t// request), in this case, fallback to the active scope.\n\t\tconst activeScope = this.dependencies.treeStore.tree.getNodeWithTrait(\n\t\t\tthis.dependencies.getActiveScopeId(),\n\t\t\tisScopeNode,\n\t\t)\n\t\tif (!activeScope) return undefined\n\n\t\tthis.scopeId = activeScope.id\n\t\treturn activeScope\n\t}\n\n\tprivate createInteractionStreamLifecycleHooks(interaction: AgentInteractionHandle) {\n\t\treturn interaction.createStreamLifecycleHooks({\n\t\t\tonFirstToken: () => {\n\t\t\t\tthis.lifecycleHooks?.onFirstToken?.()\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate async sendInternal(\n\t\tparts: readonly AgentInputSegment[],\n\t\tresolvedSelection: ResolvedTurnSelection,\n\t\tcmsTagSegments: readonly CmsTagSegment[],\n\t\tmodel: LanguageModel,\n\t\treasoningEffort: AgentReasoningEffort | undefined,\n\t\timages: readonly AgentAttachmentImage[],\n\t\tfiles: readonly AgentAttachmentFile[],\n\t\tmaxSteps: number,\n\t\tinteraction: AgentInteractionHandle,\n\t\texistingRequest?: AgentRequest,\n\t\tturnOptions?: AgentTurnOptions,\n\t): Promise<AgentSendResult> {\n\t\tif (!existingRequest) {\n\t\t\t// 0. Re-resolve scope so follow-up turns use the current active scope.\n\t\t\tconst activeScopeId = this.dependencies.getActiveScopeId()\n\t\t\tif (activeScopeId !== this.scopeId) {\n\t\t\t\tthis.scopeId = activeScopeId\n\t\t\t}\n\t\t}\n\n\t\tconst changeset = this.initChangeset()\n\t\t// 1. Add message immediately when creating a new request (sync)\n\t\tconst request =\n\t\t\texistingRequest ??\n\t\t\tthis.createAgentRequest(\n\t\t\t\tparts,\n\t\t\t\tresolvedSelection.selectionForRequest,\n\t\t\t\tmodel,\n\t\t\t\treasoningEffort,\n\t\t\t\timages,\n\t\t\t\tfiles,\n\t\t\t\tresolvedSelection.collectionItemOverlaySelection,\n\t\t\t\tinteraction.traceEventId(),\n\t\t\t)\n\t\trequest.raindropEventId = interaction.traceEventId()\n\n\t\t// Resuming keeps the same turn object but resets interruption state.\n\t\tif (existingRequest) {\n\t\t\trequest.aborted = undefined\n\t\t\trequest.done = false\n\n\t\t\t// If the last message is a thinking message, remove it so that we can reset the timestamp.\n\t\t\tif (request.state.messages.at(-1)?.type === \"thinking\") request.state.messages.pop()\n\t\t\t// Intentionally do not reset `request.steps` when resuming. Prior step history is preserved\n\t\t\t// by design and a new step boundary is appended by the resume flow.\n\t\t\trequest.codeFileChanges = [...(request.codeFileChanges ?? [])]\n\t\t}\n\t\tconst codeFileChanges = request.codeFileChanges ?? (request.codeFileChanges = [])\n\n\t\trequest.changeset = [...(request.changeset ?? []), changeset]\n\t\tassert(request.changeset?.length > 0, \"Request must include at least one changeset\")\n\n\t\tconst commandQueue = new LockQueue()\n\t\tlet turnContextUsage: AgentContextUsage | undefined\n\t\tconst updateTurnContextUsage = (inputTokens: number, source: AgentContextUsageSource): void => {\n\t\t\tturnContextUsage = { model, inputTokens, source }\n\t\t\tthis.updateContextUsage(model, inputTokens, source)\n\t\t}\n\n\t\tlet sendResult: AgentSendResult | undefined\n\t\tlet streamError: unknown\n\t\tconst streamAbortSignal = this.abortController?.signal\n\n\t\ttry {\n\t\t\t// 2. Lazy init context\n\t\t\tconst maybeShallowScope = this.syncScopeNode()\n\t\t\tassert(maybeShallowScope, \"Scope node must be found\")\n\t\t\tconst scopeNode = maybeShallowScope.isLoaded() ? maybeShallowScope : await maybeShallowScope.load()\n\t\t\tassert(scopeNode?.isLoaded(), \"Scope node must be loaded\")\n\n\t\t\tif (!this.ctx) {\n\t\t\t\tthis.ctx = await AgentContext.init(\n\t\t\t\t\tthis.dependencies,\n\t\t\t\t\tscopeNode,\n\t\t\t\t\tthis.nodeByIdCursorStoreState,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis.getLatestContextRuntimeState(),\n\t\t\t\t\t() => this.iterateAttachedFilesNewestFirst(),\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.ctx.updateScope(scopeNode)\n\t\t\tthis.ctx.updateTurnChangeset(changeset)\n\t\t\tthis.activeInteraction = interaction\n\t\t\tthis.initializeTreeResolver(this.ctx)\n\n\t\t\tthis.lifecycleHooks?.onContext?.(this.ctx)\n\t\t\t// Prepend initial context (fonts, vectors, components, colors, images) Context messages are\n\t\t\t// inserted before the user message for better LLM performance.\n\t\t\trequest.contextMessages = this.ctx.initialContextMessages()\n\n\t\t\tif (!existingRequest) {\n\t\t\t\t// Ensure failed/cancelled turns never leak metadata into the next turn.\n\t\t\t\tthis.ctx.completeTurn()\n\t\t\t}\n\n\t\t\t// Read selection/mention nodes from the data tree so references to nodes in unloaded\n\t\t\t// scopes (e.g. @-mentioned pages or components) still resolve.\n\t\t\tconst dataTree = this.dependencies.treeStore.getDataTreeOrPartialTree()\n\t\t\tconst collectionItemOverlaySelection = resolvedSelection.collectionItemOverlaySelection\n\t\t\tconst selectionForContext = getSelectionForContext(\n\t\t\t\tdataTree,\n\t\t\t\tresolvedSelection.selectionForContext,\n\t\t\t\tcollectionItemOverlaySelection?.collectionItemId,\n\t\t\t)\n\t\t\tconst contextSelectionNodes =\n\t\t\t\tresolvedSelection.selectionForContext.length > 0 ? dataTree.getNodes(resolvedSelection.selectionForContext) : []\n\n\t\t\tconst cmsSelectionsGroupedByCollection = mergeCmsSelectionGroupsWithCollectionItemOverlaySelection(\n\t\t\t\tthis.ctx.collections.groupCmsSelectionsByCollection(cmsTagSegments),\n\t\t\t\tcollectionItemOverlaySelection,\n\t\t\t)\n\n\t\t\tfor (const { collectionId } of this.ctx.collections.collectionsForCanvasSelection(contextSelectionNodes)) {\n\t\t\t\tthis.ctx.collections.registerVariables(collectionId)\n\t\t\t}\n\t\t\tfor (const { collectionId } of cmsSelectionsGroupedByCollection) {\n\t\t\t\tthis.ctx.collections.registerVariables(collectionId)\n\t\t\t}\n\n\t\t\tconst activeViewContext = this.ctx.activeViewContextMessage()\n\t\t\tif (activeViewContext) request.contextMessages.push(activeViewContext)\n\t\t\trequest.contextMessages.push(\n\t\t\t\t...(await this.ctx.selectionContextMessages(selectionForContext, cmsSelectionsGroupedByCollection)),\n\t\t\t)\n\t\t\tconst editorThemeMessage = this.ctx.editorThemeMessage()\n\t\t\tif (editorThemeMessage) request.contextMessages.push(editorThemeMessage)\n\t\t\tconst visibleUserInput = segmentsToTextContent(dataTree, request.parts).trim()\n\t\t\tinteraction.beginTurn({\n\t\t\t\tcontextMessages: request.contextMessages,\n\t\t\t\tvisibleInput: visibleUserInput,\n\t\t\t\tselectionIds: resolvedSelection.selectionForRequest ?? emptyArray(),\n\t\t\t\treasoningEffort: getReasoningForEffort(reasoningEffort, model),\n\t\t\t})\n\n\t\t\tthis.notifyChange()\n\n\t\t\tconst modelMessages = await transformHistoryToModelMessages(\n\t\t\t\tthis.advanceSummaryCompactionBoundary(model),\n\t\t\t\tthis.ctx,\n\t\t\t\tmodel,\n\t\t\t)\n\n\t\t\tconst { totalUsage, providerReportedCost, subModelCost, initialUsage, elapsedMs, ttftMs, responseMessages } =\n\t\t\t\tawait stream(\n\t\t\t\t\tchangeset,\n\t\t\t\t\tthis.dependencies.treeStore,\n\t\t\t\t\tscopeNode,\n\t\t\t\t\tthis.dependencies.scheduler,\n\t\t\t\t\tmodelMessages,\n\t\t\t\t\tthis.ctx,\n\t\t\t\t\t{\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\treasoningEffort,\n\t\t\t\t\t\tmaxSteps,\n\t\t\t\t\t\tabortSignal: streamAbortSignal,\n\t\t\t\t\t\tonPart: (part, persist) => {\n\t\t\t\t\t\t\tif (streamAbortSignal?.aborted) return\n\n\t\t\t\t\t\t\tconst messageUpdater = this.onPart(request, part)\n\n\t\t\t\t\t\t\tif (persist !== false) {\n\t\t\t\t\t\t\t\tconst responsePart = getFlatAssistantResponsePart(part)\n\t\t\t\t\t\t\t\tif (responsePart) this.appendAssistantResponsePart(request, responsePart)\n\n\t\t\t\t\t\t\t\tif (isCommand(responsePart)) {\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tui: messageUpdater,\n\t\t\t\t\t\t\t\t\t\tresponse: (fn: (current: Command, timestamp: number) => Partial<Command>) => {\n\t\t\t\t\t\t\t\t\t\t\tif (!responsePart) return\n\t\t\t\t\t\t\t\t\t\t\tObject.assign(responsePart, fn(responsePart, this.getCurrentTurnTimestamp()))\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (part.type === \"tool-result\") this.appendOrCreateToolResultPart(request, part)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tui: messageUpdater,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonPrepareStep: () => {\n\t\t\t\t\t\t\tif (streamAbortSignal?.aborted) return undefined\n\t\t\t\t\t\t\t// `prepareStep` starts a new step boundary. Cursor metadata is intentionally captured\n\t\t\t\t\t\t\t// as the beginning-of-step state.\n\t\t\t\t\t\t\tthis.pushAssistantResponseForCurrentStep(request)\n\t\t\t\t\t\t\treturn this.lifecycleHooks?.onPrepareStep?.()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonContext: context => this.lifecycleHooks?.onContext?.(context),\n\t\t\t\t\t\tonCodeFileHistoryChanges: changes => {\n\t\t\t\t\t\t\tcodeFileChanges.push(...changes)\n\t\t\t\t\t\t\tthis.notifyChange()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonStepFinish: async stepContext => {\n\t\t\t\t\t\t\tconst step = this.findLastActiveAssistantResponse(request)\n\t\t\t\t\t\t\tif (!step) {\n\t\t\t\t\t\t\t\tassert(streamAbortSignal?.aborted, \"Eval step hook requires a current tool step\")\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tstep.metadata.providerMetadata = stepContext.providerMetadata\n\t\t\t\t\t\t\tstep.metadata.usage = stepContext.usage\n\t\t\t\t\t\t\tthis.captureStepAfterCrdtMarkers(step)\n\t\t\t\t\t\t\treturn this.lifecycleHooks?.onStepFinish?.(this)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...this.createInteractionStreamLifecycleHooks(interaction),\n\t\t\t\t\t\tonInputEstimate: estimatedTokens => {\n\t\t\t\t\t\t\tupdateTurnContextUsage(estimatedTokens, \"estimated\")\n\t\t\t\t\t\t\tthis.lifecycleHooks?.onInputEstimate?.(estimatedTokens)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonStepUsage: stepUsage => {\n\t\t\t\t\t\t\tif (stepUsage.inputTokens === undefined) return\n\t\t\t\t\t\t\tupdateTurnContextUsage(stepUsage.inputTokens, \"actual\")\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonParseError: (line, error) => {\n\t\t\t\t\t\t\tthis.lifecycleHooks?.onParseError?.(line, error)\n\t\t\t\t\t\t\tthis.appendAssistantResponsePart(request, { type: \"command-error\", raw: line })\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonCommandReceived: this.lifecycleHooks?.onCommandReceived?.bind(this),\n\t\t\t\t\t\tonCommandApplied: this.lifecycleHooks?.onCommandApplied?.bind(this),\n\t\t\t\t\t\tonCommandFailed: (raw, error) => this.lifecycleHooks?.onCommandFailed?.(raw, error),\n\t\t\t\t\t\tonUpdateNodes: this.lifecycleHooks?.onUpdateNodes?.bind(this),\n\t\t\t\t\t\tonCaptureScreenshots: this.lifecycleHooks?.onCaptureScreenshots?.bind(this),\n\t\t\t\t\t\tonTrainingStep: this.lifecycleHooks?.onTrainingStep?.bind(this.lifecycleHooks),\n\t\t\t\t\t\twaitForUserAnswers: turnOptions?.waitForUserAnswers ?? (() => this.handleClarificationNeeded()),\n\t\t\t\t\t\ttraceConfig: {\n\t\t\t\t\t\t\t...this.traceConfig,\n\t\t\t\t\t\t\tstep: \"message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: this.dependencies.source,\n\t\t\t\t\t\tagentInteraction: interaction,\n\t\t\t\t\t\traindropEventId: interaction.traceEventId(),\n\t\t\t\t\t\traindropTelemetryOptions: interaction.telemetryOptions(),\n\t\t\t\t\t\tturnId: request.id,\n\t\t\t\t\t\taiServiceMetaUserPrompt: visibleUserInput,\n\t\t\t\t\t\tqueue: commandQueue,\n\t\t\t\t\t\tdisableRaindropTelemetry: turnOptions?.disableRaindropTelemetry,\n\t\t\t\t\t\trequestCodeFileChangesExecutor: turnOptions?.requestCodeFileChangesExecutor,\n\t\t\t\t\t\tscriptEvalInstrumentation: turnOptions?.scriptEvalInstrumentation,\n\t\t\t\t\t},\n\t\t\t\t)\n\n\t\t\tconst resolvedCost = resolveAgentTurnUsdCost(providerReportedCost, subModelCost, model, totalUsage)\n\t\t\tconst previousTotalUsage = this.usage.at(-1)\n\t\t\tif (log.level <= LogLevel.Debug) {\n\t\t\t\tlogStepUsage(log, totalUsage, previousTotalUsage, \"\uD83C\uDFC1 Agent result\", elapsedMs, resolvedCost)\n\t\t\t}\n\n\t\t\tthis.usage.push(totalUsage)\n\t\t\trequest.usage = totalUsage\n\t\t\trequest.initialUsage = initialUsage\n\t\t\trequest.cost = resolvedCost\n\t\t\trequest.elapsedMs = elapsedMs\n\t\t\trequest.ttftMs = ttftMs\n\n\t\t\t// Add a final summary message if the last message is not a summary.\n\t\t\tconst lastMessage = request.state.messages[request.state.messages.length - 1]\n\t\t\tif (lastMessage?.type !== \"text\") {\n\t\t\t\tthis.onPart(request, { type: \"text\", text: \"Done.\" })\n\t\t\t}\n\t\t\tassert(this.ctx, \"Context must exist after a successful stream\")\n\t\t\tconst lastToolStep = request.steps.at(-1)\n\t\t\tif (lastToolStep) this.captureStepAfterCrdtMarkers(lastToolStep)\n\n\t\t\tsendResult = {\n\t\t\t\trequest,\n\t\t\t\tresponseMessages,\n\t\t\t}\n\t\t} catch (error) {\n\t\t\trequest.aborted = toAgentRequestError(error)\n\t\t\tstreamError = error\n\t\t} finally {\n\t\t\t// Mark request as finished, and record the changeset, even if an error occurred. User\n\t\t\t// could choose to revert the changes from the UI. Error is thrown to the caller to handle.\n\t\t\trequest.done = true\n\t\t\tthis.activeInteraction = undefined\n\n\t\t\ttry {\n\t\t\t\t// DSL commands are applied asynchronously via `LockQueue`; drain them before we snapshot\n\t\t\t\t// issues for telemetry or call `issues.completeTurn()`, so late handlers cannot mutate\n\t\t\t\t// state after the turn is finalized.\n\t\t\t\tawait commandQueue.synchronize()\n\n\t\t\t\tconst inputTokens = getTrackedInputTokens(turnContextUsage)\n\t\t\t\tif (sendResult) {\n\t\t\t\t\tassert(this.ctx, \"Context must exist after a successful stream\")\n\t\t\t\t\tthis.appendSummaryPart(request)\n\t\t\t\t\t// Prior turns with pending-redo state are no longer the latest and can never\n\t\t\t\t\t// be redone. Clear only after the new turn succeeds so that if it fails and\n\t\t\t\t\t// the user undoes it, the previous turn's redo state is still intact.\n\t\t\t\t\tthis.clearStaleRevertedChanges()\n\t\t\t\t\tvoid interaction.recordTurnOutcome({\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tfinishReason: \"completed\",\n\t\t\t\t\t\tissues: this.ctx.issues,\n\t\t\t\t\t\tinputTokens,\n\t\t\t\t\t})\n\t\t\t\t\tthis.ctx.issues.completeTurn()\n\t\t\t\t\tthis.notifyChange()\n\t\t\t\t} else if (streamError !== undefined) {\n\t\t\t\t\tconst finishReason =\n\t\t\t\t\t\tisUserStopError(streamError) || isQueueInterruptedError(streamError) ? \"cancelled\" : \"error\"\n\t\t\t\t\tvoid interaction.recordTurnOutcome({\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tfinishReason,\n\t\t\t\t\t\tissues: this.ctx?.issues,\n\t\t\t\t\t\tinputTokens,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\tstreamError instanceof Error && !isUserStopError(streamError) && !isQueueInterruptedError(streamError)\n\t\t\t\t\t\t\t\t? streamError\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t})\n\t\t\t\t\tthis.ctx?.issues.completeTurn()\n\t\t\t\t}\n\n\t\t\t\tif (!turnOptions?.skipHistoryCommit) {\n\t\t\t\t\tawait this.dependencies.scheduler.scheduleAgentChanges(\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.dependencies.treeStore.timeline.replayChangeset(changeset)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ addToHistory: true },\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Begin recording a summary of the conversation history up-to-and-including the current turn.\n\t\t\t\t// It will be used after the threshold of turns has passed.\n\t\t\t\tif (this.ctx && !turnOptions?.skipSummaryGeneration) {\n\t\t\t\t\tthis.updateSummary(request, this.ctx)\n\t\t\t\t}\n\n\t\t\t\tthis.captureCrdtSnapshotAfterTurnFinalization(request)\n\t\t\t} catch (cleanupError) {\n\t\t\t\tlog.reportError(cleanupError)\n\t\t\t}\n\t\t}\n\n\t\tif (streamError !== undefined) {\n\t\t\tthrow streamError\n\t\t}\n\t\tassert(sendResult, \"Expected stream result after successful send\")\n\t\treturn sendResult\n\t}\n\n\tprivate createEmptyAssistantResponse(part?: AssistantResponsePart): ToolStep {\n\t\treturn {\n\t\t\tcontent: part ? [part] : [],\n\t\t\ttoolResults: [],\n\t\t\traw: [],\n\t\t\tmetadata: {},\n\t\t}\n\t}\n\n\tprivate appendOrCreateToolResultPart(request: AgentRequest, part: Extract<ChatPart, { type: \"tool-result\" }>): void {\n\t\tconst lastAssistantResponse =\n\t\t\tthis.findLastActiveAssistantResponse(request) ?? this.pushAssistantResponseForCurrentStep(request)\n\t\tlastAssistantResponse.toolResults.push(part.content)\n\t}\n\n\tprivate appendSummaryPart(request: AgentRequest): void {\n\t\tassert(this.ctx, \"Context must exist before appending summary\")\n\t\tconst changes = buildAgentSummaryForRequest(request, this.ctx)\n\t\tif (changes.length === 0) return\n\n\t\trequest.state.messages.push({\n\t\t\ttype: \"changes\",\n\t\t\tchanges,\n\t\t\ttimestamp: this.getCurrentTurnTimestamp(),\n\t\t})\n\t\tthis.notifyChange()\n\t}\n\n\t// Deserialize stream string into parts that are stored\n\t// content\n\tprivate appendAssistantResponsePart(request: AgentRequest, part: FlatAssistantResponsePart): ToolStep {\n\t\tconst lastAssistantResponse = this.findLastActiveAssistantResponse(request)\n\t\tassert(lastAssistantResponse, \"Last assistant response must exist\")\n\n\t\tconst result = updateOrAppendPart(lastAssistantResponse.content.at(-1), part)\n\t\tswitch (result.op) {\n\t\t\tcase \"update\":\n\t\t\t\tlastAssistantResponse.content.splice(-1, 1, result.value)\n\t\t\t\tbreak\n\t\t\tcase \"append\":\n\t\t\t\tlastAssistantResponse.content.push(result.value)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(result.op, \"Invalid operation\")\n\t\t}\n\n\t\treturn lastAssistantResponse\n\t}\n\n\tprivate findLastActiveAssistantResponse(request: AgentRequest): ToolStep | undefined {\n\t\treturn request.steps?.at(-1)\n\t}\n\n\tprivate pushAssistantResponseForCurrentStep(request: AgentRequest, part?: AssistantResponsePart): ToolStep {\n\t\tconst previousStep = this.findLastActiveAssistantResponse(request)\n\t\tif (previousStep) this.captureStepAfterCrdtMarkers(previousStep)\n\t\tconst response = this.createEmptyAssistantResponse(part)\n\t\tresponse.metadata.beforeMessageCount = request.state.messages.length\n\t\tthis.captureStepBeforeCrdtMarkers(response)\n\t\trequest.steps.push(response)\n\t\treturn response\n\t}\n\n\tprivate updateSummary(turn: AgentRequest, ctx: AgentContext) {\n\t\tconst summaryPromise = summarizeRequests(this.history, ctx, this.traceConfig).catch(() => undefined)\n\t\tturn.summary = summaryPromise\n\t\tvoid summaryPromise.then(summary => {\n\t\t\tif (turn.summary !== summaryPromise) return\n\t\t\tif (summary === undefined) {\n\t\t\t\tturn.summary = undefined\n\t\t\t} else {\n\t\t\t\tturn.summary = summary\n\t\t\t\tthis.notifyChange()\n\t\t\t\tthis.estimateContextUsageAfterCompaction()\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate estimateContextUsageAfterCompaction(): void {\n\t\tif (this.isBusy) return\n\n\t\tconst currentUsage = this._contextUsage\n\t\tif (!currentUsage) return\n\n\t\tconst estimatedInputTokens = estimatePostCompactionInputTokens(this.history, currentUsage.model)\n\t\tif (estimatedInputTokens === undefined) return\n\n\t\tthis.updateContextUsage(currentUsage.model, estimatedInputTokens, \"estimated\")\n\t}\n\n\t/**\n\t * Restore an estimated context usage from persisted history when no usage is available,\n\t * e.g. after hydrating a chat agent from a snapshot.\n\t */\n\tprivate estimateContextUsageFromHistory(): void {\n\t\tif (this.history.length === 0) return\n\t\tif (this._contextUsage) return\n\n\t\tconst latestInputTokens = getLatestInputTokensFromHistory(this.history)\n\t\tif (latestInputTokens === undefined) return\n\n\t\tconst lastRequest = this.history[this.history.length - 1]\n\t\tconst model = lastRequest?.model ?? defaultAgentModel\n\t\tconst estimatedPostCompaction = estimatePostCompactionInputTokens(this.history, model)\n\n\t\tthis.updateContextUsage(model, estimatedPostCompaction ?? latestInputTokens, \"estimated\")\n\t}\n\n\tprivate advanceSummaryCompactionBoundary(model: LanguageModel): readonly AgentRequest[] {\n\t\tconst requestIds = getRequestIdsToAdvanceSummaryCompactionBoundary(this.history, model)\n\t\tif (requestIds.size === 0) return this.history\n\n\t\tfor (const request of this.history) {\n\t\t\tif (!requestIds.has(request.id)) continue\n\t\t\trequest.summarizedForContext = true\n\t\t}\n\n\t\treturn this.history\n\t}\n\n\tprivate initializeTreeResolver(ctx: AgentContext): void {\n\t\tconst canvasIdByLLMId = collectLlmToCanvasMappingsFromHistory(this.history)\n\n\t\tctx.treeResolver.init(canvasIdByLLMId)\n\t}\n\n\t/**\n\t * Yields attached files newest-first across the full request history. Consumers (e.g. the\n\t * script bridge) iterate and stop on the first id/name match, so duplicate filenames across\n\t * turns transparently resolve to the most recently attached file.\n\t */\n\tprivate *iterateAttachedFilesNewestFirst(): Iterable<AgentAttachmentFile> {\n\t\tfor (let i = this.history.length - 1; i >= 0; i--) {\n\t\t\tconst historyRequest = this.history[i]\n\t\t\tif (!historyRequest) continue\n\t\t\tyield* historyRequest.files\n\t\t}\n\t}\n\n\tprivate get crdtTimeline(): CrdtTreeCommitter | undefined {\n\t\tconst { treeStore } = this.dependencies\n\t\tif (treeStore.mode !== \"crdt\") return undefined\n\t\treturn treeStore.crdtTimeline\n\t}\n\n\tprivate captureStepBeforeCrdtMarkers(step: ToolStep): void {\n\t\tconst timeline = this.crdtTimeline\n\t\tif (!timeline) return\n\n\t\tconst beforeRowIndex = timeline.store.length\n\t\tconst crdtSnapshot = {\n\t\t\t...step.metadata.crdtSnapshot,\n\t\t\tbeforeRowIndex,\n\t\t}\n\t\tstep.metadata.crdtSnapshot = crdtSnapshot\n\t}\n\n\tprivate captureStepAfterCrdtMarkers(step: ToolStep): void {\n\t\tconst timeline = this.crdtTimeline\n\t\tif (!timeline) return\n\t\tconst runtimeState = this.getCurrentContextRuntimeState()\n\n\t\tconst crdtSnapshot = {\n\t\t\t...step.metadata.crdtSnapshot,\n\t\t}\n\t\tif (crdtSnapshot.afterRowIndex === undefined) crdtSnapshot.afterRowIndex = timeline.store.length\n\t\tif (!crdtSnapshot.afterRuntimeState && runtimeState) {\n\t\t\tcrdtSnapshot.afterRuntimeState = cloneContextRuntimeState(runtimeState)\n\t\t}\n\t\tstep.metadata.crdtSnapshot = crdtSnapshot\n\t}\n\n\tprivate captureCrdtSnapshotAfterTurnFinalization(request: AgentRequest): void {\n\t\tconst timeline = this.crdtTimeline\n\t\tif (!timeline) {\n\t\t\trequest.crdtSnapshot = undefined\n\t\t\treturn\n\t\t}\n\n\t\tconst endRowIndex = timeline.store.length\n\n\t\t// Context initialization can fail before runtime state exists; in that case there is no\n\t\t// replayable turn snapshot to persist, and cleanup should preserve the original error.\n\t\tif (!this.ctx) {\n\t\t\trequest.crdtSnapshot = undefined\n\t\t\treturn\n\t\t}\n\n\t\tconst turnRuntimeState = this.getContextRuntimeState()\n\n\t\tfor (const [index, step] of request.steps.entries()) {\n\t\t\tconst nextStep = request.steps[index + 1]\n\t\t\tconst crdtSnapshot = {\n\t\t\t\t...step.metadata.crdtSnapshot,\n\t\t\t}\n\t\t\tif (crdtSnapshot.afterRowIndex === undefined) {\n\t\t\t\tcrdtSnapshot.afterRowIndex = nextStep?.metadata.crdtSnapshot?.beforeRowIndex ?? endRowIndex\n\t\t\t}\n\t\t\tif (!crdtSnapshot.afterRuntimeState) crdtSnapshot.afterRuntimeState = cloneContextRuntimeState(turnRuntimeState)\n\t\t\tstep.metadata.crdtSnapshot = crdtSnapshot\n\t\t}\n\n\t\tif (!this.evalCrdtBaseCapture) {\n\t\t\tthis.evalCrdtBaseCapture = {\n\t\t\t\tbase: timeline.store.toBuffer(),\n\t\t\t\tbaseRowIndex: timeline.store.length,\n\t\t\t}\n\t\t}\n\n\t\trequest.crdtSnapshot = {\n\t\t\tturnEndRowIndex: endRowIndex,\n\t\t}\n\t}\n\n\tprivate getCurrentContextRuntimeState(): ContextRuntimeState | undefined {\n\t\treturn this.ctx?.getRuntimeState() ?? this.getLatestContextRuntimeState()\n\t}\n\n\tprivate getLatestContextRuntimeState(): ContextRuntimeState | undefined {\n\t\tfor (let index = this.history.length - 1; index >= 0; index--) {\n\t\t\tconst steps = this.history[index]?.steps\n\t\t\tif (!steps) continue\n\n\t\t\tfor (let stepIndex = steps.length - 1; stepIndex >= 0; stepIndex--) {\n\t\t\t\tconst runtimeState = steps[stepIndex]?.metadata.crdtSnapshot?.afterRuntimeState\n\t\t\t\tif (runtimeState) return cloneContextRuntimeState(runtimeState)\n\t\t\t}\n\t\t}\n\t\treturn undefined\n\t}\n\n\tgetLastUserMessage(): AgentRequest | undefined {\n\t\treturn this.history[this.history.length - 1]\n\t}\n\n\tretryLastRequest(): AgentRequest | undefined {\n\t\tconst lastRequest = this.getLastUserMessage()\n\t\tif (!lastRequest) return undefined\n\n\t\tconst nextLastRequest: AgentRequest = { ...lastRequest, aborted: undefined }\n\t\tthis.history[this.history.length - 1] = nextLastRequest\n\t\tthis.state = this.history.length > 1 ? \"follow-up\" : \"idle\"\n\t\tthis.notifyChange()\n\t\treturn nextLastRequest\n\t}\n\n\tsubmitClarification(answers: ClarificationAnswer[]): void {\n\t\tconst request = this.getLastUserMessage()\n\t\tassert(request, \"Request must exist\")\n\n\t\tassert(this.clarificationResolver, \"No pending clarification to submit\")\n\t\tconst { resolve } = this.clarificationResolver\n\t\tthis.clarificationResolver = null\n\t\tthis.state = \"generating\"\n\t\tresolve(answers)\n\t}\n\n\tprivate handleClarificationNeeded(): Promise<ClarificationAnswer[]> {\n\t\tthis.state = \"waiting-for-clarification\"\n\t\tthis.cancelClarification()\n\t\treturn new Promise<ClarificationAnswer[]>((resolve, reject) => {\n\t\t\tthis.clarificationResolver = { resolve, reject }\n\t\t})\n\t}\n\n\tprivate cancelClarification(cause?: symbol): void {\n\t\tif (!this.clarificationResolver) return\n\t\tthis.clarificationResolver.reject(new Error(\"Clarification cancelled\", cause ? { cause } : undefined))\n\t\tthis.clarificationResolver = null\n\t}\n\n\tprivate onPart<T extends ChatPart>(request: AgentRequest, part: T): ChatPartUpdater<T> {\n\t\tconst baseMessage: Pick<TransientTurnMessage, \"timestamp\"> = {\n\t\t\ttimestamp: this.getCurrentTurnTimestamp(),\n\t\t}\n\n\t\tlet notify = true\n\t\tswitch (part.type) {\n\t\t\tcase \"clarification\":\n\t\t\tcase \"read\":\n\t\t\tcase \"command\":\n\t\t\tcase \"blocking-task\":\n\t\t\tcase \"scripting\":\n\t\t\tcase \"code-agent-status\": {\n\t\t\t\tconst last = request.state.messages.at(-1)\n\t\t\t\tif (last?.type === part.type && diffValues(last, { ...last, ...part }) === null) {\n\t\t\t\t\t// Deduplicate back-to-back identical messages. Return noop so callers cannot\n\t\t\t\t\t// patch the stored original (e.g. marking it failed on behalf of the duplicate).\n\t\t\t\t\treturn noop\n\t\t\t\t}\n\t\t\t\trequest.state.messages.push({ ...baseMessage, ...part })\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"text\":\n\t\t\tcase \"thinking\":\n\t\t\tcase \"design-plan\":\n\t\t\tcase \"annotation\":\n\t\t\tcase \"create-component\":\n\t\t\tcase \"step\": {\n\t\t\t\tconst last = request.state.messages.at(-1)\n\n\t\t\t\t// Some models emit reasoning-end only when the full stream terminates\n\t\t\t\t// rather than when reasoning actually completes. Drop empty thinking\n\t\t\t\t// completions that arrive after a non-thinking part \u2014 they are stale\n\t\t\t\t// and would render as empty thinking bubbles.\n\t\t\t\tif (part.type === \"thinking\" && part.complete && !part.text && last?.type !== \"thinking\") {\n\t\t\t\t\treturn noop\n\t\t\t\t}\n\n\t\t\t\tif (last?.type === part.type && !getComplete(last)) {\n\t\t\t\t\tconst text = (last.text ?? \"\") + (part.text ?? \"\")\n\t\t\t\t\t// If the message is not complete, update the last message, otherwise fall through to\n\t\t\t\t\t// append a new message.\n\t\t\t\t\trequest.state.messages[request.state.messages.length - 1] = {\n\t\t\t\t\t\t...last,\n\t\t\t\t\t\ttype: part.type,\n\t\t\t\t\t\tcomplete: getComplete(part, text),\n\t\t\t\t\t\ttext: appendEllipsisToStep(part.type, text, part.complete),\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Ignore repeat updates.\n\t\t\t\t\tconst complete = getComplete(part)\n\t\t\t\t\tconst raw = appendEllipsisToStep(part.type, part.text ?? \"\", complete)\n\t\t\t\t\tif (last?.type === part.type && last.text === raw) return noop\n\n\t\t\t\t\trequest.state.messages.push({\n\t\t\t\t\t\t...baseMessage,\n\t\t\t\t\t\ttype: part.type,\n\t\t\t\t\t\ttext: raw,\n\t\t\t\t\t\tcomplete,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"script-read\":\n\t\t\tcase \"code-patch\":\n\t\t\t\trequest.state.messages.push({ ...baseMessage, ...part })\n\t\t\t\tbreak\n\t\t\tcase \"tool-call\":\n\t\t\tcase \"command-error\":\n\t\t\tcase \"tool-result\":\n\t\t\tcase \"changes\":\n\t\t\tcase \"invalid-tool-call\":\n\t\t\t\t// Omit.\n\t\t\t\tnotify = false\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(part, \"Invalid part type\")\n\t\t}\n\n\t\tconst index = request.state.messages.length - 1\n\t\tthis.updateTrackedAssistantOutput(request)\n\t\tthis.activateOverlayForCommand(part, true)\n\t\tif (notify) this.notifyChange()\n\n\t\treturn fn => {\n\t\t\tconst currentMessage = request.state.messages[index]\n\t\t\tassert(currentMessage, \"Message must exist\")\n\t\t\tassert(isSamePartType(part, currentMessage), \"Message must match updater part type\")\n\t\t\tObject.assign(currentMessage, fn(currentMessage, this.getCurrentTurnTimestamp()))\n\t\t\tthis.activateOverlayForCommand(currentMessage)\n\t\t\tthis.updateTrackedAssistantOutput(request)\n\t\t\tthis.followScopeForPart(currentMessage)\n\t\t\tthis.notifyChange()\n\t\t}\n\t}\n\n\tprivate activateOverlayForCommand(message: ChatPart, before: boolean = false): void {\n\t\tif (message.type !== \"command\") return\n\n\t\tconst engine = this.dependencies.hooks.getEngine()\n\t\tif (!this.ctx || !engine) return\n\n\t\tconst targetNode = getCommandOverlayTargetNode(message.command, this.ctx, before)\n\t\tif (!targetNode) return\n\n\t\tconst overlayNode = isFixedOrRelativeOverlay(targetNode)\n\t\t\t? targetNode\n\t\t\t: this.ctx.treeResolver.getAncestorsFor(targetNode.id).find(isFixedOrRelativeOverlay)\n\n\t\tif (overlayNode) {\n\t\t\tconst overlayScopeNode = this.ctx.treeResolver.getScopeNodeFor(overlayNode.id)\n\t\t\tconst isOutOfScope =\n\t\t\t\toverlayScopeNode &&\n\t\t\t\toverlayScopeNode.id !== this.dependencies.getActiveScopeId() &&\n\t\t\t\t!this.dependencies.isFollowModeEnabled()\n\n\t\t\tif (!isOutOfScope) {\n\t\t\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t\t\tengine.stores.overlayStore.showOverlay(engine.stores.selectionStore, overlayNode, overlayNode.parentid, false)\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tengine.stores.overlayStore.hideAll()\n\t\t})\n\t}\n\n\tprivate updateTrackedAssistantOutput(request: AgentRequest): void {\n\t\tconst interaction = this.activeInteraction\n\t\tif (!interaction) return\n\n\t\tconst output = request.state.messages\n\t\t\t.flatMap(message => (message.type === \"text\" ? [message.text.trim()] : []))\n\t\t\t.filter(text => text.length > 0)\n\t\t\t.join(\"\\n\\n\")\n\n\t\tinteraction.recordVisibleOutput(output)\n\t}\n\n\tprivate updateContextUsage(model: LanguageModel, inputTokens: number, source: AgentContextUsageSource): void {\n\t\tconst next: AgentContextUsage = {\n\t\t\tmodel,\n\t\t\tinputTokens,\n\t\t\tsource,\n\t\t}\n\n\t\tif (\n\t\t\tthis._contextUsage?.model === next.model &&\n\t\t\tthis._contextUsage.inputTokens === next.inputTokens &&\n\t\t\tthis._contextUsage.source === next.source\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tthis._contextUsage = next\n\t\tthis.notifyChange()\n\t}\n\n\tprivate followScopeForPart(part: ChatPart): void {\n\t\tif (!this.dependencies.isFollowModeEnabled()) return\n\t\tconst scopeId = getScopeIdFromPart(part)\n\t\tif (scopeId) this.dependencies.selectScopeByAgent(scopeId)\n\t}\n\n\tprivate getCurrentTurnTimestamp(): number {\n\t\tconst turnClock = this.turnClock ?? createTurnClock()\n\t\tif (!this.turnClock) this.turnClock = turnClock\n\t\treturn turnClock.wallClockBaseMs + (performance.now() - turnClock.monotonicBaseMs)\n\t}\n\n\tprivate reset(empty: boolean): void {\n\t\tthis.state = empty ? \"idle\" : \"follow-up\"\n\t\tif (!empty) return\n\n\t\tthis.history = []\n\t\tthis._contextUsage = undefined\n\t\tthis.nodeByIdCursorStoreState = createNodeByIdCursorStoreState()\n\t\tthis.evalCrdtBaseCapture = undefined\n\n\t\t// Reset context so next send() captures latest state\n\t\tthis.ctx = null\n\n\t\t// Invalidate any pending title generation\n\t\tthis.titleGenerationId++\n\t}\n\n\t/**\n\t * Stop the agent no matter what state it is in.\n\t */\n\tasync stop(): Promise<void> {\n\t\tswitch (this.state) {\n\t\t\tcase \"generating\":\n\t\t\tcase \"waiting-for-clarification\":\n\t\t\t\tthis.cancel()\n\t\t\t\tbreak\n\t\t\tcase \"follow-up\":\n\t\t\tcase \"idle\":\n\t\t\tcase \"error\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(this.state, \"Invalid agent state\")\n\t\t}\n\n\t\tawait this.waitForTurnEnd()\n\t}\n\n\tprivate async waitForTurnEnd(): Promise<void> {\n\t\tconst turnPromise = this.currentTurnPromise\n\t\tif (!turnPromise) return\n\n\t\ttry {\n\t\t\tawait turnPromise\n\t\t} catch (error) {\n\t\t\tlog.reportError(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cancel the current turn if it's generating.\n\t */\n\tcancel() {\n\t\tthis.abortTurn(userStopError)\n\t}\n\n\tprivate abortTurn(cause?: symbol): void {\n\t\tthis.cancelClarification(cause)\n\t\tthis.abortController?.abort(new Error(\"Turn cancelled\", { cause }))\n\t}\n\n\t/**\n\t * Revert the agent to the previous state, discarding the last user-assistant message pair if generating.\n\t */\n\tundo(): Promise<void> {\n\t\treturn this.revert(\"last\")\n\t}\n\n\t/**\n\t * Rewind the conversation back to (and discarding) `request`. All requests at or after\n\t * `request` are removed from history and their document changes are reverted in reverse\n\t * order. Used by the user-bubble revert button.\n\t */\n\tasync revertUntil(request: AgentRequest): Promise<readonly AgentRequest[]> {\n\t\tawait this.revert(\"until\", request)\n\t\treturn this.history\n\t}\n\n\t/**\n\t * Revert only the document and code-file changes produced by `request`, leaving the\n\t * conversation history intact. The reverted state is recorded on the request so it can\n\t * later be redone via {@link reapplyRequestChanges}.\n\t *\n\t * Restricted to the latest turn: reverting an earlier turn while later turns are still in\n\t * place would leave the tree in an inconsistent state (later changesets may reference\n\t * nodes this revert would remove). The UI enforces this via `isLatestTurn`; the assert\n\t * here is the API-level backstop.\n\t */\n\tasync revertRequestChanges(request: AgentRequest): Promise<void> {\n\t\tassert(\n\t\t\trequest.id === this.history[this.history.length - 1]?.id,\n\t\t\t\"revertRequestChanges is only valid on the latest turn\",\n\t\t)\n\n\t\tconst changesets = request.changeset\n\t\tconst codeFileChanges = request.codeFileChanges\n\t\tif (!changesets?.length && !codeFileChanges?.length) return\n\n\t\t// Pre-flight: detect update_file changes whose live save no longer matches the version\n\t\t// this request produced (because of manual or later edits). Walk in reverse so that\n\t\t// chained updates on the same file see the simulated post-revert state of later entries.\n\t\tconst skippedIndices = new Set<number>()\n\t\tconst simulatedExpected = new Map<LocalModuleId, ModuleSaveReference>()\n\t\tfor (let i = (codeFileChanges?.length ?? 0) - 1; i >= 0; i--) {\n\t\t\tconst change = codeFileChanges![i]\n\t\t\tif (change?.operation !== \"update_file\") continue\n\t\t\tlet expected = simulatedExpected.get(change.localId)\n\t\t\tif (!expected) {\n\t\t\t\tconst persisted = this.dependencies.modulesStore.getPersistedModuleByLocalId(change.localId)\n\t\t\t\tif (!persisted) {\n\t\t\t\t\tskippedIndices.add(i)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texpected = { moduleId: persisted.id, saveId: persisted.saveId }\n\t\t\t}\n\t\t\tif (expected.moduleId !== change.moduleId || expected.saveId !== change.saveId) {\n\t\t\t\tskippedIndices.add(i)\n\t\t\t} else {\n\t\t\t\tsimulatedExpected.set(change.localId, { moduleId: change.moduleId, saveId: change.saveIdBeforeChange })\n\t\t\t}\n\t\t}\n\n\t\tawait this.discardRequestChanges(request, new Map<LocalModuleId, ModuleSaveReference>())\n\n\t\t// Bucket each change into \"reverted\" (captured for redo) vs \"remaining\" (skipped due\n\t\t// to drift; left in place so the request still reflects the live document).\n\t\tconst revertedCodeFileChanges: RequestCodeFileHistoryChange[] = []\n\t\tconst remainingCodeFileChanges: RequestCodeFileHistoryChange[] = []\n\t\tfor (let i = 0; i < (codeFileChanges?.length ?? 0); i++) {\n\t\t\tconst change = codeFileChanges![i]\n\t\t\tif (!change) continue\n\t\t\tif (change.operation === \"update_file\" && skippedIndices.has(i)) {\n\t\t\t\tremainingCodeFileChanges.push(change)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (change.operation === \"create_file\") {\n\t\t\t\t// Reverting a created file is intentionally a no-op; keep it in the request so\n\t\t\t\t// it stays associated with the turn but don't mark it as reverted.\n\t\t\t\tremainingCodeFileChanges.push(change)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst persisted = this.dependencies.modulesStore.getPersistedModuleByLocalId(change.localId)\n\t\t\tif (persisted && persisted.id === change.moduleId) {\n\t\t\t\trevertedCodeFileChanges.push({ ...change, saveIdAfterRevert: persisted.saveId })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\trevertedCodeFileChanges.push(change)\n\t\t}\n\n\t\tObject.assign(request, {\n\t\t\trevertedChangeset: changesets ?? [],\n\t\t\trevertedCodeFileChanges,\n\t\t\tchangeset: [],\n\t\t\tcodeFileChanges: remainingCodeFileChanges,\n\t\t} satisfies Partial<AgentRequest>)\n\t\tthis.notifyChange()\n\t}\n\n\tasync reapplyRequestChanges(request: AgentRequest): Promise<void> {\n\t\tconst changesets = request.revertedChangeset\n\t\tconst codeFileChanges = request.revertedCodeFileChanges\n\t\tif (!changesets?.length && !codeFileChanges?.length) return\n\n\t\tif (changesets?.length) {\n\t\t\tawait this.replayChangesets(changesets)\n\t\t}\n\t\tawait reapplyCodeFileHistoryChanges(this.dependencies.modulesStore, codeFileChanges)\n\t\tObject.assign(request, {\n\t\t\tchangeset: changesets ?? [],\n\t\t\tcodeFileChanges: codeFileChanges ?? [],\n\t\t\trevertedChangeset: [],\n\t\t\trevertedCodeFileChanges: [],\n\t\t} satisfies Partial<AgentRequest>)\n\t\tthis.notifyChange()\n\t}\n\n\tasync revertMessageUntil(request: AgentRequest): Promise<readonly AgentRequest[]> {\n\t\tawait this.revert(\"until\", request, true)\n\t\treturn this.history\n\t}\n\n\tprivate async discardRequestChanges(\n\t\trequest: AgentRequest,\n\t\texpectedCurrentVersionByLocalId: Map<LocalModuleId, ModuleSaveReference>,\n\t): Promise<void> {\n\t\tconst changesets = request.changeset\n\t\tif (changesets?.length) {\n\t\t\tawait this.discardChangesets(changesets)\n\t\t}\n\t\t// Modules are driven by the service rather than the tree, so we cannot atomically\n\t\t// revert a module save together with the tree changes. This is a deliberate\n\t\t// compromise: if one step succeeds and the other fails, the document may be\n\t\t// temporarily desynchronized, but the two histories still stay roughly aligned.\n\t\tawait revertCodeFileHistoryChanges(\n\t\t\tthis.dependencies.modulesStore,\n\t\t\trequest.codeFileChanges,\n\t\t\texpectedCurrentVersionByLocalId,\n\t\t)\n\t}\n\n\tprivate async discardChangesets(changesets: readonly Changeset[]): Promise<void> {\n\t\tawait this.dependencies.scheduler.scheduleAgentChanges(\n\t\t\t() => {\n\t\t\t\tfor (let i = changesets.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst changeset = changesets[i]\n\t\t\t\t\tassert(changeset, \"Changeset must exist\")\n\t\t\t\t\tthis.dependencies.treeStore.timeline.discardChangeset(changeset)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ addToHistory: true },\n\t\t)\n\t}\n\n\tprivate async replayChangesets(changesets: readonly Changeset[]): Promise<void> {\n\t\tawait this.dependencies.scheduler.scheduleAgentChanges(\n\t\t\t() => {\n\t\t\t\tfor (const changeset of changesets) {\n\t\t\t\t\tassert(changeset, \"Changeset must exist\")\n\t\t\t\t\tthis.dependencies.treeStore.timeline.replayChangeset(changeset)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ addToHistory: true },\n\t\t)\n\t}\n\n\t/**\n\t * Discard the last user-assistant message pair, or discard the entire conversation.\n\t * The agent's messages will be reset along with the document state.\n\t *\n\t * Ensure that we are not generating when discarding.\n\t */\n\tprivate async revert(type: \"last\" | \"until\", request?: AgentRequest, keepChanges?: boolean): Promise<void> {\n\t\tif (this.history.length === 0) return\n\n\t\tswitch (type) {\n\t\t\tcase \"until\": {\n\t\t\t\tassert(request, \"Request is required\")\n\t\t\t\tconst index = this.history.findIndex(r => r.id === request.id)\n\t\t\t\tassert(index !== -1, \"Request not found\")\n\n\t\t\t\tif (!keepChanges) {\n\t\t\t\t\t// Collect all changesets and determine the final code-file version targets\n\t\t\t\t\t// in one pass (oldest \u2192 newest) so we restore each file only once instead\n\t\t\t\t\t// of walking through intermediate versions per request.\n\t\t\t\t\tconst allChangesets: Changeset[] = []\n\t\t\t\t\tconst allCodeFileChanges: RequestCodeFileHistoryChange[] = []\n\t\t\t\t\tfor (let requestIndex = index; requestIndex < this.history.length; requestIndex++) {\n\t\t\t\t\t\tconst requestToRevert = this.history[requestIndex]\n\t\t\t\t\t\tif (!requestToRevert) continue\n\t\t\t\t\t\tif (requestToRevert.changeset?.length) {\n\t\t\t\t\t\t\tallChangesets.push(...requestToRevert.changeset)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (requestToRevert.codeFileChanges?.length) {\n\t\t\t\t\t\t\tallCodeFileChanges.push(...requestToRevert.codeFileChanges)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst revertTargets = collectCodeFileRevertTargets(allCodeFileChanges)\n\n\t\t\t\t\t// Pre-fetch code-file sources (read-only) in parallel with tree\n\t\t\t\t\t// discard so network I/O overlaps with tree processing.\n\t\t\t\t\tconst prefetchPromise = prefetchCodeFileSources(this.dependencies.modulesStore, revertTargets)\n\n\t\t\t\t\t// Batch-discard all changesets in a single tree commit instead of one per request.\n\t\t\t\t\tif (allChangesets.length > 0) {\n\t\t\t\t\t\tawait this.discardChangesets(allChangesets)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Code-file restore runs only after tree discard succeeds to avoid\n\t\t\t\t\t// cross-store inconsistency. Failures are caught so history cleanup\n\t\t\t\t\t// always runs.\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst prefetchedSources = await prefetchPromise\n\t\t\t\t\t\tawait restoreCodeFilesToTargets(this.dependencies.modulesStore, revertTargets, prefetchedSources)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog.error(\"Failed to restore code files during undo\", error)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.history.splice(index)\n\t\t\t\tthis.reset(this.history.length === 0)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase \"last\": {\n\t\t\t\tconst lastUserMessage = this.history.pop()\n\t\t\t\tassert(lastUserMessage, \"Must be a message to discard\")\n\n\t\t\t\tif (!keepChanges) {\n\t\t\t\t\tconst revertTargets = collectCodeFileRevertTargets(lastUserMessage.codeFileChanges ?? [])\n\n\t\t\t\t\t// Pre-fetch code-file sources (read-only) in parallel with tree discard.\n\t\t\t\t\tconst prefetchPromise = prefetchCodeFileSources(this.dependencies.modulesStore, revertTargets)\n\n\t\t\t\t\tconst changesets = lastUserMessage.changeset\n\t\t\t\t\tif (changesets?.length) {\n\t\t\t\t\t\tawait this.discardChangesets(changesets)\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst prefetchedSources = await prefetchPromise\n\t\t\t\t\t\tawait restoreCodeFilesToTargets(this.dependencies.modulesStore, revertTargets, prefetchedSources)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog.error(\"Failed to restore code files during undo\", error)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.reset(this.history.length === 0)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(type, \"Invalid type\")\n\t\t}\n\n\t\t// Clear the summary compaction boundary for the reverted requests, they will be recalculated on\n\t\t// the next send.\n\t\tfor (const remainingRequest of this.history) {\n\t\t\tif (!remainingRequest.summarizedForContext) continue\n\t\t\tremainingRequest.summarizedForContext = undefined\n\t\t}\n\n\t\t// Revert mutates `history` even when no summary flag changed. Notify so persisted chat state\n\t\t// cannot retain a request whose CRDT changes were already undone from the document timeline.\n\t\tthis.notifyChange()\n\t}\n\n\t/** Debug bridge methods for debugbar chat helpers. */\n\tasync debugSend(\n\t\tparts: readonly AgentInputSegment[],\n\t\timplicitSelection: readonly NodeID[],\n\t\tsend: (selectionForContext: readonly NodeID[], cmsTagSegments: readonly CmsTagSegment[]) => Promise<void>,\n\t\toptions?: AgentTurnOptions,\n\t): Promise<void> {\n\t\tconst turnOptions = this.withSubmittedCollectionItemOverlaySelection(options)\n\t\tawait this.runTurn(\n\t\t\tparts,\n\t\t\timplicitSelection,\n\t\t\t(resolvedSelection, cmsTagSegments) => send(resolvedSelection.selectionForContext, cmsTagSegments),\n\t\t\tturnOptions,\n\t\t)\n\t}\n\n\tdebugCreateRequest(parts: readonly AgentInputSegment[], selection: readonly NodeID[]): AgentRequest {\n\t\tconst request = this.createAgentRequest(parts, selection)\n\t\tthis.pushAssistantResponseForCurrentStep(request)\n\t\treturn request\n\t}\n\n\tdebugOnPart<T extends ChatPart>(request: AgentRequest, part: T): ChatPartUpdater<T> {\n\t\treturn this.onPart(request, part)\n\t}\n\n\tdebugAppendMessages(messages: AgentRequest[\"state\"][\"messages\"], scopeId?: NodeID): void {\n\t\tconst currentTurn = this.history[this.history.length - 1]\n\t\tif (currentTurn) {\n\t\t\tcurrentTurn.state.messages.push(...messages)\n\t\t} else {\n\t\t\tconst request: AgentRequest = {\n\t\t\t\tid: randomID(),\n\t\t\t\tparts: [],\n\t\t\t\timages: [],\n\t\t\t\tfiles: [],\n\t\t\t\tcontextMessages: [],\n\t\t\t\tsteps: [],\n\t\t\t\tselection: emptyArray(),\n\t\t\t\tscopeId: scopeId ?? this.scopeId,\n\t\t\t\tdone: true,\n\t\t\t\tstate: { messages },\n\t\t\t}\n\t\t\tthis.history.push(request)\n\t\t}\n\n\t\tif (this.state === \"idle\") this.state = \"follow-up\"\n\t\tthis.notifyChange()\n\t}\n}\n\nfunction serializeAgentAttachmentImagePart(image: AgentAttachmentImage[\"referenceImage\"]) {\n\treturn {\n\t\ttype: image.type,\n\t\turl: image.url,\n\t\tfilename: image.filename,\n\t\toriginalFilename: image.originalFilename,\n\t\timageSize: image.imageSize,\n\t\tasset: image.asset,\n\t\t...(image.sizeKB ? { sizeKB: image.sizeKB } : {}),\n\t}\n}\n\nfunction serializeAgentAttachmentFile(file: AgentAttachmentFile): AgentAttachmentFile {\n\tconst { text: _, ...fileWithoutText } = file\n\treturn fileWithoutText\n}\n\nfunction appendEllipsisToStep(type: ChatPart[\"type\"], content: string, complete?: boolean): string {\n\tif (!complete || type !== \"step\") return content\n\tif (content.endsWith(\"\u2026\") || content.endsWith(\"...\")) return content\n\treturn content + \"\u2026\"\n}\n\nfunction createTurnClock(): TurnClock {\n\treturn {\n\t\twallClockBaseMs: Date.now(),\n\t\tmonotonicBaseMs: performance.now(),\n\t}\n}\n\nfunction isPromptContextCollectionItemOverlay(\n\telement: OverlayStackElement | null | undefined,\n): element is Extract<OverlayStackElement, { type: \"existing\" | \"privateDraft\" }> {\n\treturn element?.type === \"existing\" || element?.type === \"privateDraft\"\n}\n\nfunction getCollectionItemOverlaySelection(\n\tengine: VekterEngine | undefined,\n): AgentCollectionItemOverlaySelection | undefined {\n\tconst activeOverlayStackElement = getActiveCollectionStackElement(\n\t\tengine?.stores.chromeStore.contentManagementOverlayStack ?? [],\n\t)\n\tif (!isPromptContextCollectionItemOverlay(activeOverlayStackElement)) return undefined\n\n\treturn {\n\t\tcollectionId: activeOverlayStackElement.collectionId,\n\t\tcollectionItemId: activeOverlayStackElement.itemId,\n\t}\n}\n\nfunction mergeCmsSelectionGroupsWithCollectionItemOverlaySelection(\n\tcmsSelectionsGroupedByCollection: readonly CmsSelectionGroupByCollection[],\n\tcollectionItemOverlaySelection: AgentCollectionItemOverlaySelection | undefined,\n): readonly CmsSelectionGroupByCollection[] {\n\tif (!collectionItemOverlaySelection) return cmsSelectionsGroupedByCollection\n\n\tconst result: CmsSelectionGroupByCollection[] = []\n\tlet merged = false\n\n\tfor (const group of cmsSelectionsGroupedByCollection) {\n\t\tif (group.collectionId !== collectionItemOverlaySelection.collectionId) {\n\t\t\tresult.push(group)\n\t\t\tcontinue\n\t\t}\n\n\t\tmerged = true\n\t\tconst collectionItemIds = group.collectionItemIds.includes(collectionItemOverlaySelection.collectionItemId)\n\t\t\t? group.collectionItemIds\n\t\t\t: [...group.collectionItemIds, collectionItemOverlaySelection.collectionItemId]\n\t\tresult.push({\n\t\t\tcollectionId: group.collectionId,\n\t\t\tcollectionItemIds,\n\t\t})\n\t}\n\n\tif (!merged) {\n\t\tresult.push({\n\t\t\tcollectionId: collectionItemOverlaySelection.collectionId,\n\t\t\tcollectionItemIds: [collectionItemOverlaySelection.collectionItemId],\n\t\t})\n\t}\n\n\treturn result\n}\n\nfunction getSelectionForContext(\n\ttree: CanvasTree,\n\tnodeIds: readonly NodeID[],\n\tcollectionItemOverlayId?: NodeID,\n): SelectionForContext {\n\tconst result: SelectionForContext = new Map()\n\tfor (const nodeId of nodeIds) {\n\t\tconst node = tree.get(nodeId)\n\t\tif (!node) continue\n\n\t\tresult.set(nodeId, isScopeNode(node))\n\t}\n\n\tif (collectionItemOverlayId && tree.has(collectionItemOverlayId)) {\n\t\tresult.set(collectionItemOverlayId, false)\n\t}\n\n\treturn result\n}\n\nexport const testing = {\n\tgetCollectionItemOverlaySelection,\n\tgetSelectionForContext,\n\tmergeCmsSelectionGroupsWithCollectionItemOverlaySelection,\n}\n\nfunction getComplete<\n\tT extends Extract<\n\t\tChatPart,\n\t\t{ type: \"thinking\" | \"design-plan\" | \"step\" | \"create-component\" | \"annotation\" | \"text\" }\n\t>,\n>(lastPart: T | undefined, text?: string | undefined): T[\"complete\"] {\n\t// Empty thinking messages are not complete, ensuring that back-to-back thinking messages are deduplicated.\n\tif (lastPart?.type !== \"thinking\" || text?.length || lastPart.text?.length) return lastPart?.complete\n\treturn false\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { isCollectionItemNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { LocalizationSource } from \"./getLocalizationSources.ts\"\n\nexport function getCodeGenerationScopeId(engine: VekterEngine, source: LocalizationSource) {\n\tconst node = engine.tree.get(source.scopeId)\n\tif (isCollectionItemNode(node) && node.parentid) {\n\t\treturn node.parentid\n\t}\n\treturn source.scopeId\n}\n"],
  "mappings": "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IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AACC,aAAO;AAAA,IACR;AACC,kBAAYE,MAAK,OAAO;AAAA,EAC1B;AACD;;;ACjrDO,IAAM,iBAAiB;AA+B9B,IAAM,iCAAsE,iBAAE,OAAO;AAAA,EACpF,QAAQ,iBAAE,OAAO;AAAA,EACj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",
  "names": ["module", "d", "w", "type", "parse", "module", "key", "debug", "self", "search", "module", "c", "error", "codeCheckerWorker", "error", "log", "ctx", "assertNever", "id", "node", "log", "node", "key", "node", "nodes", "node", "unhandled", "node", "assert", "textColor", "pluralize", "import_pluralize", "unhandled", "node", "loader", "id", "pluralize", "node", "unhandled", "node", "node", "loader", "target", "overlayId", "identifier", "node", "node", "node", "assert", "node", "key", "node", "log", "error", "log", "colors", "node", "node", "colors", "assert", "assertNever", "node", "keys", "document", "key", "getRect", "node", "id", "keys", "target", "source", "key", "dedent", "log", "ctx", "node", "assertNever", "key", "serialized", "attributes", "_error", "log", "ctx", "ctx", "nodes", "node", "children", "id", "type", "result", "id", "node", "nodes", "id", "attributes", "key", "node", "id", "nodes", "children", "ctx", "type", "document", "description", "error", "ctx", "node", "source", "log", "error", "log", "description", "log", "SUCCESS_STATUS", "toolDescription", "ctx", "identifier", "id", "log", "SUCCESS_STATUS", "BLOCKED_STATUS", "toolDescription", "blocked", "ctx", "id", "identifier", "node", "error", "type", "import_pluralize", "log", "description", "getStagingEnabled", "error", "ctx", "pluralize", "cb", "log", "error", "description", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "a", "c", "b", "d", "import_pluralize", "log", "search", "pluralize", "prompt", "id", "font", "error", "log", "font", "a", "b", "search", "description", "log", "search", "picks", "log", "error", "log", "error", "node", "log", "error", "theme", "id", "node", "key", "log", "font", "ctx", "definition", "error", "description", "stream", "Markdown", "description", "loadEnv", "isBrowserEnvironment", "isEnabled", "getLogger", "debug", "ctx", "key", "error", "_processor", "error", "error", "getLogger", "debug", "loadEnv", "type", "c", "Readable", "source", "target", "source", "log", "resolveCodeFileComponents", "error", "components", "ctx", "nodes", "node", "identifier", "toolCallId", "key", "type", "log", "source", "log", "ctx", "assert", "result", "error", "responsesProvider", "components", "definition", "id", "identifier", "source", "description", "ctx", "ctx", "entries", "identifier", "error", "id", "definition", "ctx", "meta", "source", "source", "type", "source", "type", "description", "source", "source", "key", "source", "c", "ctx", "nodes", "node", "a", "b", "key", "document", "source", "type", "entries", "tool", "tool", "description", "nodes", "maxTokens", "node", "overview", "source", "prompt", "nodes", "node", "error", "ctx", "spacing", "colors", "components", "typography", "surfaces", "layout", "ctx", "key", "error", "ctx", "id", "document", "nodes", "node", "hasChildren", "node", "isString", "isObject", "isNumber", "target", "isString", "node", "children", "node", "isObject", "isString", "target", "error", "isString", "node", "nodes", "key", "prompt", "isNumber", "isObject", "type", "identifier", "log", "error", "ctx", "runResult", "id", "node", "key", "prompt", "nodes", "source", "cost", "result", "a", "b", "description", "ctx", "description", "ctx", "error", "messages", "attributes", "ctx", "log", "node", "collection", "collectionItem", "hasChildren", "node", "node", "a", "b", "entries", "key", "isUndefined", "isNull", "isBoolean", "isString", "isNumber", "isFunction", "isObject", "isArray", "assert", "key", "isFunction", "isString", "isString", "isObject", "id", "source", "typeKey", "idKey", "a", "b", "id", "error", "assert", "error", "tool", "source", "source", "ctx", "target", "getNodeClass", "node", "type", "ctx", "uniqueName", "node", "attributes", "id", "identifier", "error", "ctx", "attributes", "type", "enumCase", "id", "attributes", "ctx", "identifier", "error", "ctx", "id", "assert", "target", "node", "isVariableReference", "updatedNode", "scopeNode", "attributes", "error", "prompt", "id", "type", "messages", "entries", "log", "key", "attachments", "node", "error", "_error", "prompt", "entries", "import_pluralize", "ctx", "pluralize", "a", "b", "id", "node", "log", "error", "code", "message", "ctx", "assert", "assertNever", "id", "node", "messages", "log", "log", "tool", "description", "nodes", "a", "b", "nodes", "a", "b", "nodes", "a", "nodes", "nodes", "a", "b", "nodes", "a", "b", "nodes", "a", "b", "nodes", "a", "b", "nodes", "a", "b", "nodes", "id", "vectorDefinitions", "vectorSets", "components", "nodes", "a", "b", "nodes", "a", "b", "c", "nodes", "a", "b", "c", "nodes", "a", "b", "definitions", "loader", "identifier", "namesByModuleId", "vectorsByIdentifier", "nodes", "components", "a", "nodes", "source", "a", "b", "nodes", "a", "b", "nodes", "a", "node", "tool", "tool", "source", "target", "nodes", "node", "ctx", "prompt", "description", "source", "source", "source", "source", "source", "description", "source", "source", "description", "examples", "formatAttributes", "attributes", "node", "definition", "existing", "key", "id", "source", "source", "source", "source", "source", "description", "reviewChanges", "SUCCESS_STATUS", "BLOCKED_STATUS", "toolNames", "tool", "source", "stream", "error", "ctx", "ctx", "messages", "messages", "ctx", "messages", "log", "source", "ctx", "prompt", "error", "messages", "text", "streamText", "usage", "id", "ctx", "log", "target", "error", "log", "messages", "ctx", "log", "defaultMaxSteps", "c", "id", "prompt", "cb", "node", "error", "maxSteps", "source", "ctx", "type", "messages", "source", "node"]
}
