@inkandswitch/patchwork-pkg-base 0.0.74 → 0.0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-51fB7vpU.js","sources":["../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../node_modules/.pnpm/debug@4.4.3_supports-color@7.2.0/node_modules/debug/src/common.js","../../node_modules/.pnpm/debug@4.4.3_supports-color@7.2.0/node_modules/debug/src/browser.js","../../node_modules/.pnpm/cabbages@0.2.10_supports-color@7.2.0/node_modules/cabbages/output/cabbages.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/autoproduce.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/makeDocumentProjection.js","../../node_modules/.pnpm/@solid-primitives+utils@6.4.1_solid-js@1.9.13/node_modules/@solid-primitives/utils/dist/index.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/createDocumentProjection.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/context.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/useDocHandle.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/useDocument.js","../../node_modules/.pnpm/solid-automerge@2.0.2_@automerge+automerge-repo@2.6.0-subduction.26_supports-color@7.2._81ccd5b76aeeb8656c8edcc9a6e236ff/node_modules/solid-automerge/out/useRepo.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/style.js","../../node_modules/.pnpm/@inkandswitch+patchwork-providers-solid@0.2.8_@automerge+automerge-repo@2.6.0-subductio_6905546828d892b9e331a5daae96ed66/node_modules/@inkandswitch/patchwork-providers-solid/dist/index.js","../../src/CommentsView.tsx","../../src/relative-time.ts","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/markup.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/preview.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/autocomplete.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/editor.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/render.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/schema.js","../../node_modules/.pnpm/cute.txt@0.0.7_@automerge+automerge@3.3.0-fragments.1_@codemirror+state@6.7.5_@codemirror+view@6.43.12_solid-js@1.9.13/node_modules/cute.txt/dist/solid.js","../../src/CommentThread.tsx","../../src/main.tsx"],"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","// cabbages.ts\nimport debug from \"debug\";\nvar log = debug(\"cabbages\");\nfunction pojo(target) {\n return typeof target == \"object\" && typeof target != null && Object.getPrototypeOf(target) == Object.prototype;\n}\nvar BLOCK_MARKER = \"\\uFFFC\";\nfunction apply(target, ...rest) {\n if (rest.length == 0) {\n log(\"empty patch\");\n return;\n }\n const [path, range, val] = rest;\n let p = [...path];\n while (true) {\n let key = p.shift();\n if (!p.length) {\n const RANGE_ARRAY = Array.isArray(range);\n if (pojo(target) && RANGE_ARRAY && typeof key == \"undefined\" && typeof range[0] == \"string\") {\n delete target[range[0]];\n return;\n }\n if (RANGE_ARRAY || typeof range == \"number\") {\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let [start, end] = Array.isArray(range) ? range : [range, range + 1];\n const ZERO_LENGTH = Array.isArray(range) && range.length == 0;\n if (!ZERO_LENGTH && (start == null || end == null)) {\n throw new RangeError(\"it's all or nothing, no half measures\");\n }\n const DELETE = typeof val == \"undefined\";\n const INSERT = start === end && !DELETE;\n const APPEND = ZERO_LENGTH && !DELETE;\n const REPLACE = !INSERT && !DELETE && !APPEND;\n if (typeof target[key] == \"undefined\") {\n if (typeof target == \"string\") {\n return;\n } else if (typeof val == \"string\") {\n target[key] = \"\";\n } else {\n target[key] = [];\n }\n }\n let seq = target[key];\n if (Array.isArray(seq)) {\n if (APPEND) {\n Array.isArray(val) ? seq.push(...val) : seq.push(val);\n return;\n }\n if (INSERT || REPLACE) {\n Array.isArray(val) ? seq.splice(start, end - start, ...val) : seq.splice(start, end - start, val);\n return;\n }\n if (DELETE) {\n seq.splice(start, end - start);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (typeof seq == \"string\") {\n if (APPEND) {\n target[key] = seq + val;\n return;\n }\n if (REPLACE || INSERT) {\n target[key] = seq.slice(0, start) + (typeof val == \"string\" ? val : val.map(\n (n) => typeof n == \"string\" ? n : BLOCK_MARKER\n ).join(\"\")) + seq.slice(end);\n return;\n }\n if (DELETE) {\n target[key] = seq.slice(0, start) + seq.slice(end);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (pojo(seq) && RANGE_ARRAY && typeof range[0] == \"string\") {\n delete seq[range[0]];\n return;\n }\n throw new Error(\"not implemented\");\n }\n if (typeof key == \"undefined\") {\n if (typeof range != \"string\") {\n throw new Error(`can't index top-level map with ${range}`);\n }\n if (typeof val == \"undefined\") {\n delete target[range];\n } else {\n target[range] = val;\n }\n return;\n }\n if (typeof target[key] == \"undefined\") {\n target[key] = {};\n }\n if (RANGE_ARRAY) {\n let [a, b] = range;\n if (a != null && b != null) {\n if (typeof val == \"undefined\" && a != null && b != null) {\n delete target[key][a || b];\n } else {\n target[key][a || b] = val;\n }\n }\n } else {\n if (typeof val == \"undefined\") {\n delete target[key][range];\n } else if (typeof target[key] == \"string\") {\n return;\n } else {\n target[key][range] = val;\n }\n }\n return;\n }\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let nextkey = p[0];\n if (typeof target[key] == \"undefined\") {\n if (typeof nextkey == \"string\") {\n target[key] = {};\n } else if (typeof nextkey == \"number\") {\n target[key] = [];\n } else {\n throw new Error(`can't go down this road ${target}.${key}.${nextkey}`);\n }\n }\n target = target[key];\n }\n}\nvar patch = apply;\nfunction get(obj, key) {\n for (let p = 0; p < key.length; p++) {\n obj = obj ? obj[key[p]] : void 0;\n }\n return obj;\n}\nfunction fromAutomerge(autopatch, payload) {\n const path = autopatch.path.slice(0, -1);\n const key = autopatch.path[autopatch.path.length - 1];\n switch (autopatch.action) {\n case \"mark\":\n case \"unmark\":\n log(\n `skipping ${autopatch.action} because it doesn't affect material reality`\n );\n return [];\n case \"inc\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"conflict\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"del\": {\n return typeof key == \"string\" ? [path, key] : [path, [key, key + (autopatch.length || 1)]];\n }\n case \"insert\": {\n return [\n path,\n [key, key],\n structuredClone(autopatch.values)\n ];\n }\n case \"splice\": {\n return [path, [key, key], [autopatch.value]];\n }\n case \"put\": {\n return [path, key, structuredClone(autopatch.value)];\n }\n }\n}\nexport {\n apply,\n fromAutomerge,\n patch,\n pojo\n};\n","\"use strict\";\nimport { apply, fromAutomerge } from \"cabbages\";\nexport default function autoproduce(payload) {\n return (doc) => {\n for (let patch of payload.patches) {\n apply(doc, ...fromAutomerge(patch, payload));\n }\n };\n}\n//# sourceMappingURL=autoproduce.js.map\n","\"use strict\";\nimport { onCleanup } from \"solid-js\";\nimport autoproduce from \"./autoproduce.js\";\nimport { createStore, produce, reconcile } from \"solid-js/store\";\nconst cache = /* @__PURE__ */ new WeakMap();\nexport default function makeDocumentProjection(handle) {\n onCleanup(() => {\n const item = cache.get(handle);\n if (!item) return;\n if (!item.refs--) {\n item.cleanup();\n }\n });\n if (cache.has(handle)) {\n const item = cache.get(handle);\n item.refs++;\n return item.store;\n }\n const [doc, set] = createStore(structuredClone(handle.doc()));\n cache.set(handle, {\n refs: 0,\n store: doc,\n cleanup() {\n handle.off(\"change\", patch);\n handle.off(\"delete\", ondelete);\n cache.delete(handle);\n }\n });\n function patch(payload) {\n if (payload.scopeReplaced) {\n set(reconcile(payload.doc ?? {}));\n return;\n }\n set(produce(autoproduce(payload)));\n }\n function ondelete() {\n set(reconcile({}));\n }\n handle.on(\"change\", patch);\n handle.on(\"delete\", ondelete);\n handle.whenReady().then(() => {\n set(structuredClone(handle.doc()));\n });\n return doc;\n}\n//# sourceMappingURL=makeDocumentProjection.js.map\n","import { getOwner, onCleanup, createSignal, untrack, sharedConfig, onMount, DEV, equalFn, } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nexport * from \"./types.js\";\n//\n// GENERAL HELPERS:\n//\nexport { isServer };\nexport const isClient = !isServer;\nexport const isDev = isClient && !!DEV;\nexport const isProd = !isDev;\n/** no operation */\nexport const noop = (() => void 0);\nexport const trueFn = () => true;\nexport const falseFn = () => false;\n/** @deprecated use {@link equalFn} from \"solid-js\" */\nexport const defaultEquals = equalFn;\nexport const EQUALS_FALSE_OPTIONS = { equals: false };\nexport const INTERNAL_OPTIONS = { internal: true };\n/**\n * Check if the value is an instance of ___\n */\nexport const ofClass = (v, c) => v instanceof c || (v && v.constructor === c);\n/** Check if value is typeof \"object\" or \"function\" */\nexport function isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nexport const isNonNullable = (i) => i != null;\nexport const filterNonNullable = (arr) => arr.filter(isNonNullable);\nexport const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);\n/**\n * Check shallow array equality\n */\nexport const arrayEquals = (a, b) => a === b || (a.length === b.length && a.every((e, i) => e === b[i]));\n/**\n * Returns a function that will call all functions in the order they were chained with the same arguments.\n */\nexport function chain(callbacks) {\n return (...args) => {\n for (const callback of callbacks)\n callback && callback(...args);\n };\n}\n/**\n * Returns a function that will call all functions in the reversed order with the same arguments.\n */\nexport function reverseChain(callbacks) {\n return (...args) => {\n for (let i = callbacks.length - 1; i >= 0; i--) {\n const callback = callbacks[i];\n callback && callback(...args);\n }\n };\n}\nexport const clamp = (n, min, max) => Math.min(Math.max(n, min), max);\n/**\n * Accesses the value of a MaybeAccessor\n * @example\n * ```ts\n * access(\"foo\") // => \"foo\"\n * access(() => \"foo\") // => \"foo\"\n * ```\n */\nexport const access = (v) => typeof v === \"function\" && !v.length ? v() : v;\nexport const asArray = (value) => Array.isArray(value) ? value : value ? [value] : [];\n/**\n * Access an array of MaybeAccessors\n * @example\n * const list = [1, 2, () => 3)] // T: MaybeAccessor<number>[]\n * const newList = accessArray(list) // T: number[]\n */\nexport const accessArray = (list) => list.map(v => access(v));\n/**\n * Run the function if the accessed value is not `undefined` nor `null`\n * @param value\n * @param fn\n */\nexport const withAccess = (value, fn) => {\n const _value = access(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n typeof _value != null && fn(_value);\n};\nexport const asAccessor = (v) => (typeof v === \"function\" ? v : () => v);\n/** If value is a function – call it with a given arguments – otherwise get the value as is */\nexport function accessWith(valueOrFn, ...args) {\n return typeof valueOrFn === \"function\" ? valueOrFn(...args) : valueOrFn;\n}\nexport function defer(deps, fn, initialValue) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let shouldDefer = true;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++)\n input[i] = deps[i]();\n }\n else\n input = deps();\n if (shouldDefer) {\n shouldDefer = false;\n prevInput = input;\n return initialValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\n/**\n * Get entries of an object\n */\nexport const entries = Object.entries;\n/**\n * Get keys of an object\n */\nexport const keys = Object.keys;\n/**\n * Solid's `onCleanup` that doesn't warn in development if used outside of a component.\n */\nexport const tryOnCleanup = isDev\n ? fn => (getOwner() ? onCleanup(fn) : fn)\n : onCleanup;\nexport const createCallbackStack = () => {\n let stack = [];\n const clear = () => (stack = []);\n return {\n push: (...callbacks) => stack.push(...callbacks),\n execute(arg0, arg1, arg2, arg3) {\n stack.forEach(cb => cb(arg0, arg1, arg2, arg3));\n clear();\n },\n clear,\n };\n};\n/**\n * Group synchronous function calls.\n * @param fn\n * @returns `fn`\n */\nexport function createMicrotask(fn) {\n let calls = 0;\n let args;\n onCleanup(() => (calls = 0));\n return (...a) => {\n (args = a), calls++;\n queueMicrotask(() => --calls === 0 && fn(...args));\n };\n}\n/**\n * A hydratable version of the {@link createSignal}. It will use the serverValue on the server and the update function on the client. If initialized during hydration it will use serverValue as the initial value and update it once hydration is complete.\n *\n * @param serverValue initial value of the state on the server\n * @param update called once on the client or on hydration to initialize the value\n * @param options {@link SignalOptions}\n * @returns\n * ```ts\n * [state: Accessor<T>, setState: Setter<T>]\n * ```\n * @see {@link createSignal}\n */\nexport function createHydratableSignal(serverValue, update, options) {\n if (isServer) {\n return createSignal(serverValue, options);\n }\n if (sharedConfig.context) {\n const [state, setState] = createSignal(serverValue, options);\n onMount(() => setState(() => update()));\n return [state, setState];\n }\n return createSignal(update(), options);\n}\n/** @deprecated use {@link createHydratableSignal} instead */\nexport const createHydrateSignal = createHydratableSignal;\n/**\n * Handle items removed and added to the array by diffing it by refference.\n *\n * @param current new array instance\n * @param prev previous array copy\n * @param handleAdded called once for every added item to array\n * @param handleRemoved called once for every removed from array\n */\nexport function handleDiffArray(current, prev, handleAdded, handleRemoved) {\n const currLength = current.length;\n const prevLength = prev.length;\n let i = 0;\n if (!prevLength) {\n for (; i < currLength; i++)\n handleAdded(current[i]);\n return;\n }\n if (!currLength) {\n for (; i < prevLength; i++)\n handleRemoved(prev[i]);\n return;\n }\n for (; i < prevLength; i++) {\n if (prev[i] !== current[i])\n break;\n }\n let prevEl;\n let currEl;\n prev = prev.slice(i);\n current = current.slice(i);\n for (prevEl of prev) {\n if (!current.includes(prevEl))\n handleRemoved(prevEl);\n }\n for (currEl of current) {\n if (!prev.includes(currEl))\n handleAdded(currEl);\n }\n}\n// ─── String transforms ────────────────────────────────────────────────────────\n/**\n * Parse a string as a single JSON value.\n *\n * ```ts\n * const { data } = createSSE<{ status: string }>(url, { transform: json });\n * ```\n */\nexport const json = (raw) => JSON.parse(raw);\n/**\n * Parse a string as newline-delimited JSON (NDJSON / JSON Lines).\n *\n * Each non-empty line is parsed as a separate JSON value and returned as an array.\n *\n * ```ts\n * const { data } = createSSE<TickEvent[]>(url, { transform: ndjson });\n * // data() === [{ id: 1, type: \"tick\" }, { id: 2, type: \"tick\" }]\n * ```\n */\nexport const ndjson = (raw) => raw\n .split(\"\\n\")\n .filter(line => line !== \"\")\n .map(line => JSON.parse(line));\n/**\n * Split a string into individual lines, returning a `string[]`. Empty lines are filtered out.\n *\n * ```ts\n * const { data } = createSSE<string[]>(url, { transform: lines });\n * // data() === [\"line one\", \"line two\"]\n * ```\n */\nexport const lines = (raw) => raw.split(\"\\n\").filter(line => line !== \"\");\n/**\n * Parse a string as a number using `Number()` semantics.\n *\n * Note: `\"\"` → `0`, non-numeric strings → `NaN`.\n *\n * ```ts\n * const { data } = createSSE<number>(url, { transform: number });\n * // data() === 42\n * ```\n */\nexport const number = (raw) => Number(raw);\nexport function safe(transform, fallback) {\n return (raw) => {\n try {\n return transform(raw);\n }\n catch {\n return fallback;\n }\n };\n}\n/**\n * Compose two transforms into one: the output of `a` is passed as the input of `b`.\n *\n * ```ts\n * const { data } = createSSE<RawEvent[]>(url, {\n * transform: pipe(ndjson<RawEvent>, rows => rows.filter(r => r.type === \"tick\")),\n * });\n * ```\n */\nexport function pipe(a, b) {\n return (raw) => b(a(raw));\n}\n","\"use strict\";\nimport { createMemo } from \"solid-js\";\nimport makeDocumentProjection from \"./makeDocumentProjection.js\";\nimport { access } from \"@solid-primitives/utils\";\nexport default function createDocumentProjection(handle) {\n const projection = createMemo(\n () => access(handle) && makeDocumentProjection(access(handle))\n );\n return projection;\n}\n//# sourceMappingURL=createDocumentProjection.js.map\n","\"use strict\";\nimport { createContext } from \"solid-js\";\nexport const RepoContext = createContext(\n null\n);\n//# sourceMappingURL=context.js.map\n","\"use strict\";\nimport { createEffect, createResource, useContext } from \"solid-js\";\nimport { access } from \"@solid-primitives/utils\";\nimport { RepoContext } from \"./context.js\";\nexport default function useDocHandle(url, options) {\n const contextRepo = useContext(RepoContext);\n if (!options?.repo && !contextRepo) {\n throw new Error(\"use outside <RepoContext> requires options.repo\");\n }\n const repo = options?.repo || contextRepo;\n function getExistingHandle() {\n if (options?.[\"~skipInitialValue\"]) return void 0;\n const unwrappedURL = access(url);\n if (!unwrappedURL) return void 0;\n const state = repo.findWithProgress(unwrappedURL).peek();\n return state.state === \"ready\" ? state.handle : void 0;\n }\n const [handle, { mutate }] = createResource(\n url,\n (url2) => repo.findWithProgress(url2).whenReady(),\n {\n initialValue: getExistingHandle()\n }\n );\n createEffect(() => {\n if (!access(url)) {\n mutate();\n }\n });\n return handle;\n}\n//# sourceMappingURL=useDocHandle.js.map\n","\"use strict\";\nimport createDocumentProjection from \"./createDocumentProjection.js\";\nimport useDocHandle from \"./useDocHandle.js\";\nexport default function useDocument(url, options) {\n const handle = useDocHandle(url, options);\n return [createDocumentProjection(handle), handle];\n}\n//# sourceMappingURL=useDocument.js.map\n","\"use strict\";\nimport { RepoContext } from \"./context.js\";\nimport { useContext } from \"solid-js\";\nexport default function useRepo() {\n const repo = useContext(RepoContext);\n if (!repo) throw new Error(\"Please wrap me in a <RepoContext value={repo}>\");\n return repo;\n}\n//# sourceMappingURL=useRepo.js.map\n","// Styles for the cute.txt tool. Bundleless tools have no CSS import and no shadow\n// DOM, so we inject this string as a <style> and namespace every class.\nexport const STYLE = `\n@layer cutetxt {\n.cutetxt-tool,\n.cutetxt-editor,\n.cutetxt-rendered,\n.cutetxt-autocomplete {\n --cutetxt-bg: Canvas;\n --cutetxt-fg: currentColor;\n --cutetxt-transparent: transparent;\n --cutetxt-link: var(--link, currentColor);\n --cutetxt-code-bg: color-mix(in srgb, var(--cutetxt-fg) 10%, var(--cutetxt-transparent));\n --cutetxt-spoiler-bg: currentColor;\n --cutetxt-spoiler-revealed-bg: color-mix(in srgb, var(--cutetxt-fg) 12%, var(--cutetxt-transparent));\n --cutetxt-embed-bg: var(--cutetxt-bg);\n --cutetxt-embed-border: color-mix(in srgb, var(--cutetxt-fg) 18%, var(--cutetxt-transparent));\n --cutetxt-embed-bar-bg: color-mix(in srgb, var(--cutetxt-fg) 5%, var(--cutetxt-bg));\n --cutetxt-embed-bar-border: color-mix(in srgb, var(--cutetxt-fg) 12%, var(--cutetxt-transparent));\n --cutetxt-embed-bar-fg: color-mix(in srgb, var(--cutetxt-fg) 72%, var(--cutetxt-transparent));\n --cutetxt-embed-handle: color-mix(in srgb, var(--cutetxt-fg) 38%, var(--cutetxt-transparent));\n --cutetxt-embed-handle-active: color-mix(in srgb, var(--cutetxt-fg) 62%, var(--cutetxt-transparent));\n --cutetxt-control-bg: color-mix(in srgb, var(--cutetxt-bg) 85%, var(--cutetxt-fg) 4%);\n --cutetxt-control-border: color-mix(in srgb, var(--cutetxt-fg) 20%, var(--cutetxt-transparent));\n --cutetxt-control-fg: color-mix(in srgb, var(--cutetxt-fg) 70%, var(--cutetxt-transparent));\n --cutetxt-menu-bg: var(--cutetxt-bg);\n --cutetxt-menu-border: color-mix(in srgb, var(--cutetxt-fg) 15%, var(--cutetxt-transparent));\n --cutetxt-menu-shadow: color-mix(in srgb, var(--cutetxt-fg) 20%, var(--cutetxt-transparent));\n --cutetxt-hover-bg: color-mix(in srgb, var(--cutetxt-fg) 10%, var(--cutetxt-transparent));\n --cutetxt-codeblock-bg: color-mix(in srgb, var(--cutetxt-fg) 8%, var(--cutetxt-transparent));\n --cutetxt-think-border: color-mix(in srgb, var(--cutetxt-fg) 25%, var(--cutetxt-transparent));\n --cutetxt-think-fg: color-mix(in srgb, var(--cutetxt-fg) 65%, var(--cutetxt-transparent));\n --cutetxt-popup-shadow: color-mix(in srgb, var(--cutetxt-fg) 25%, var(--cutetxt-transparent));\n --cutetxt-active-bg: color-mix(in srgb, var(--cutetxt-fg) 12%, var(--cutetxt-transparent));\n}\n.cutetxt-tool { display: block; height: 100%; }\n.cutetxt-editor { height: 100%; }\n\n.cutetxt-editor .cm-editor { height: 100%; }\n.cutetxt-editor .cm-content {\n font: 15px/1.55 system-ui, sans-serif;\n padding: 12px 14px;\n caret-color: currentColor;\n}\n.cutetxt-editor .cm-editor.cm-focused { outline: none; }\n.cutetxt-editor .cm-scroller { font-family: inherit; }\n\n/* Marks rendered by tagName (strong/em/u/s) inherit browser defaults; these two\n need classes. */\n.cutetxt-code {\n font-family: ui-monospace, monospace;\n font-size: 0.9em;\n background: var(--cutetxt-code-bg);\n padding: 0.1em 0.3em;\n border-radius: 4px;\n}\n.cutetxt-spoiler {\n background: var(--cutetxt-spoiler-bg);\n border-radius: 3px;\n transition: color 0.1s;\n cursor: pointer;\n}\n.cutetxt-spoiler:not(.cutetxt-spoiler--revealed) {\n color: transparent;\n}\n.cutetxt-spoiler--revealed { background: var(--cutetxt-spoiler-revealed-bg); }\n\n.cutetxt-underline-em { text-decoration: underline; font-style: italic; }\n.cutetxt-inverted { filter: invert(1); }\n.cutetxt-editor a, .cutetxt-rendered a { color: var(--cutetxt-link); }\n\n/* Block atoms: embeds, code fences, think blocks. */\n.cutetxt-block {\n display: block;\n margin: 6px 0;\n}\n.cutetxt-block { position: relative; }\n.cutetxt-block > patchwork-view,\n.cutetxt-block > img { display: block; max-width: 100%; }\n\n.cutetxt-embed {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: min(100%, 640px);\n min-width: 160px;\n min-height: 120px;\n max-width: 100%;\n margin-right: 2px;\n margin-bottom: 2px;\n overflow: visible;\n border: 1px solid var(--cutetxt-embed-border);\n border-radius: 7px;\n background: var(--cutetxt-embed-bg);\n}\n.cutetxt-embed-bar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 27px;\n padding: 3px 5px 3px 9px;\n border-bottom: 1px solid var(--cutetxt-embed-bar-border);\n background: var(--cutetxt-embed-bar-bg);\n color: var(--cutetxt-embed-bar-fg);\n font: 12px/1.3 system-ui, sans-serif;\n user-select: none;\n cursor: text;\n}\n.cutetxt-embed-title {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cutetxt-embed-actions {\n display: flex;\n gap: 6px;\n align-items: center;\n margin-left: auto;\n padding-right: 7px;\n flex: 0 0 auto;\n min-width: max-content;\n}\n.cutetxt-embed-icon {\n box-sizing: border-box;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n border: 1px solid var(--cutetxt-control-border);\n border-radius: 999px;\n background: var(--cutetxt-control-bg);\n color: var(--cutetxt-control-fg);\n cursor: pointer;\n font: 11px/1 system-ui, sans-serif;\n}\n.cutetxt-embed-icon:hover,\n.cutetxt-embed-icon:focus {\n color: var(--cutetxt-fg);\n}\n.cutetxt-embed-delete {\n position: relative;\n right: -7px;\n width: 22px;\n min-width: 22px;\n padding: 0;\n border-radius: 999px;\n font-weight: 600;\n}\n.cutetxt-embed-body {\n min-height: 88px;\n flex: 1 1 auto;\n overflow: auto;\n border-radius: 0 0 7px 7px;\n}\n.cutetxt-embed-body > patchwork-view,\n.cutetxt-embed-body > img {\n display: block;\n max-width: 100%;\n}\n.cutetxt-embed-resize {\n position: absolute;\n right: -5px;\n bottom: -5px;\n width: 16px;\n height: 16px;\n cursor: nwse-resize;\n touch-action: none;\n}\n.cutetxt-embed-resize::before {\n content: \"\";\n position: absolute;\n right: 3px;\n bottom: 3px;\n width: 9px;\n height: 9px;\n border-right: 3px solid var(--cutetxt-embed-handle);\n border-bottom: 3px solid var(--cutetxt-embed-handle);\n border-radius: 0 0 2px 0;\n}\n.cutetxt-embed:hover .cutetxt-embed-resize::before,\n.cutetxt-embed.is-resizing .cutetxt-embed-resize::before {\n border-color: var(--cutetxt-embed-handle-active);\n}\n.cutetxt-embed.is-resizing {\n user-select: none;\n}\n\n/* Tool-picker on embed widgets: a small \"▾ tool\" control + dropdown menu. */\n.cutetxt-embed-picker { position: relative; z-index: 2; flex: none; }\n.cutetxt-embed-tool {\n font: 11px/1.4 system-ui, sans-serif;\n padding: 2px 6px;\n max-width: 88px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n border-radius: 5px;\n border: 1px solid var(--cutetxt-control-border);\n background: var(--cutetxt-control-bg);\n color: var(--cutetxt-control-fg);\n cursor: pointer;\n opacity: 0.75;\n transition: opacity 0.1s;\n}\n.cutetxt-embed:hover .cutetxt-embed-tool,\n.cutetxt-embed-tool:focus { opacity: 1; }\n.cutetxt-embed-menu {\n position: absolute;\n top: calc(100% + 3px);\n right: 0;\n min-width: 120px;\n padding: 4px;\n border-radius: 7px;\n border: 1px solid var(--cutetxt-menu-border);\n background: var(--cutetxt-menu-bg);\n box-shadow: 0 4px 16px var(--cutetxt-menu-shadow);\n display: flex;\n flex-direction: column;\n gap: 1px;\n font: 12px/1.4 system-ui, sans-serif;\n}\n.cutetxt-embed-menu-item {\n text-align: left;\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n background: none;\n color: inherit;\n cursor: pointer;\n}\n.cutetxt-embed-menu-item:hover { background: var(--cutetxt-hover-bg); }\n.cutetxt-embed-menu-item.is-current { font-weight: 600; }\n\n.cutetxt-codeblock {\n margin: 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--cutetxt-codeblock-bg);\n overflow-x: auto;\n font: 13px/1.5 ui-monospace, monospace;\n}\n\n.cutetxt-think {\n padding: 8px 12px;\n border-left: 3px solid var(--cutetxt-think-border);\n color: var(--cutetxt-think-fg);\n font-style: italic;\n white-space: pre-wrap;\n}\n\n/* Inline replaces: emoji, etc. */\n.cutetxt-replace { display: inline; }\n.cutetxt-emoji { font-style: normal; }\n\n/* Autocomplete popup (appended to <body>, positioned fixed at the caret). */\n.cutetxt-autocomplete {\n position: fixed;\n z-index: 30;\n min-width: 150px;\n max-height: 220px;\n overflow-y: auto;\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--cutetxt-menu-border);\n background: var(--cutetxt-menu-bg);\n box-shadow: 0 6px 20px var(--cutetxt-popup-shadow);\n font: 13px/1.4 system-ui, sans-serif;\n}\n.cutetxt-ac-item {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 4px 8px;\n border-radius: 5px;\n cursor: pointer;\n}\n.cutetxt-ac-item.is-active { background: var(--cutetxt-active-bg); }\n.cutetxt-ac-icon { width: 1.2em; height: 1.2em; object-fit: contain; text-align: center; flex: none; }\n.cutetxt-ac-desc { opacity: 0.7; }\n.cutetxt-ac-detail { margin-left: auto; opacity: 0.7; }\n}\n`;\n//# sourceMappingURL=style.js.map","import { createEffect, createSignal, onCleanup, onMount, } from \"solid-js\";\nimport { createStore, reconcile } from \"solid-js/store\";\nimport * as Providers from \"@inkandswitch/patchwork-providers\";\nfunction resolveElement(source) {\n return typeof source === \"function\" ? source() : source;\n}\n/**\n * Generic reactive request. Resolves the first value a provider emits for\n * `selector` (via the one-shot `request` helper) and returns an accessor that\n * reads `undefined` until then. `T` is the response type.\n */\nexport function request(element, selector) {\n const [value, setValue] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n Providers.request(target, selector).then((v) => {\n if (v == null)\n return;\n setValue(() => v);\n });\n });\n return value;\n}\nexport function subscribe(element, selector, initialValue) {\n const [value, setValue] = createSignal(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, setValue);\n onCleanup(unsubscribe);\n });\n return value;\n}\n/**\n * Store-backed subscription. Use this when a consumer wants Solid's\n * fine-grained nested reactivity for incoming JSON object or array snapshots.\n * Requires an initial object/array so the store has a stable root.\n *\n * `reconcile` preserves stable object/array identity where possible, so this\n * helper is not a good fit when the top-level value is used as an identity key\n * for resources or memos.\n */\nexport function subscribeReconciled(element, selector, initialValue) {\n const [store, setStore] = createStore(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, (v) => {\n setStore(reconcile(v));\n });\n onCleanup(unsubscribe);\n });\n return store;\n}\n/**\n * Handle-specialized subscription. Use when the answering provider emits an\n * `AutomergeUrl`. The handle is recovered locally from the global repo\n * (`window.repo`), so it stays fully live — reads project reactively and writes go\n * straight back to the same repo. Returns `[doc, handle]` matching the shape\n * of `solid-automerge`'s `useDocument`; both read `undefined` until the first\n * url arrives. `T` is the doc shape inside the handle.\n */\nexport function subscribeDoc(element, selector) {\n const [handle, setHandle] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n let canceled = false;\n const unsubscribe = Providers.subscribe(target, selector, (url) => {\n if (!url)\n return;\n const repo = \"repo\" in window ? window.repo : undefined;\n if (!repo)\n return;\n void Promise.resolve(repo.find(url)).then((h) => {\n if (canceled)\n return;\n setHandle(() => h);\n });\n });\n onCleanup(() => {\n canceled = true;\n unsubscribe();\n });\n });\n // Mirror the doc into a store by `reconcile`-ing against the *materialized*\n // snapshot (`handle.doc()`) on every change, rather than replaying the\n // change's incremental patches (as `solid-automerge`'s `createDocumentProjection`\n // / `autoproduce` does).\n //\n // A whole-value write such as `doc.list = [...]` is lowered by Automerge to\n // `putObjectFromHydrate`, whose patch stream is a `put` that materializes the\n // new container *plus* per-element `insert` patches. Replaying that delta with\n // `applyPatches` double-applies the contents — the `put` seeds `[a, b]`, then\n // the inserts splice `a, b` in again, yielding `[a, b, a, b]` — even though the\n // document itself is correct. The materialized snapshot is always\n // authoritative, so reconciling against it is robust to any valid change,\n // whole-array reassignment included.\n const [store, setStore] = createStore({});\n const [ready, setReady] = createSignal(false);\n createEffect(() => {\n const h = handle();\n if (!h) {\n setReady(false);\n return;\n }\n const sync = () => {\n setStore(reconcile((h.doc() ?? {})));\n setReady(true);\n };\n sync();\n h.on(\"change\", sync);\n onCleanup(() => h.off(\"change\", sync));\n });\n const doc = () => (ready() ? store : undefined);\n return [doc, handle];\n}\n","import \"./styles.css\";\n// Pulls in <patchwork-view> JSX intrinsic type augmentations.\nimport type {} from \"@inkandswitch/patchwork-elements\";\nimport {\n createSignal,\n createMemo,\n createEffect,\n onCleanup,\n Show,\n For,\n} from \"solid-js\";\n\nimport { useRepo } from \"solid-automerge\";\nimport {\n type AutomergeUrl,\n type DocHandle,\n type Repo,\n} from \"@automerge/automerge-repo/slim\";\n\nimport {\n subscribeDoc,\n subscribe,\n} from \"@inkandswitch/patchwork-providers-solid\";\nimport { subscribe as subscribeProvider } from \"@inkandswitch/patchwork-providers\";\nimport {\n createDocumentThread,\n type DocWithComments,\n} from \"./comments\";\n\ntype CommentEntry = { targetUrl: AutomergeUrl; threadUrl: AutomergeUrl };\n\nexport function CommentsView(props: { element: HTMLElement }) {\n const repo = useRepo();\n\n // The doc the panel is about: whatever is currently selected in the main\n // view. Both the comment list and document-level \"Add comment\" target it.\n const selectedDocUrls = subscribe<AutomergeUrl[]>(\n props.element,\n { type: \"patchwork:selected-doc\" },\n []\n );\n const targetDocUrl = () => selectedDocUrls()[0] as AutomergeUrl | undefined;\n\n // Scope the comments subscription to the selected doc and re-open it when\n // that changes. A single global (url-less) subscription would accumulate\n // every mounted doc's threads and never drop the previous document's\n // comments as you navigate.\n const commentEntries = useScopedCommentEntries(props.element, targetDocUrl);\n\n // `selection` is read-only input (driven by the active editor), `highlight`\n // is our output. Splitting them avoids the feedback loop a single shared\n // map would have.\n const [focusDoc, focusHandle] = subscribeDoc<{\n selection: Record<AutomergeUrl, true>;\n highlight: Record<AutomergeUrl, true>;\n }>(props.element, { type: \"patchwork:focus\" });\n\n const [, contactHandle] = subscribeDoc<Record<string, never>>(props.element, {\n type: \"patchwork:contact\",\n });\n const currentContactUrl = () =>\n contactHandle()?.url as AutomergeUrl | undefined;\n\n const threadUrls = createMemo<AutomergeUrl[]>(() => {\n const entries = commentEntries();\n const threadUrls = new Set<AutomergeUrl>();\n for (const { threadUrl } of entries) {\n threadUrls.add(threadUrl);\n }\n return Array.from(threadUrls);\n });\n\n const threadTargetUrlMap = createMemo<Map<AutomergeUrl, AutomergeUrl[]>>(\n () => {\n const entries = commentEntries();\n const map = new Map<AutomergeUrl, AutomergeUrl[]>();\n for (const { targetUrl, threadUrl } of entries) {\n const existing = map.get(threadUrl);\n if (existing) {\n if (!existing.includes(targetUrl)) existing.push(targetUrl);\n } else {\n map.set(threadUrl, [targetUrl]);\n }\n }\n return map;\n }\n );\n\n const selectedHandles = useResolvedHandles(\n () => Object.keys(focusDoc()?.selection ?? {}) as AutomergeUrl[],\n repo\n );\n\n const threadTargetHandleMap = useResolvedHandleMap(threadTargetUrlMap, repo);\n\n // A thread is worth showing unless every one of its targets is a text range\n // that has collapsed to an empty string — see `targetIsVisible`.\n const threadsWithVisibleTarget = useThreadsWithVisibleTarget(\n threadTargetUrlMap,\n repo\n );\n\n // Document-level threads target the whole document (a bare url, no `/` path\n // or `#` heads).\n const docLevelThreadUrls = createMemo<Set<AutomergeUrl>>(() => {\n const map = threadTargetUrlMap();\n const set = new Set<AutomergeUrl>();\n for (const [threadUrl, targets] of map) {\n if (\n targets.length > 0 &&\n targets.every((t) => !t.includes(\"/\") && !t.includes(\"#\"))\n ) {\n set.add(threadUrl);\n }\n }\n return set;\n });\n\n // Threads that can overlap the editor's selection. Document-level threads\n // are left out: they cover the whole doc, so they'd match every selection.\n const renderableThreadUrls = createMemo<AutomergeUrl[]>(() =>\n threadUrls().filter(\n (url) =>\n threadsWithVisibleTarget().has(url) && !docLevelThreadUrls().has(url)\n )\n );\n\n const displayedThreadUrls = createMemo<AutomergeUrl[]>(() =>\n threadUrls().filter((url) => threadsWithVisibleTarget().has(url))\n );\n\n const overlappingThreads = createMemo<AutomergeUrl[]>(() =>\n renderableThreadUrls().filter((url) =>\n threadOverlapsSelection(\n threadTargetHandleMap().get(url) ?? [],\n selectedHandles()\n )\n )\n );\n\n // Tiebreaker for when several threads share the same range — without it\n // the second of two threads on the same target would be unselectable.\n const [pinnedThread, setPinnedThread] = createSignal<\n AutomergeUrl | undefined\n >();\n\n const primaryThreadUrl = createMemo<AutomergeUrl | undefined>(() => {\n const pinned = pinnedThread();\n // Document-level threads target the whole doc, so they have no range to\n // overlap the selection and never appear in `overlappingThreads`. The\n // only way for one to become primary is by being explicitly pinned\n // (clicked).\n if (pinned && docLevelThreadUrls().has(pinned)) return pinned;\n const overlaps = overlappingThreads();\n if (overlaps.length === 0) return undefined;\n if (pinned && overlaps.includes(pinned)) return pinned;\n return overlaps[0];\n });\n\n const secondaryThreadUrls = createMemo(() => {\n const p = primaryThreadUrl();\n return new Set(overlappingThreads().filter((u) => u !== p));\n });\n\n // The thread card under the pointer, which highlights its targets in place\n // of the primary thread's while hovered.\n const [hoveredThread, setHoveredThread] = createSignal<\n AutomergeUrl | undefined\n >();\n\n createEffect(() => {\n const handle = focusHandle();\n if (!handle) return;\n const p = hoveredThread() ?? primaryThreadUrl();\n const urls = p ? (threadTargetUrlMap().get(p) ?? []) : [];\n const desired: Record<AutomergeUrl, true> = {};\n for (const u of urls) desired[u] = true;\n handle.change((doc) => {\n doc.highlight = desired;\n });\n });\n\n // Clicking a thread card pins it and jumps `selection` to its targets;\n // the editor's next cursor move will overwrite `selection` again.\n const onSelectThread = (\n threadUrl: AutomergeUrl,\n targetUrls: AutomergeUrl[]\n ) => {\n const handle = focusHandle();\n if (!handle) return;\n const wasPrimary = primaryThreadUrl() === threadUrl;\n setPinnedThread(wasPrimary ? undefined : threadUrl);\n const next: Record<AutomergeUrl, true> = {};\n if (!wasPrimary) for (const u of targetUrls) next[u] = true;\n handle.change((doc) => {\n doc.selection = next;\n });\n };\n\n // Card clicks bubble up from the thread tool. Ignore clicks on interactive\n // controls (its buttons / draft textarea) so they don't also select.\n const onClickThreadCard = (e: MouseEvent, threadUrl: AutomergeUrl) => {\n const target = e.target as HTMLElement | null;\n if (\n target?.closest(\"textarea, button, input, a, select, .cm-editor\")\n )\n return;\n onSelectThread(threadUrl, threadTargetUrlMap().get(threadUrl) ?? []);\n };\n\n // The selection state we hand each thread tool via `data-thread-state`.\n const threadState = (threadUrl: AutomergeUrl): string =>\n primaryThreadUrl() === threadUrl\n ? \"primary\"\n : secondaryThreadUrls().has(threadUrl)\n ? \"secondary\"\n : \"inactive\";\n\n onCleanup(() => {\n const handle = focusHandle();\n if (!handle) return;\n handle.change((doc) => {\n doc.highlight = {} as Record<AutomergeUrl, true>;\n });\n });\n\n const canAddComment = () =>\n Boolean(targetDocUrl()) && Boolean(currentContactUrl());\n\n const onAddComment = async () => {\n const url = targetDocUrl();\n const contactUrl = currentContactUrl();\n if (!url || !contactUrl) return;\n const handle = await repo.find<DocWithComments>(url);\n createDocumentThread({ docHandle: handle, contactUrl });\n };\n\n return (\n <div class=\"comments-panel\">\n <div class=\"comments-panel-header\">\n <span class=\"comments-panel-header-title\">Comments</span>\n <Show when={canAddComment()}>\n <button\n class=\"comment-btn\"\n onClick={onAddComment}\n title=\"Comment on this document\"\n >\n Add comment\n </button>\n </Show>\n </div>\n <Show\n when={displayedThreadUrls().length > 0}\n fallback={<div class=\"comments-empty\">No comments yet</div>}\n >\n <For each={displayedThreadUrls()}>\n {(threadUrl) => (\n <div\n class=\"comments-thread\"\n onClick={(e) => onClickThreadCard(e, threadUrl)}\n onMouseEnter={() => setHoveredThread(threadUrl)}\n onMouseLeave={() =>\n setHoveredThread((u) => (u === threadUrl ? undefined : u))\n }\n >\n <patchwork-view\n doc-url={threadUrl}\n tool-id=\"comment-thread\"\n attr:data-thread-state={threadState(threadUrl)}\n />\n </div>\n )}\n </For>\n </Show>\n </div>\n );\n}\n\n// Open a `patchwork:comments` subscription scoped to `docUrl()` and re-open\n// it whenever the selected doc changes, clearing entries in between so the\n// previous document's comments don't linger. Returns the current doc's\n// entries (empty when nothing is selected).\nfunction useScopedCommentEntries(\n element: HTMLElement,\n docUrl: () => AutomergeUrl | undefined\n): () => CommentEntry[] {\n const [entries, setEntries] = createSignal<CommentEntry[]>([]);\n createEffect(() => {\n const url = docUrl();\n setEntries([]);\n if (!url) return;\n const unsubscribe = subscribeProvider<CommentEntry[]>(\n element,\n { type: \"patchwork:comments\", url },\n (value) => setEntries(value ?? [])\n );\n onCleanup(unsubscribe);\n });\n return entries;\n}\n\n// Reactively resolve a list of urls into live sub-handles. Re-resolves\n// whenever the url list changes; resolution is async (`repo.find`) so the\n// accessor lags one tick behind the urls.\nfunction useResolvedHandles(\n urls: () => AutomergeUrl[],\n repo: Repo\n): () => DocHandle<unknown>[] {\n const [handles, setHandles] = createSignal<DocHandle<unknown>[]>([]);\n createEffect(() => {\n const list = urls();\n let cancelled = false;\n Promise.all(list.map((u) => repo.find(u).catch(() => undefined))).then(\n (resolved) => {\n if (cancelled) return;\n setHandles(resolved.filter((h): h is DocHandle<unknown> => Boolean(h)));\n }\n );\n onCleanup(() => {\n cancelled = true;\n });\n });\n return handles;\n}\n\n// Same as `useResolvedHandles` but for a keyed map of url lists.\nfunction useResolvedHandleMap(\n map: () => Map<AutomergeUrl, AutomergeUrl[]>,\n repo: Repo\n): () => Map<AutomergeUrl, DocHandle<unknown>[]> {\n const [resolved, setResolved] = createSignal<\n Map<AutomergeUrl, DocHandle<unknown>[]>\n >(new Map());\n createEffect(() => {\n const m = map();\n let cancelled = false;\n void (async () => {\n const out = new Map<AutomergeUrl, DocHandle<unknown>[]>();\n for (const [key, urls] of m) {\n const handles = await Promise.all(\n urls.map((u) => repo.find(u).catch(() => undefined))\n );\n out.set(\n key,\n handles.filter((h): h is DocHandle<unknown> => Boolean(h))\n );\n }\n if (!cancelled) setResolved(out);\n })();\n onCleanup(() => {\n cancelled = true;\n });\n });\n return resolved;\n}\n\n// Resolves each thread's target urls into live span handles and reports which\n// threads have at least one visible target. Re-runs when the url map changes,\n// and recomputes live when any resolved target doc changes — so a thread whose\n// commented text gets deleted disappears without waiting for a re-resolve.\nfunction useThreadsWithVisibleTarget(\n map: () => Map<AutomergeUrl, AutomergeUrl[]>,\n repo: Repo\n): () => Set<AutomergeUrl> {\n const [visible, setVisible] = createSignal<Set<AutomergeUrl>>(new Set());\n createEffect(() => {\n const m = map();\n let cancelled = false;\n let resolved = new Map<AutomergeUrl, DocHandle<unknown>[]>();\n\n const recompute = () => {\n if (cancelled) return;\n const next = new Set<AutomergeUrl>();\n for (const [threadUrl, handles] of resolved) {\n if (handles.some(targetIsVisible)) next.add(threadUrl);\n }\n setVisible(next);\n };\n\n void (async () => {\n const out = new Map<AutomergeUrl, DocHandle<unknown>[]>();\n for (const [threadUrl, urls] of m) {\n const handles = await Promise.all(\n urls.map((u) => repo.find(u).catch(() => undefined))\n );\n out.set(\n threadUrl,\n handles.filter((h): h is DocHandle<unknown> => Boolean(h))\n );\n }\n if (cancelled) return;\n resolved = out;\n for (const h of flatHandles(resolved)) h.on(\"change\", recompute);\n recompute();\n })();\n\n onCleanup(() => {\n cancelled = true;\n for (const h of flatHandles(resolved)) h.off(\"change\", recompute);\n });\n });\n return visible;\n}\n\nfunction flatHandles(\n map: Map<AutomergeUrl, DocHandle<unknown>[]>\n): DocHandle<unknown>[] {\n const out: DocHandle<unknown>[] = [];\n for (const handles of map.values()) out.push(...handles);\n return out;\n}\n\n// A target is hidden only when it is a text range that has collapsed to an\n// empty string (the commented text was deleted). Every other target — a whole\n// document, a sub-doc path such as a notebook cell — stays listed.\nfunction targetIsVisible(handle: DocHandle<unknown>): boolean {\n const positions = handle.rangePositions();\n if (!positions) return true;\n const [start, end] = positions;\n return start !== end;\n}\n\n// A selected text range overlaps a ranged target; a selected sub-doc (such as\n// a notebook cell) matches a target at or inside it.\nfunction threadOverlapsSelection(\n targets: DocHandle<unknown>[],\n selection: DocHandle<unknown>[]\n): boolean {\n return targets.some((t) =>\n selection.some((s) => s.overlaps(t) || s.url === t.url || s.contains(t))\n );\n}\n\n","export const relativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const weeks = Math.floor(days / 7);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (seconds < 60) {\n return \"just now\";\n } else if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? \"\" : \"s\"} ago`;\n } else if (hours < 24) {\n return `${hours} hour${hours === 1 ? \"\" : \"s\"} ago`;\n } else if (days < 7) {\n return `${days} day${days === 1 ? \"\" : \"s\"} ago`;\n } else if (weeks < 4) {\n return `${weeks} week${weeks === 1 ? \"\" : \"s\"} ago`;\n } else if (months < 12) {\n return `${months} month${months === 1 ? \"\" : \"s\"} ago`;\n } else {\n return `${years} year${years === 1 ? \"\" : \"s\"} ago`;\n }\n};\n","// Shared markup logic. cute.txt stores delimiters/tokens in the text itself and\n// removes/replaces them at *render* time. The schema has three kinds:\n// - marks: a `pattern` whose group 1 is inner text to style (e.g. *bold*).\n// - blocks: a `pattern` matching a whole token that renders as a block-level\n// element (embeds, code fences, <think> blocks).\n// - replaces: like blocks but inline (emoji, and other inline token->element).\n// Blocks and replaces are the same mechanism (\"atom\": a token replaced by an\n// element, revealed on cursor); they differ only in block vs inline display.\n//\n// Both the CodeMirror adapter (flat offset ranges) and the static renderer (a\n// tree) are built on these patterns.\nfunction scanFlags(re) {\n return \"g\" + (re.flags.includes(\"i\") ? \"i\" : \"\");\n}\nfunction scanAtoms(text, specs, block, out) {\n for (const [name, spec] of Object.entries(specs || {})) {\n if (!spec.pattern)\n continue;\n const re = new RegExp(spec.pattern.source, scanFlags(spec.pattern));\n let m;\n while ((m = re.exec(text))) {\n if (!m[0]) {\n re.lastIndex = m.index + 1;\n continue;\n }\n out.push({\n kind: \"atom\",\n name,\n spec,\n block,\n start: m.index,\n end: m.index + m[0].length,\n attrs: spec.parse ? spec.parse(m[0]) : {},\n });\n }\n }\n}\n// Flat, non-overlapping ranges for the editor. Greedy: earliest start wins, ties\n// broken by longer span; overlapping candidates are dropped. Items are kind \"mark\"\n// {start,innerStart,innerEnd,end,attrs} or kind \"atom\" {start,end,attrs,block}.\nexport function findMarkupRanges(text, schema) {\n const candidates = [];\n for (const [name, spec] of Object.entries(schema.marks || {})) {\n if (!spec.pattern)\n continue;\n const re = new RegExp(spec.pattern.source, scanFlags(spec.pattern));\n let m;\n while ((m = re.exec(text))) {\n const inner = m[1];\n if (!inner) {\n re.lastIndex = m.index + 1;\n continue;\n }\n const start = m.index;\n const openLen = m[0].indexOf(inner);\n candidates.push({\n kind: \"mark\",\n name,\n spec,\n start,\n innerStart: start + openLen,\n innerEnd: start + openLen + inner.length,\n end: start + m[0].length,\n attrs: spec.parse ? spec.parse(m[0]) : undefined,\n });\n }\n }\n scanAtoms(text, schema.blocks, true, candidates);\n scanAtoms(text, schema.replaces, false, candidates);\n candidates.sort((a, b) => a.start - b.start || b.end - b.start - (a.end - a.start));\n const accepted = [];\n let lastEnd = 0;\n for (const c of candidates) {\n if (c.start < lastEnd)\n continue;\n accepted.push(c);\n lastEnd = c.end;\n }\n return accepted;\n}\n// Parse into a tree of {text} | {mark, attrs, children} | {atom, attrs, block} for\n// the static renderer. Recurses into mark inner content, so nested marks nest.\nexport function parseMarkup(text, schema) {\n const nodes = [];\n let best = null; // {kind, spec, m, block?}\n const consider = (specs, kind, block) => {\n for (const [, spec] of Object.entries(specs || {})) {\n if (!spec.pattern)\n continue;\n const re = new RegExp(spec.pattern.source, scanFlags(spec.pattern).replace(\"g\", \"\"));\n const m = re.exec(text);\n const ok = kind === \"mark\" ? m && m[1] : m && m[0];\n if (ok && (best === null || m.index < best.m.index))\n best = { kind, spec, m, block };\n }\n };\n consider(schema.marks, \"mark\");\n consider(schema.blocks, \"atom\", true);\n consider(schema.replaces, \"atom\", false);\n if (!best) {\n if (text)\n nodes.push({ text });\n return nodes;\n }\n const { kind, spec, m, block } = best;\n if (m.index > 0)\n nodes.push({ text: text.slice(0, m.index) });\n if (kind === \"mark\") {\n // Recurse into the inner content for nesting — but only if delimiters were\n // actually stripped (inner is a proper substring). A \"mark\" whose group 1 is\n // the whole match (e.g. the autolink URL, no delimiters) would otherwise\n // re-match itself on the identical string forever, so treat it as a leaf.\n const inner = m[1];\n // `raw` marks (e.g. inline code) never format their contents; and a mark whose\n // group 1 is the whole match (no delimiters) can't recurse without looping.\n const leaf = spec.raw || inner.length >= m[0].length;\n nodes.push({\n mark: spec,\n attrs: spec.parse ? spec.parse(m[0]) : undefined,\n children: leaf ? [{ text: inner }] : parseMarkup(inner, schema),\n });\n }\n else {\n nodes.push({ atom: spec, attrs: spec.parse ? spec.parse(m[0]) : {}, block });\n }\n for (const n of parseMarkup(text.slice(m.index + m[0].length), schema))\n nodes.push(n);\n return nodes;\n}\n// Strip delimiters/tokens to plain text (titles, aria-labels, search).\nexport function toPlainText(text, schema) {\n const flatten = (node) => node.text != null ? node.text : node.children ? node.children.map(flatten).join(\"\") : \"\";\n return parseMarkup(text, schema).map(flatten).join(\"\");\n}\n// HTML escaping, shared by the DOM-free string renderer (html.js) and the block/\n// replace `toHTML` specs. `escapeHTML` for text content, `escapeAttr` for\n// double-quoted attribute values. Kept here (the DOM-free markup util) so both\n// html.js and schema.js can use one implementation without an import cycle.\nconst HTML_ESCAPE = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" };\nexport const escapeHTML = (s) => String(s ?? \"\").replace(/[&<>]/g, (c) => HTML_ESCAPE[c]);\nexport const escapeAttr = (s) => String(s ?? \"\").replace(/[&<>\"']/g, (c) => HTML_ESCAPE[c]);\n//# sourceMappingURL=markup.js.map","// The cute.txt live-preview, as a standalone CodeMirror extension — usable on ANY\n// EditorView (cute.txt's own editor, or a host's input box). It renders the plain\n// delimiter-containing text nicely:\n// - marks: hide the delimiter characters and style the inner text, UNLESS the\n// caret is inside the span (reveal-on-cursor) so you can edit the raw source.\n// - atoms (blocks/replaces): replace the whole token with a widget mounting the\n// element (e.g. <patchwork-view>, an emoji); reveal on cursor at the start edge.\n// - Mod-B/I/U wrap the selection in a delimiter.\n// - (optional, when a `repo` is given) pasting an image creates a file doc and\n// inserts an embed token; dropping a patchwork doc inserts an embed token.\n//\n// cutePreview(getSchema, {repo?, getToolsForDoc?}) -> Extension[]\n//\n// getSchema() is read on each recompute so the schema can be dynamic. Decorations\n// come from a StateField (required — block/multi-line replaces can't be provided by\n// a ViewPlugin) and are computed from transaction state, so no dispatch is needed.\nimport { StateField } from \"@codemirror/state\";\nimport { EditorView, Decoration, WidgetType, keymap } from \"@codemirror/view\";\nimport { findMarkupRanges } from \"./markup.js\";\n// ---------------------------------------------------------------------------\n// embed tool-picker (a little \"▾ tool\" control on embed widgets)\n// ---------------------------------------------------------------------------\n// Patch an embed token in place (tool-id, size, …). Resolves the token's live range\n// from the widget's DOM position (so it survives edits above it), then swaps in a\n// fresh token merging `patch` over the existing attrs (so changing the tool keeps\n// the size, and resizing keeps the tool).\nfunction embedRangeForDOM(view, dom, schema) {\n const embeds = Array.from(view.dom.querySelectorAll(\".cutetxt-embed\"));\n const index = embeds.indexOf(dom);\n if (index < 0)\n return null;\n return findMarkupRanges(view.state.doc.toString(), schema).filter((x) => x.kind === \"atom\" && x.name === \"embed\")[index];\n}\nfunction setEmbedAttrs(view, dom, schema, patch) {\n const embed = schema.blocks && schema.blocks.embed;\n if (!embed)\n return;\n const r = embedRangeForDOM(view, dom, schema);\n if (!r)\n return;\n const nextAttrs = { ...r.attrs, ...patch };\n if (Object.keys(patch).every((key) => String(r.attrs[key] || \"\") === String(nextAttrs[key] || \"\")))\n return;\n const token = embed.token(nextAttrs);\n view.dispatch({ changes: { from: r.start, to: r.end, insert: token }, userEvent: \"input\" });\n}\nfunction editEmbedToken(view, dom, schema) {\n const r = embedRangeForDOM(view, dom, schema);\n if (!r)\n return;\n view.dispatch({ selection: { anchor: r.start }, scrollIntoView: true, userEvent: \"select\" });\n view.focus();\n}\nfunction deleteEmbedToken(view, dom, schema) {\n const r = embedRangeForDOM(view, dom, schema);\n if (!r)\n return;\n const doc = view.state.doc;\n let from = r.start;\n let to = r.end;\n if (to < doc.length && doc.sliceString(to, to + 1) === \"\\n\")\n to++;\n else if (from > 0 && doc.sliceString(from - 1, from) === \"\\n\")\n from--;\n view.dispatch({\n changes: { from, to, insert: \"\" },\n selection: { anchor: from },\n userEvent: \"delete\",\n });\n view.focus();\n}\nfunction embedIconButton(label, title, onClick) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cutetxt-embed-icon\";\n if (label === \"x\")\n button.classList.add(\"cutetxt-embed-delete\");\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.addEventListener(\"mousedown\", (event) => event.preventDefault());\n button.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n onClick();\n });\n return button;\n}\nfunction buildToolPicker(view, wrap, schema, picker, attrs) {\n const holder = document.createElement(\"span\");\n holder.className = \"cutetxt-embed-picker\";\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cutetxt-embed-tool\";\n button.textContent = (attrs.toolId || \"tool\") + \" ▾\";\n holder.append(button);\n let menu = null;\n const closeMenu = () => {\n if (!menu)\n return;\n menu.remove();\n menu = null;\n document.removeEventListener(\"mousedown\", onDocDown, true);\n };\n const onDocDown = (event) => {\n if (!holder.contains(event.target))\n closeMenu();\n };\n button.addEventListener(\"mousedown\", (event) => event.preventDefault());\n button.addEventListener(\"click\", async (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (menu)\n return closeMenu();\n menu = document.createElement(\"div\");\n menu.className = \"cutetxt-embed-menu\";\n menu.textContent = \"…\";\n holder.append(menu);\n document.addEventListener(\"mousedown\", onDocDown, true);\n let tools = [];\n try {\n tools = (await picker(attrs.url)) || [];\n }\n catch {\n tools = [];\n }\n if (!menu)\n return;\n menu.textContent = \"\";\n if (!tools.length) {\n menu.textContent = \"no tools\";\n return;\n }\n for (const tool of tools) {\n const item = document.createElement(\"button\");\n item.type = \"button\";\n item.className = \"cutetxt-embed-menu-item\";\n if (tool.id === attrs.toolId)\n item.classList.add(\"is-current\");\n item.textContent = tool.name || tool.id;\n item.addEventListener(\"mousedown\", (ev) => ev.preventDefault());\n item.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n closeMenu();\n setEmbedAttrs(view, wrap, schema, { toolId: tool.id });\n });\n menu.append(item);\n }\n });\n return holder;\n}\n// ---------------------------------------------------------------------------\n// decorations\n// ---------------------------------------------------------------------------\n// An atom (block or replace): the whole token is replaced by its rendered element.\n// `block` toggles div (block-level) vs span (inline) so display matches the kind.\nclass AtomWidget extends WidgetType {\n spec;\n attrs;\n block;\n name;\n schema;\n picker;\n repo;\n key;\n cleanup;\n constructor(spec, attrs, block, name, schema, picker, repo) {\n super();\n this.spec = spec;\n this.attrs = attrs;\n this.block = block;\n this.name = name;\n this.schema = schema;\n this.picker = picker;\n this.repo = repo;\n const keyAttrs = name === \"embed\" ? { url: attrs.url, toolId: attrs.toolId } : attrs;\n this.key = (block ? \"b:\" : \"r:\") + name + \":\" + (spec.token ? spec.token(keyAttrs) : JSON.stringify(keyAttrs));\n }\n eq(other) {\n return other.key === this.key;\n }\n updateDOM(dom, view, from) {\n if (this.name !== \"embed\" || from.name !== \"embed\")\n return false;\n if (this.attrs.url !== from.attrs.url || this.attrs.toolId !== from.attrs.toolId)\n return false;\n this.cleanup = from.cleanup;\n const body = dom.querySelector(\".cutetxt-embed-body\");\n if (this.attrs.width)\n dom.style.width = this.attrs.width + \"px\";\n else\n dom.style.removeProperty(\"width\");\n if (body instanceof HTMLElement) {\n if (this.attrs.height)\n body.style.height = this.attrs.height + \"px\";\n else\n body.style.removeProperty(\"height\");\n }\n return true;\n }\n toDOM(view) {\n const wrap = document.createElement(this.block ? \"div\" : \"span\");\n wrap.className = this.block ? \"cutetxt-block\" : \"cutetxt-replace\";\n wrap.contentEditable = \"false\";\n const node = this.spec.toDOM(this.attrs);\n if (this.name === \"embed\") {\n const bar = document.createElement(\"div\");\n bar.className = \"cutetxt-embed-bar\";\n bar.title = \"Edit embed token\";\n bar.addEventListener(\"mousedown\", (event) => {\n if (event.target.closest(\"button, .cutetxt-embed-menu\"))\n return;\n event.preventDefault();\n });\n bar.addEventListener(\"click\", (event) => {\n if (event.target.closest(\"button, .cutetxt-embed-menu\"))\n return;\n event.preventDefault();\n event.stopPropagation();\n editEmbedToken(view, wrap, this.schema);\n });\n const title = document.createElement(\"span\");\n title.className = \"cutetxt-embed-title\";\n title.textContent = this.attrs.toolId || \"embed\";\n bar.append(title);\n const actions = document.createElement(\"span\");\n actions.className = \"cutetxt-embed-actions\";\n actions.append(embedIconButton(\"x\", \"Delete embed\", () => deleteEmbedToken(view, wrap, this.schema)));\n if (this.picker)\n actions.prepend(buildToolPicker(view, wrap, this.schema, this.picker, this.attrs));\n bar.append(actions);\n const body = document.createElement(\"div\");\n body.className = \"cutetxt-embed-body\";\n if (node instanceof Node)\n body.append(node);\n else if (typeof node === \"string\")\n body.append(document.createTextNode(node));\n const handle = document.createElement(\"div\");\n handle.className = \"cutetxt-embed-resize\";\n handle.title = \"Resize\";\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-label\", \"Resize embed\");\n wrap.append(bar, body, handle);\n this.setupTitle(title);\n this.setupResize(view, wrap, body, handle, node);\n }\n else {\n if (node instanceof Node)\n wrap.append(node);\n else if (typeof node === \"string\")\n wrap.append(document.createTextNode(node));\n }\n return wrap;\n }\n coordsAt(dom, _pos, side) {\n const rect = dom.getBoundingClientRect();\n const left = side > 0 ? rect.right : rect.left;\n return { left, right: left, top: rect.top, bottom: rect.bottom };\n }\n setCleanup(fn) {\n const prev = this.cleanup;\n this.cleanup = prev\n ? () => {\n prev();\n fn();\n }\n : fn;\n }\n setupTitle(title) {\n const fallback = this.attrs.toolId || \"embed\";\n const apply = (doc) => {\n const patchwork = doc && doc[\"@patchwork\"];\n title.textContent = (patchwork && patchwork.title) || (doc && (doc.title || doc.name)) || fallback;\n };\n title.textContent = fallback;\n if (!this.repo || !this.attrs.url)\n return;\n let handle = null;\n let disposed = false;\n const refresh = () => {\n if (!disposed && handle)\n apply(handle.doc());\n };\n this.repo\n .find(this.attrs.url)\n .then((h) => {\n if (disposed)\n return;\n handle = h;\n refresh();\n handle.on?.(\"change\", refresh);\n })\n .catch(() => { });\n this.setCleanup(() => {\n disposed = true;\n handle?.off?.(\"change\", refresh);\n });\n }\n // Make the embed frame resizable. Width/height stored in the token describe the\n // embedded tool viewport, not the frame chrome around it.\n setupResize(view, wrap, body, handle, node) {\n wrap.classList.add(\"cutetxt-embed\");\n if (this.attrs.width)\n wrap.style.width = this.attrs.width + \"px\";\n if (this.attrs.height)\n body.style.height = this.attrs.height + \"px\";\n if (node instanceof HTMLElement) {\n node.style.width = \"100%\";\n node.style.height = \"100%\";\n node.style.display = \"block\";\n }\n let drag = null;\n const onDown = (event) => {\n event.preventDefault();\n event.stopPropagation();\n handle.setPointerCapture?.(event.pointerId);\n drag = {\n id: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n width: wrap.getBoundingClientRect().width,\n height: body.getBoundingClientRect().height,\n moved: false,\n };\n wrap.classList.add(\"is-resizing\");\n };\n const onMove = (event) => {\n if (!drag || event.pointerId !== drag.id)\n return;\n event.preventDefault();\n const w = Math.max(160, Math.round(drag.width + event.clientX - drag.x));\n const h = Math.max(88, Math.round(drag.height + event.clientY - drag.y));\n drag.moved = drag.moved || w !== Math.round(drag.width) || h !== Math.round(drag.height);\n wrap.style.width = w + \"px\";\n body.style.height = h + \"px\";\n };\n const onUp = (event) => {\n if (!drag || event.pointerId !== drag.id)\n return;\n handle.releasePointerCapture?.(event.pointerId);\n wrap.classList.remove(\"is-resizing\");\n const moved = drag.moved;\n drag = null;\n if (!moved)\n return;\n const w = Math.round(body.clientWidth);\n const h = Math.round(body.clientHeight);\n if (w && h)\n setEmbedAttrs(view, wrap, this.schema, { width: w, height: h });\n };\n const onCancel = (event) => {\n if (!drag || event.pointerId !== drag.id)\n return;\n handle.releasePointerCapture?.(event.pointerId);\n drag = null;\n wrap.classList.remove(\"is-resizing\");\n };\n handle.addEventListener(\"pointerdown\", onDown);\n handle.addEventListener(\"pointermove\", onMove);\n handle.addEventListener(\"pointerup\", onUp);\n handle.addEventListener(\"pointercancel\", onCancel);\n this.setCleanup(() => {\n handle.removeEventListener(\"pointerdown\", onDown);\n handle.removeEventListener(\"pointermove\", onMove);\n handle.removeEventListener(\"pointerup\", onUp);\n handle.removeEventListener(\"pointercancel\", onCancel);\n });\n }\n destroy() {\n if (this.cleanup)\n this.cleanup();\n }\n ignoreEvent() {\n return true;\n }\n}\n// Build the decoration set from editor STATE (doc + selection) — no view needed, so\n// this can run inside a StateField's create/update.\nfunction buildDecorations(state, schema, picker, repo) {\n const text = state.doc.toString();\n const sel = state.selection.main;\n const decos = [];\n for (const r of findMarkupRanges(text, schema)) {\n // Reveal on cursor. A mark reveals only when the caret is strictly inside it, so\n // a caret at the end (just after typing the closer) styles immediately. An atom\n // is *entirely* replaced by a widget, so the caret can never sit inside it —\n // also reveal when the caret rests at its start boundary, which is how you\n // cursor back into a block/replace to edit its raw source again.\n const overlaps = sel.from < r.end && sel.to > r.start;\n const atStart = r.kind === \"atom\" && sel.empty && sel.from === r.start;\n const atEnd = r.kind === \"atom\" && sel.empty && sel.from === r.end;\n if (overlaps || atStart || atEnd)\n continue; // revealed: raw source\n if (r.kind === \"atom\") {\n decos.push(Decoration.replace({\n widget: new AtomWidget(r.spec, r.attrs, r.block, r.name, schema, picker, repo),\n block: r.block,\n }).range(r.start, r.end));\n continue;\n }\n const [tagName, dom] = r.spec.toDOM(r.attrs);\n let cls;\n let attributes;\n if (dom) {\n const { class: c, ...rest } = dom;\n cls = c;\n if (Object.keys(rest).length)\n attributes = rest;\n }\n if (r.innerStart > r.start)\n decos.push(Decoration.replace({}).range(r.start, r.innerStart));\n decos.push(Decoration.mark({ tagName, class: cls, attributes }).range(r.innerStart, r.innerEnd));\n if (r.end > r.innerEnd)\n decos.push(Decoration.replace({}).range(r.innerEnd, r.end));\n }\n return Decoration.set(decos, true);\n}\n// A StateField is required: block/multi-line replace decorations (code fences,\n// <think>, embeds) can't be provided by a ViewPlugin. It recomputes from tr.state\n// on any doc/selection change — no dispatch, no deferral.\nfunction previewField(getSchema, getToolsForDoc, repo) {\n return StateField.define({\n create: (state) => buildDecorations(state, getSchema(), getToolsForDoc, repo),\n update(value, tr) {\n if (tr.docChanged || tr.selection)\n return buildDecorations(tr.state, getSchema(), getToolsForDoc, repo);\n return value.map(tr.changes);\n },\n provide: (f) => EditorView.decorations.from(f),\n });\n}\n// ---------------------------------------------------------------------------\n// keymap + insertion\n// ---------------------------------------------------------------------------\nfunction wrapSelection(view, delim) {\n const { from, to } = view.state.selection.main;\n view.dispatch({\n changes: [\n { from, insert: delim },\n { to, insert: delim },\n ],\n selection: { anchor: from + delim.length, head: to + delim.length },\n userEvent: \"input\",\n });\n}\n// Bind the standard Mod-B/I/U (the keys the built-in marks use); the wrap delimiter\n// is resolved from the live schema at press time so dynamically-loaded marks still\n// work. A mark with a novel `key` beyond these is not bound here.\nconst MARK_KEYS = [\"Mod-b\", \"Mod-i\", \"Mod-u\"];\nfunction markKeymap(getSchema) {\n return keymap.of(MARK_KEYS.map((k) => ({\n key: k,\n preventDefault: true,\n run(view) {\n const marks = (getSchema() || {}).marks || {};\n for (const spec of Object.values(marks)) {\n if (spec.key === k && spec.wrap) {\n wrapSelection(view, spec.wrap);\n return true;\n }\n }\n return false;\n },\n })));\n}\nfunction embedToken(schema, attrs) {\n const spec = schema.blocks && schema.blocks.embed;\n return spec && spec.token ? spec.token(attrs) : \"\";\n}\nfunction insertText(view, text) {\n const pos = view.state.selection.main.from;\n view.dispatch({\n changes: { from: pos, insert: text },\n selection: { anchor: pos + text.length },\n userEvent: \"input\",\n });\n}\nfunction extensionForFile(file, mimeType) {\n const fromName = file.name && file.name.includes(\".\") ? file.name.split(\".\").pop() : \"\";\n return (fromName || (mimeType.split(\"/\")[1] || \"bin\").split(\"+\")[0] || \"bin\").toLowerCase();\n}\nasync function createFileToken(schema, repo, file) {\n if (!repo || !file)\n return \"\";\n const buffer = new Uint8Array(await file.arrayBuffer());\n const mimeType = file.type || \"application/octet-stream\";\n const extension = extensionForFile(file, mimeType);\n const name = file.name || `file.${extension}`;\n const fileHandle = await repo.create2({\n content: buffer,\n extension,\n mimeType,\n name,\n \"@patchwork\": { type: \"file\" },\n });\n return embedToken(schema, { url: fileHandle.url, toolId: \"file\" });\n}\nasync function insertFileBlob(view, schema, repo, file) {\n const token = await createFileToken(schema, repo, file);\n if (token)\n insertText(view, token);\n}\nasync function insertDroppedFiles(view, schema, repo, files, at) {\n if (!repo || !files.length)\n return false;\n const tokens = [];\n for (const file of files) {\n const token = await createFileToken(schema, repo, file);\n if (token)\n tokens.push(token);\n }\n if (!tokens.length)\n return false;\n const insert = tokens.map((token) => token + \"\\n\").join(\"\");\n view.dispatch({\n changes: { from: at, insert },\n selection: { anchor: at + insert.length },\n userEvent: \"input\",\n });\n return true;\n}\n// Parse a patchwork sidebar drag payload into an automerge url.\nfunction docUrlFromDrop(dataTransfer) {\n if (!dataTransfer)\n return null;\n const dnd = dataTransfer.getData(\"text/x-patchwork-dnd\");\n if (dnd) {\n try {\n const url = JSON.parse(dnd)?.items?.[0]?.url;\n if (url)\n return url;\n }\n catch { }\n }\n const urls = dataTransfer.getData(\"text/x-patchwork-urls\");\n if (urls) {\n try {\n const parsed = JSON.parse(urls);\n if (Array.isArray(parsed) && parsed[0])\n return parsed[0];\n }\n catch { }\n }\n const text = dataTransfer.getData(\"text/uri-list\") || dataTransfer.getData(\"text/plain\");\n const match = (text || \"\").match(/automerge:[A-Za-z0-9]+/);\n return match ? match[0] : null;\n}\nfunction dndHandlers(getSchema, repo) {\n return EditorView.domEventHandlers({\n paste(event, view) {\n const items = event.clipboardData && event.clipboardData.items;\n if (!items)\n return false;\n for (const item of items) {\n if (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n event.preventDefault();\n insertFileBlob(view, getSchema(), repo, item.getAsFile());\n return true;\n }\n }\n return false;\n },\n dragover(event) {\n if ((event.dataTransfer?.files && event.dataTransfer.files.length) || docUrlFromDrop(event.dataTransfer)) {\n event.preventDefault();\n if (event.dataTransfer)\n event.dataTransfer.dropEffect = \"copy\";\n return true;\n }\n return false;\n },\n drop(event, view) {\n const files = Array.from(event.dataTransfer?.files || []);\n if (files.length) {\n event.preventDefault();\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n const at = pos == null ? view.state.selection.main.from : pos;\n insertDroppedFiles(view, getSchema(), repo, files, at);\n return true;\n }\n const url = docUrlFromDrop(event.dataTransfer);\n if (!url)\n return false;\n event.preventDefault();\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n const token = embedToken(getSchema(), { url });\n if (!token)\n return false;\n const at = pos == null ? view.state.selection.main.from : pos;\n const insert = token + \"\\n\";\n view.dispatch({\n changes: { from: at, insert },\n selection: { anchor: at + insert.length },\n userEvent: \"input\",\n });\n return true;\n },\n });\n}\n// ---------------------------------------------------------------------------\n// factory\n// ---------------------------------------------------------------------------\nexport function cutePreview(getSchema, opts = {}) {\n const { repo, getToolsForDoc } = opts;\n const exts = [previewField(getSchema, getToolsForDoc, repo), markKeymap(getSchema)];\n if (repo)\n exts.push(dndHandlers(getSchema, repo));\n return exts;\n}\n//# sourceMappingURL=preview.js.map","// A standalone, dependency-free completion popup as a CodeMirror extension —\n// usable on ANY EditorView (cute.txt's own editor, or a host's input editor).\n//\n// cuteAutocomplete(getSpecs, opts?) -> Extension[]\n//\n// getSpecs(): the current autocomplete specs, read fresh each keystroke so they can\n// be dynamic (presence, async data, plugin (un)load). Each spec:\n// { trigger: RegExp (anchored at $, tested against the caret-prefix),\n// options(query, ctx) -> [opt] | Promise<[opt]> }\n// opt: { label, insert,\n// detail?, description?, // secondary text\n// icon?: {kind:\"emoji\",char} | {kind:\"image\",src} | {kind:\"person\"} | {kind:\"none\"},\n// replace?: \"match\" (default: [tokenStart, caret]) | \"all\" (whole doc) | \"line\" }\n//\n// opts: { className?, itemClass?, max?, renderRow?(opt, {index, active}) -> HTMLElement }\n// renderRow lets a host emit its own markup (cute.txt still wires selection/accept).\nimport { Prec } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, keymap } from \"@codemirror/view\";\nconst DEFAULTS = { className: \"cutetxt-autocomplete\", itemClass: \"cutetxt-ac-item\", max: 10 };\nfunction defaultRow(opt, active, cfg) {\n const row = document.createElement(\"div\");\n row.className = cfg.itemClass + (active ? \" is-active\" : \"\");\n if (opt.icon && opt.icon.kind === \"image\") {\n const img = document.createElement(\"img\");\n img.className = \"cutetxt-ac-icon\";\n img.src = opt.icon.src;\n row.append(img);\n }\n else if (opt.icon && opt.icon.kind === \"emoji\") {\n const span = document.createElement(\"span\");\n span.className = \"cutetxt-ac-icon\";\n span.textContent = opt.icon.char;\n row.append(span);\n }\n const label = document.createElement(\"span\");\n label.className = \"cutetxt-ac-label\";\n label.textContent = opt.label;\n row.append(label);\n if (opt.description != null) {\n const d = document.createElement(\"span\");\n d.className = \"cutetxt-ac-desc\";\n d.textContent = String(opt.description);\n row.append(d);\n }\n if (opt.detail != null) {\n const d = document.createElement(\"span\");\n d.className = \"cutetxt-ac-detail\";\n d.textContent = String(opt.detail);\n row.append(d);\n }\n return row;\n}\nexport function cuteAutocomplete(getSpecs, opts = {}) {\n const cfg = { ...DEFAULTS, ...opts };\n // Normalize each spec's trigger regex once (strip global flag so exec() has a\n // stable lastIndex), memoized by spec identity so we don't rebuild per keystroke.\n const normCache = new WeakMap();\n const norm = (spec) => {\n let n = normCache.get(spec);\n if (!n) {\n n = { ...spec, trigger: new RegExp(spec.trigger.source, spec.trigger.flags.replace(\"g\", \"\")) };\n normCache.set(spec, n);\n }\n return n;\n };\n let popup = null;\n let state = null; // {from, options, index}\n let reqId = 0;\n const close = () => {\n state = null;\n if (popup) {\n popup.remove();\n popup = null;\n }\n };\n function render(view) {\n if (!state)\n return close();\n if (!popup) {\n popup = document.createElement(\"div\");\n popup.className = cfg.className;\n popup.contentEditable = \"false\";\n document.body.appendChild(popup);\n }\n popup.replaceChildren();\n state.options.forEach((opt, i) => {\n const active = i === state.index;\n const row = cfg.renderRow ? cfg.renderRow(opt, { index: i, active }) : defaultRow(opt, active, cfg);\n // mousedown (not click) + preventDefault keeps the editor focused.\n row.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n state.index = i;\n accept(view);\n });\n popup.append(row);\n });\n positionPopup(view);\n }\n // Place the (fixed-position) popup at the caret, flipping above when it would\n // overflow the bottom of the viewport and clamping horizontally so it stays on\n // screen. Measured after the rows are in the DOM so the size is real.\n function positionPopup(view) {\n if (!popup || !state)\n return;\n const coords = view.coordsAtPos(state.from);\n if (!coords)\n return;\n const margin = 6;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const rect = popup.getBoundingClientRect();\n // target = where we want the popup's top-left, in VIEWPORT coords.\n let left = coords.left;\n if (left + rect.width > vw - margin)\n left = vw - rect.width - margin;\n if (left < margin)\n left = margin;\n // Prefer below the caret; flip above if it would overrun the bottom and there's\n // more room above (matches how a bottom-anchored chat input wants to open up).\n const below = coords.bottom + margin;\n const above = coords.top - rect.height - margin;\n const roomBelow = vh - coords.bottom;\n const roomAbove = coords.top;\n const top = below + rect.height > vh - margin && roomAbove > roomBelow ? Math.max(margin, above) : below;\n popup.style.left = left + \"px\";\n popup.style.top = top + \"px\";\n // `position: fixed` is only viewport-relative when no ancestor establishes a\n // containing block. A `contain: layout/paint/strict` (or transform/filter/\n // will-change) ancestor re-bases it, so our viewport target lands off by the\n // ancestor's offset. Measure where it actually ended up and nudge by the delta\n // — self-correcting whatever the containing block is.\n const after = popup.getBoundingClientRect();\n const dx = left - after.left;\n const dy = top - after.top;\n if (dx || dy) {\n popup.style.left = left + dx + \"px\";\n popup.style.top = top + dy + \"px\";\n }\n }\n function accept(view) {\n if (!state)\n return false;\n const opt = state.options[state.index];\n if (!opt)\n return false;\n const head = view.state.selection.main.head;\n let from = state.from;\n let to = head;\n if (opt.replace === \"all\") {\n from = 0;\n to = view.state.doc.length;\n }\n else if (opt.replace === \"line\") {\n const line = view.state.doc.lineAt(head);\n from = line.from;\n to = line.to;\n }\n view.dispatch({\n changes: { from, to, insert: opt.insert },\n selection: { anchor: from + opt.insert.length },\n userEvent: \"input.complete\",\n });\n close();\n return true;\n }\n function move(view, delta) {\n if (!state)\n return false;\n state.index = (state.index + delta + state.options.length) % state.options.length;\n render(view);\n return true;\n }\n async function refresh(view) {\n const sel = view.state.selection.main;\n if (!sel.empty || !view.hasFocus)\n return close();\n const line = view.state.doc.lineAt(sel.head);\n const before = view.state.doc.sliceString(line.from, sel.head);\n for (const raw of getSpecs()) {\n const spec = norm(raw);\n const m = spec.trigger.exec(before);\n if (!m)\n continue;\n const from = sel.head - m[0].length;\n const id = ++reqId;\n let opts;\n try {\n opts = await spec.options(m[1] ?? \"\", { view });\n }\n catch {\n opts = [];\n }\n if (id !== reqId)\n return; // superseded by a newer keystroke\n opts = (opts || []).slice(0, cfg.max);\n if (!opts.length)\n return close();\n const prev = state && state.options[state.index] && state.options[state.index].label;\n const keep = opts.findIndex((o) => o.label === prev);\n state = { from, options: opts, index: keep < 0 ? 0 : keep };\n render(view);\n return;\n }\n close();\n }\n // Recompute on any doc/selection/focus change. Reads only (no dispatch), so it's\n // safe to run inside the update cycle.\n const listener = EditorView.updateListener.of((update) => {\n if (update.docChanged || update.selectionSet || update.focusChanged)\n refresh(update.view);\n });\n // Remove the body-appended popup when the view is torn down.\n const cleanup = ViewPlugin.define(() => ({ destroy: close }));\n // High precedence so these win over default bindings — but only while open (each\n // returns false when there's no popup, letting the key through to the host).\n const keys = Prec.highest(keymap.of([\n { key: \"ArrowDown\", run: (view) => move(view, 1) },\n { key: \"ArrowUp\", run: (view) => move(view, -1) },\n { key: \"Enter\", run: (view) => accept(view) },\n { key: \"Tab\", run: (view) => accept(view) },\n {\n key: \"Escape\",\n run: () => {\n if (!state)\n return false;\n close();\n return true;\n },\n },\n ]));\n return [cleanup, listener, keys];\n}\n//# sourceMappingURL=autocomplete.js.map","// The CodeMirror adapter binding a plain automerge string field to a live editor.\n// The body *contains* its delimiters/tokens (e.g. `*bold*`, `<patchwork-view …/>`);\n// the live-preview (marks hidden/styled, atoms rendered as widgets, reveal on\n// cursor, Mod-B/I/U, image paste, doc drop) is the standalone `cutePreview`\n// extension — this file adds the text sync on top:\n// - CodeMirror <-> the automerge field via am.splice (nothing in this repo uses\n// @automerge/automerge-codemirror; we hand-roll on am.splice), with a\n// minimal-diff reconcile for remote edits.\n//\n// Needs the DocHandle surface { doc(), change(fn), on, off } and, for image paste /\n// file docs, a `repo`.\nimport { Annotation } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\nimport * as am from \"@automerge/automerge\";\nimport { cutePreview } from \"./preview.js\";\nimport { cuteAutocomplete } from \"./autocomplete.js\";\nfunction getText(doc, path) {\n let node = doc;\n for (const key of path)\n node = node == null ? node : node[key];\n return typeof node === \"string\" ? node : \"\";\n}\nconst remote = Annotation.define(); // automerge -> view reconcile (don't echo back)\n// ---------------------------------------------------------------------------\n// text sync\n// ---------------------------------------------------------------------------\nfunction pushLocalEdits(handle, path, update) {\n if (!update.docChanged)\n return;\n if (update.transactions.some((tr) => tr.annotation(remote)))\n return;\n const edits = [];\n update.changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n edits.push([fromA, toA - fromA, inserted.toString()]);\n });\n if (edits.length === 0)\n return;\n handle.change((doc) => {\n for (let i = edits.length - 1; i >= 0; i--) {\n const [from, del, ins] = edits[i];\n am.splice(doc, path, from, del, ins);\n }\n });\n}\nfunction reconcileText(view, handle, path) {\n const text = getText(handle.doc(), path);\n const current = view.state.doc.toString();\n if (text === current)\n return;\n let start = 0;\n const min = Math.min(text.length, current.length);\n while (start < min && text[start] === current[start])\n start++;\n let endText = text.length;\n let endCur = current.length;\n while (endText > start && endCur > start && text[endText - 1] === current[endCur - 1]) {\n endText--;\n endCur--;\n }\n view.dispatch({\n changes: { from: start, to: endCur, insert: text.slice(start, endText) },\n annotations: remote.of(true),\n });\n}\n// ---------------------------------------------------------------------------\n// factory\n// ---------------------------------------------------------------------------\nexport function createCuteEditor({ handle, path, schema, parent, repo, getToolsForDoc, autocompletes = [], editable = true }) {\n let view;\n const onChange = () => {\n queueMicrotask(() => {\n if (view)\n reconcileText(view, handle, path);\n });\n };\n handle.on(\"change\", onChange);\n const updateListener = EditorView.updateListener.of((update) => {\n pushLocalEdits(handle, path, update);\n });\n // cuteAutocomplete/cutePreview read their inputs fresh via getters; cuteAutocomplete\n // self-cleans on view teardown, so no separate destroy is needed here.\n const acExtensions = autocompletes.length ? cuteAutocomplete(() => autocompletes) : [];\n view = new EditorView({\n doc: getText(handle.doc(), path),\n parent,\n extensions: [\n ...cutePreview(() => schema, { repo, getToolsForDoc }),\n updateListener,\n EditorView.lineWrapping,\n EditorView.editable.of(editable),\n ...acExtensions,\n ],\n });\n return {\n view,\n destroy() {\n handle.off(\"change\", onChange);\n view.destroy();\n },\n };\n}\n//# sourceMappingURL=editor.js.map","// Static, read-only renderer: parses the body and builds formatted DOM using the\n// same schema patterns + toDOM the editor uses. The \"convert to html by default\"\n// half — safe (text via createTextNode, tags via createElement).\nimport { parseMarkup } from \"./markup.js\";\nfunction build(parent, nodes) {\n for (const node of nodes) {\n if (node.text != null) {\n // Newlines become <br> (see html.js) so read-only display matches the\n // plain-text field's line breaks instead of collapsing them to spaces.\n const parts = node.text.split(\"\\n\");\n parts.forEach((part, i) => {\n if (i > 0)\n parent.append(document.createElement(\"br\"));\n if (part)\n parent.append(document.createTextNode(part));\n });\n }\n else if (node.atom) {\n const el = node.atom.toDOM(node.attrs);\n const wrap = document.createElement(node.block ? \"div\" : \"span\");\n wrap.className = node.block ? \"cutetxt-block\" : \"cutetxt-replace\";\n if (el instanceof Node)\n wrap.append(el);\n else if (typeof el === \"string\")\n wrap.append(document.createTextNode(el));\n parent.append(wrap);\n }\n else {\n const [tagName, attrs] = node.mark.toDOM(node.attrs);\n const el = document.createElement(tagName);\n if (attrs)\n for (const [key, value] of Object.entries(attrs))\n el.setAttribute(key, value);\n build(el, node.children);\n parent.append(el);\n }\n }\n}\nexport function renderMarkup(text, schema) {\n const container = document.createElement(\"div\");\n container.className = \"cutetxt-rendered\";\n build(container, parseMarkup(typeof text === \"string\" ? text : \"\", schema));\n return container;\n}\n// Safe HTML *string* for consumers that must innerHTML. Serializes the safe DOM\n// tree above, so text is browser-escaped and only schema tags appear.\nexport function renderToHTML(text, schema) {\n return renderMarkup(text, schema).innerHTML;\n}\n//# sourceMappingURL=render.js.map","// The built-in cute.txt marks, blocks, replaces, and autocompletes, as plain data.\n// Each is also a `cute.txt` extension plugin carrying a `kind` of \"mark\" | \"block\"\n// | \"replace\" | \"autocomplete\" (see index.js); the tool builds its live schema +\n// autocompleters from that one registry, so other modules can add or replace\n// formatting/completion without touching cute.txt.\n//\n// mark/block/replace feed the parser + renderer (markup.js/render.js) and the\n// editor; `autocomplete` is editor-only (renderMarkup ignores it): a `trigger`\n// regex tested against the text before the caret and an `options(query)` that\n// returns `[{label, detail?, insert}]`.\n//\n// mark: {pattern (group 1 = inner), toDOM([tag]|[tag,attrs]), key?, wrap?}\n// block: {pattern (whole token), parse(match)->attrs, toDOM(attrs)->Node, toHTML?(attrs)->string} (block-level)\n// replace: same shape as block, rendered inline (emoji, etc.)\n//\n// `toDOM` is the live/browser path (render.js, editor). `toHTML` is the optional\n// DOM-free path for the static string renderer (html.js) — it returns the same\n// element as escaped HTML text, for build-time use (blog templating, SSR) where\n// there's no `document`. Marks need no `toHTML`: their `toDOM` already returns\n// plain `[tag, attrs]` data that html.js serializes directly. A block/replace\n// without `toHTML` still renders in the browser; it just can't be stringified.\nimport { escapeHTML, escapeAttr } from \"./markup.js\";\nexport function defineRichSchema({ marks = {}, blocks = {}, replaces = {} } = {}) {\n return { marks, blocks, replaces };\n}\n// The inline marks. Delimiter conventions match chat + chitter's parser-extensions\n// so the two interoperate; where delimiters overlap the greedy scan prefers the\n// longer/earlier match (so `___x___` beats `__x__` beats `_x_`, `._x_.` beats\n// `_x_`, etc.). `link` is the autolink mark: its group 1 is the whole URL (no\n// delimiters to hide), wrapped in an <a>.\nexport const defaultMarks = {\n strong: { pattern: /\\*([^*\\n]+?)\\*/, toDOM: () => [\"strong\"], key: \"Mod-b\", wrap: \"*\" },\n \"underline-em\": { pattern: /___([^_\\n]+?)___/, toDOM: () => [\"span\", { class: \"cutetxt-underline-em\" }], wrap: \"___\" },\n underline: { pattern: /__([^_\\n]+?)__/, toDOM: () => [\"u\"], key: \"Mod-u\", wrap: \"__\" },\n em: { pattern: /(?<![_\\w])_([^_\\n]+?)_(?![_.\\w])/, toDOM: () => [\"em\"], key: \"Mod-i\", wrap: \"_\" },\n strike: { pattern: /~~([^~\\n]+?)~~/, toDOM: () => [\"s\"], wrap: \"~~\" },\n spoiler: { pattern: /\\|\\|([^|\\n]+?)\\|\\|/, toDOM: () => [\"span\", { class: \"cutetxt-spoiler\" }], wrap: \"||\" },\n code: { pattern: /`([^`\\n]+?)`/, toDOM: () => [\"code\", { class: \"cutetxt-code\" }], wrap: \"`\", raw: true },\n sub: { pattern: /\\._([^_\\n]+?)_\\./, toDOM: () => [\"sub\"] },\n sup: { pattern: /\\.\\^([^^\\n]+?)\\^\\./, toDOM: () => [\"sup\"] },\n inverted: { pattern: /%%([^%\\n]+?)%%/, toDOM: () => [\"span\", { class: \"cutetxt-inverted\" }], wrap: \"%%\" },\n marquee: { pattern: /<>([^\\n]+?)<>/, toDOM: () => [\"marquee\"], wrap: \"<>\" },\n link: {\n pattern: /(https?:\\/\\/[^\\s<]+)/,\n parse: (s) => ({ href: s }),\n toDOM: ({ href }) => [\"a\", { href, target: \"_blank\", rel: \"noopener noreferrer\" }],\n },\n};\nconst CODE_FENCE = /```([a-zA-Z0-9]*)\\n([\\s\\S]*?)```/;\nconst THINK = /<think>([\\s\\S]*?)<\\/think>/;\nexport const defaultBlocks = {\n // An embed: a self-closing <patchwork-view .../> tag, rendered as the live element.\n embed: {\n pattern: /<patchwork-view\\b[^>]*?\\/>/,\n parse(tag) {\n const attr = (n) => tag.match(new RegExp(`\\\\b${n}=\"([^\"]*)\"`))?.[1] ?? tag.match(new RegExp(`\\\\b${n}='([^']*)'`))?.[1];\n // width/height (px) are optional; they persist a resized embed in the token.\n return { url: attr(\"doc-url\"), toolId: attr(\"tool-id\"), width: attr(\"width\"), height: attr(\"height\") };\n },\n token({ url, toolId, width, height }) {\n return (`<patchwork-view doc-url=\"${url}\"` +\n (toolId ? ` tool-id=\"${toolId}\"` : \"\") +\n (width ? ` width=\"${width}\"` : \"\") +\n (height ? ` height=\"${height}\"` : \"\") +\n `/>`);\n },\n toDOM({ url, toolId, width, height }) {\n const el = document.createElement(\"patchwork-view\");\n if (url)\n el.setAttribute(\"doc-url\", url);\n if (toolId)\n el.setAttribute(\"tool-id\", toolId);\n // Static/inline size (the editor's resizable wrap overrides this to 100%).\n if (width)\n el.style.width = width + \"px\";\n if (height)\n el.style.height = height + \"px\";\n return el;\n },\n toHTML({ url, toolId, width, height }) {\n // A real close tag (not self-closing) — custom elements aren't void, so\n // `<patchwork-view/>` would swallow following siblings in an HTML parser.\n const style = (width ? `width:${escapeAttr(width)}px;` : \"\") + (height ? `height:${escapeAttr(height)}px;` : \"\");\n const attrs = (url ? ` doc-url=\"${escapeAttr(url)}\"` : \"\") +\n (toolId ? ` tool-id=\"${escapeAttr(toolId)}\"` : \"\") +\n (style ? ` style=\"${escapeAttr(style)}\"` : \"\");\n return `<patchwork-view${attrs}></patchwork-view>`;\n },\n },\n // A fenced code block: ```lang\\n…\\n```\n codeblock: {\n pattern: CODE_FENCE,\n parse(s) {\n const m = s.match(CODE_FENCE);\n return { lang: m?.[1] || \"\", code: m?.[2] ?? \"\" };\n },\n toDOM({ lang, code }) {\n const pre = document.createElement(\"pre\");\n pre.className = \"cutetxt-codeblock\";\n const codeEl = document.createElement(\"code\");\n if (lang)\n codeEl.className = \"language-\" + lang;\n codeEl.textContent = code;\n pre.append(codeEl);\n return pre;\n },\n toHTML({ lang, code }) {\n const cls = lang ? ` class=\"language-${escapeAttr(lang)}\"` : \"\";\n return `<pre class=\"cutetxt-codeblock\"><code${cls}>${escapeHTML(code)}</code></pre>`;\n },\n },\n // A <think>…</think> block.\n think: {\n pattern: THINK,\n parse(s) {\n return { text: s.match(THINK)?.[1] ?? \"\" };\n },\n toDOM({ text }) {\n const div = document.createElement(\"div\");\n div.className = \"cutetxt-think\";\n div.textContent = text;\n return div;\n },\n toHTML({ text }) {\n return `<div class=\"cutetxt-think\">${escapeHTML(text)}</div>`;\n },\n },\n};\n// A small built-in emoji set — the example of the inline `replace` kind. Real/full\n// emoji is just another `cute.txt` plugin (kind \"replace\") with a bigger map. The pattern is\n// built from the known names so an arbitrary `:word:` isn't swallowed.\nconst EMOJI = {\n smile: \"🙂\", grin: \"😀\", joy: \"😂\", heart: \"❤️\", fire: \"🔥\", tada: \"🎉\",\n eyes: \"👀\", \"+1\": \"👍\", \"-1\": \"👎\", rocket: \"🚀\", sparkles: \"✨\", thinking: \"🤔\",\n};\nconst escapeRe = (s) => s.replace(/[.*+?^${}()|[\\]\\\\-]/g, \"\\\\$&\");\nconst EMOJI_RE = new RegExp(\":(\" + Object.keys(EMOJI).map(escapeRe).join(\"|\") + \"):\");\nexport const defaultReplaces = {\n emoji: {\n pattern: EMOJI_RE,\n parse(s) {\n return { name: s.slice(1, -1) };\n },\n toDOM({ name }) {\n const span = document.createElement(\"span\");\n span.className = \"cutetxt-emoji\";\n span.textContent = EMOJI[name] ?? \":\" + name + \":\";\n return span;\n },\n toHTML({ name }) {\n return `<span class=\"cutetxt-emoji\">${escapeHTML(EMOJI[name] ?? \":\" + name + \":\")}</span>`;\n },\n },\n};\n// Autocompleters (kind \"autocomplete\"): editor-only, ignored by the renderer. A\n// `trigger` regex (anchored at the end) is tested against the text before the\n// caret; `options(query)` returns `[{label, detail?, insert}]`. Selecting an option\n// replaces the matched trigger text with `insert`. Here: `:na…` suggests emoji.\nexport const defaultAutocompletes = {\n emoji: {\n // require ≥1 char after `:` so a bare `:` (or the trailing `:` of a just-\n // inserted `:fire:`) doesn't reopen the popup.\n trigger: /:([\\w+-]+)$/,\n options(query) {\n const q = (query || \"\").toLowerCase();\n return Object.keys(EMOJI)\n .filter((name) => name.includes(q))\n .slice(0, 8)\n .map((name) => ({ label: name, detail: EMOJI[name], insert: \":\" + name + \":\" }));\n },\n },\n};\nexport const defaultSchema = defineRichSchema({\n marks: defaultMarks,\n blocks: defaultBlocks,\n replaces: defaultReplaces,\n});\n// The full built-in catalog, keyed by kind. Every id is unique across the three\n// kinds, so a consumer can pick formatting with a flat list of ids.\nexport const defaultCatalog = { marks: defaultMarks, blocks: defaultBlocks, replaces: defaultReplaces };\n// Build a schema from a flat list of spec ids — the simple way for a consumer\n// (chat, comments) to choose which formatting is active without touching the\n// plugin registry. e.g. `schemaFromIds([\"strong\", \"em\", \"code\", \"embed\", \"emoji\"])`\n// for a lean set, or spread over a custom catalog to include your own specs:\n// schemaFromIds([\"strong\", \"mymark\"], {...defaultCatalog, marks: {...defaultMarks, mymark}})\n// Unknown ids are ignored. Pass `catalog` to resolve from a different spec set\n// (e.g. one carrying chat's emoticon/shiki specs).\nexport function schemaFromIds(ids, catalog = defaultCatalog) {\n const picked = { marks: {}, blocks: {}, replaces: {} };\n for (const id of ids) {\n for (const kind of [\"marks\", \"blocks\", \"replaces\"]) {\n if (catalog[kind] && catalog[kind][id]) {\n picked[kind][id] = catalog[kind][id];\n break;\n }\n }\n }\n return defineRichSchema(picked);\n}\n//# sourceMappingURL=schema.js.map","// A read-only SolidJS renderer for cute.txt, for tools that render bodies in Solid\n// (like chat's message list). It:\n// - is safe: builds DOM via textContent (never innerHTML), so user text can't\n// inject markup;\n// - streams: it's reactive to `props.text`, so appending to the body (an LLM\n// token stream, say) just re-renders — and a half-typed `*bold` renders as\n// literal text until its closer arrives, no flicker into broken markup.\n//\n// Optional module: only tools that use Solid import it, keeping the core vanilla.\n// Solid is in the Patchwork importmap.\nimport { createEffect } from \"solid-js\";\nimport { renderMarkup } from \"./render.js\";\nimport { defaultSchema } from \"./schema.js\";\nconst read = (v, fallback) => (typeof v === \"function\" ? v() : v) ?? fallback;\n// Usage: CuteText({text: () => msg.text, schema}) — text may be a value or an\n// accessor; returns a DOM element Solid mounts and keeps updated.\nexport function CuteText(props) {\n const el = document.createElement(\"div\");\n el.className = \"cutetxt-rendered\";\n createEffect(() => {\n const rendered = renderMarkup(read(props.text, \"\"), read(props.schema, defaultSchema));\n el.replaceChildren(...rendered.childNodes);\n });\n return el;\n}\n//# sourceMappingURL=solid.js.map","import \"./styles.css\";\n// Pulls in <patchwork-view> JSX intrinsic type augmentations.\nimport type {} from \"@inkandswitch/patchwork-elements\";\nimport {\n createSignal,\n createMemo,\n createEffect,\n onCleanup,\n onMount,\n Show,\n For,\n} from \"solid-js\";\n\nimport { relativeTime } from \"./relative-time\";\nimport { useDocument } from \"solid-automerge\";\nimport {\n type AutomergeUrl,\n type DocHandle,\n type Repo,\n} from \"@automerge/automerge-repo/slim\";\nimport { subscribeDoc } from \"@inkandswitch/patchwork-providers-solid\";\nimport { type ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport {\n createCuteEditor,\n defaultSchema,\n defaultAutocompletes,\n} from \"cute.txt\";\nimport { CuteText } from \"cute.txt/solid\";\nimport { createReply, type Comment, type CommentThread } from \"./comments\";\n\n// A standalone tool rendering a single comment thread from its subdocument\n// handle. The host (`CommentsView`) owns the cross-thread orchestration\n// (which thread is primary/secondary) and feeds that in through the\n// `data-thread-state` attribute; everything else about a thread — its\n// comments, draft editing, and the resolve/reply actions — lives here.\nexport function CommentThreadView(props: {\n handle: DocHandle<CommentThread>;\n element: ToolElement;\n repo: Repo;\n}) {\n const [, contactHandle] = subscribeDoc<Record<string, never>>(props.element, {\n type: \"patchwork:contact\",\n });\n const currentContactUrl = () =>\n contactHandle()?.url as AutomergeUrl | undefined;\n\n const [thread, setThread] = createSignal<CommentThread | undefined>(\n props.handle.doc() as CommentThread | undefined\n );\n createEffect(() => {\n const h = props.handle;\n setThread(() => h.doc() as CommentThread | undefined);\n const onChange = () => setThread(() => h.doc() as CommentThread | undefined);\n h.on(\"change\", onChange);\n onCleanup(() => h.off(\"change\", onChange));\n });\n\n // The host tags us with our current selection state; it alone can pick a\n // single primary among several overlapping threads (and honour the pin\n // tiebreaker), so we just reflect what it decided. `CommentsView` always\n // sets this attribute explicitly, so its absence means we're mounted\n // without a host orchestrating multiple threads (e.g. a thread opened on\n // its own as a standalone tool) — in which case we're inherently the only\n // (and therefore primary) thread.\n const state = createElementAttribute(\n props.element,\n \"data-thread-state\",\n \"primary\"\n );\n const isPrimary = () => state() === \"primary\";\n const stateClass = () =>\n state() === \"primary\"\n ? \"comments-thread-card--primary\"\n : state() === \"secondary\"\n ? \"comments-thread-card--secondary\"\n : \"comments-thread-card--inactive\";\n\n // A document-level thread targets the whole document: its ref is a bare\n // document url (no `/` path or `#` heads pointing at a range within it).\n const isDocLevel = createMemo(() => {\n const refs = thread()?.refs ?? [];\n return (\n refs.length > 0 &&\n refs.every((ref) => !ref.includes(\"/\") && !ref.includes(\"#\"))\n );\n });\n\n // The sidebar hides resolved threads, but an embedded thread renders\n // whatever it's pointed at — so it needs to show a resolved thread as such\n // (still readable) and offer a way to reopen it.\n const isResolved = () => thread()?.isResolved ?? false;\n\n const cardClass = () =>\n `comments-thread-card ${stateClass()}${\n isResolved() ? \" comments-thread-card--resolved\" : \"\"\n }`;\n\n // `thread().comments` is a fresh Automerge proxy every change; returning\n // the previous array when the id sequence is unchanged keeps <For> from\n // tearing down focused draft textareas on each keystroke.\n const commentIds = createMemo<string[]>((prev) => {\n const t = thread();\n if (!t) return [];\n const next: string[] = [];\n for (const c of t.comments) next.push(c.id);\n if (\n prev &&\n prev.length === next.length &&\n next.every((id, i) => id === prev[i])\n ) {\n return prev;\n }\n return next;\n }, []);\n\n // Multiple drafts can coexist in the same thread (e.g. two people replying\n // concurrently). The Save/Cancel actions below act on whichever comment\n // this returns, so it must prefer *our own* draft — otherwise it could\n // silently target someone else's unfinished comment instead of ours.\n const draftComment = createMemo(() => {\n const t = thread();\n if (!t) return undefined;\n const isDraft = (c: Comment) =>\n c.draftContent !== undefined || c.content === undefined;\n const contactUrl = currentContactUrl();\n return (\n t.comments.find((c) => isDraft(c) && c.contactUrl === contactUrl) ??\n t.comments.find(isDraft)\n );\n });\n\n const draftCommentHandle = createMemo(() => {\n const t = thread();\n const d = draftComment();\n if (!t || !d) return undefined;\n return props.handle.sub(\"comments\", { id: d.id }) as DocHandle<Comment>;\n });\n\n const onResolveThread = () => {\n props.handle.change((t) => {\n t.isResolved = true;\n });\n };\n\n const onReopenThread = () => {\n props.handle.change((t) => {\n t.isResolved = false;\n });\n };\n\n const onReplyToComment = () => {\n const contactUrl = currentContactUrl();\n if (!contactUrl) return;\n createReply({ threadHandle: props.handle, content: \"\", contactUrl });\n };\n\n const onDeleteComment = (commentHandle: DocHandle<Comment>) => {\n commentHandle.remove();\n if (props.handle.doc()?.comments.length === 0) {\n props.handle.remove();\n }\n };\n\n const onSaveDraft = () => {\n const h = draftCommentHandle();\n if (!h) return;\n h.change((comment: Comment) => {\n comment.content = comment.draftContent;\n comment.timestamp = Date.now();\n delete comment.draftContent;\n });\n };\n\n const onCancelDraft = () => {\n const h = draftCommentHandle();\n if (!h) return;\n const commentValue = h.doc() as Comment | undefined;\n if (commentValue?.content === undefined) {\n onDeleteComment(h);\n return;\n }\n h.change((comment: Comment) => {\n delete comment.draftContent;\n });\n };\n\n return (\n <Show when={thread()}>\n <div class={cardClass()}>\n <div class=\"comments-thread-card-body\">\n <Show when={isResolved()}>\n <span class=\"comments-thread-resolved-label\">Resolved</span>\n </Show>\n <Show when={isDocLevel()}>\n <span class=\"comments-thread-doc-level\">On this document</span>\n </Show>\n <For each={commentIds()}>\n {(commentId) => {\n const commentHandle = createMemo(\n () =>\n props.handle.sub(\"comments\", {\n id: commentId,\n }) as DocHandle<Comment>\n );\n return (\n <Show when={commentHandle()}>\n {(handle) => (\n <CommentView\n commentHandle={handle()}\n currentContactUrl={currentContactUrl()}\n repo={props.repo}\n />\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </div>\n <Show when={draftComment() || isResolved() || isPrimary()}>\n <div class=\"comments-thread-actions\">\n <Show\n when={draftComment()}\n fallback={\n <Show\n when={isResolved()}\n fallback={\n <>\n <button\n class=\"comment-btn\"\n onClick={onResolveThread}\n title=\"Resolve comment\"\n >\n Resolve\n </button>\n <button\n class=\"comment-btn\"\n onClick={onReplyToComment}\n title=\"Reply to comment\"\n >\n Reply\n </button>\n </>\n }\n >\n <button\n class=\"comment-btn\"\n onClick={onReopenThread}\n title=\"Reopen comment\"\n >\n Reopen\n </button>\n </Show>\n }\n >\n <button class=\"comment-btn\" onClick={onCancelDraft}>\n Cancel\n </button>\n <button class=\"comment-btn\" onClick={onSaveDraft}>\n Save\n </button>\n </Show>\n </div>\n </Show>\n </Show>\n );\n}\n\ntype ContactDoc = { type: \"anonymous\" } | { type: \"registered\"; name: string };\n\nfunction CommentView(props: {\n commentHandle: DocHandle<Comment>;\n currentContactUrl?: string;\n repo: Repo;\n}) {\n const [comment, setComment] = createSignal<Comment | undefined>(undefined);\n createEffect(() => {\n const h = props.commentHandle;\n setComment(() => h.doc() as Comment | undefined);\n const onChange = () => setComment(() => h.doc() as Comment | undefined);\n h.on(\"change\", onChange);\n onCleanup(() => h.off(\"change\", onChange));\n });\n\n const contactUrl = () => comment()?.contactUrl as AutomergeUrl | undefined;\n const [contact] = useDocument<ContactDoc>(contactUrl, { repo: props.repo });\n\n const isDraft = () => {\n const c = comment();\n if (!c) return false;\n return c.draftContent !== undefined || c.content === undefined;\n };\n\n const shouldRender = () => {\n const c = comment();\n if (!c) return false;\n if (isDraft() && c.contactUrl !== props.currentContactUrl) return false;\n return true;\n };\n\n const contactName = () => {\n const ct = contact();\n return ct?.type === \"registered\" ? ct.name : \"Anonymous\";\n };\n\n return (\n <Show when={shouldRender() && comment()}>\n <div class=\"comment-card\" data-id={props.commentHandle.url}>\n <div class=\"comment-header\">\n <div class=\"comment-author\">\n <patchwork-view\n doc-url={comment()!.contactUrl}\n tool-id=\"contact-avatar\"\n />\n <span class=\"comment-author-name\">{contactName()}</span>\n </div>\n <Show when={!isDraft() && comment()!.timestamp}>\n <span class=\"comment-timestamp\">\n {relativeTime(comment()!.timestamp!)}\n </span>\n </Show>\n </div>\n <Show\n when={isDraft()}\n fallback={\n <div class=\"comment-content\">\n <CuteText text={() => comment()?.content ?? \"\"} />\n </div>\n }\n >\n <CuteDraftEditor\n commentHandle={props.commentHandle}\n repo={props.repo}\n />\n </Show>\n </div>\n </Show>\n );\n}\n\n// A cute.txt editor bound to the comment's `draftContent`. The editor edits the\n// field in place via `am.splice`, so it must already be a string; a fresh draft\n// has no `draftContent` yet, so we seed it to \"\" before mounting.\nfunction CuteDraftEditor(props: {\n commentHandle: DocHandle<Comment>;\n repo: Repo;\n}) {\n let parent!: HTMLDivElement;\n onMount(() => {\n const handle = props.commentHandle;\n if (typeof handle.doc()?.draftContent !== \"string\") {\n handle.change((c: Comment) => {\n if (typeof c.draftContent !== \"string\") c.draftContent = \"\";\n });\n }\n const editor = createCuteEditor({\n handle,\n path: [\"draftContent\"],\n schema: defaultSchema,\n // `defaultAutocompletes` is a map keyed by id; the editor wants the specs\n // as a flat array (e.g. the built-in emoji `:` completer).\n autocompletes: Object.values(defaultAutocompletes),\n parent,\n repo: props.repo,\n });\n editor.view.focus();\n\n // Cmd/Ctrl+Space sends the draft — the same commit the Save button does\n // (`draftContent` → `content`). Capture-phase so it wins before CodeMirror\n // treats the Space as text input.\n const onKeyDown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.code !== \"Space\") return;\n event.preventDefault();\n event.stopPropagation();\n const draft = handle.doc()?.draftContent ?? \"\";\n if (!draft.trim()) return;\n handle.change((c: Comment) => {\n c.content = c.draftContent;\n c.timestamp = Date.now();\n delete c.draftContent;\n });\n };\n parent.addEventListener(\"keydown\", onKeyDown, true);\n\n onCleanup(() => {\n parent.removeEventListener(\"keydown\", onKeyDown, true);\n editor.destroy();\n });\n });\n return <div class=\"cutetxt-editor comment-draft-editor\" ref={parent} />;\n}\n\n// Reactively track a single attribute on `element`, seeded from its current\n// value and updated via a `MutationObserver`. Used to receive the host's\n// per-thread selection state as a `data-*` attribute. The host sets it on the\n// `<patchwork-view>`, but the tool is handed the content element that view\n// renders into, so it's read from the view.\nfunction createElementAttribute(\n toolElement: HTMLElement,\n name: string,\n fallback: string\n): () => string {\n const element = toolElement.closest(\"patchwork-view\") ?? toolElement;\n const read = () => element.getAttribute(name) ?? fallback;\n const [value, setValue] = createSignal(read());\n onMount(() => {\n const observer = new MutationObserver(() => setValue(read()));\n observer.observe(element, { attributes: true, attributeFilter: [name] });\n setValue(read());\n onCleanup(() => observer.disconnect());\n });\n return value;\n}\n","import { render } from \"solid-js/web\";\nimport { RepoContext } from \"solid-automerge\";\nimport type { ToolImplementation } from \"@inkandswitch/patchwork-plugins\";\nimport { STYLE as CUTE_STYLE } from \"cute.txt/style\";\nimport { CommentsView } from \"./CommentsView\";\nimport { CommentThreadView } from \"./CommentThread\";\nimport type { CommentThread } from \"./comments\";\n\n// cute.txt is bundleless (no CSS import) and ships its styles as a string; the\n// editor/rendered marks need them. Inject once into the document head — guarded\n// so the two tools in this package (which both pull in this module) don't\n// double it.\nfunction ensureCuteStyle() {\n const id = \"cute-txt-style\";\n if (typeof document === \"undefined\" || document.getElementById(id)) return;\n const style = document.createElement(\"style\");\n style.id = id;\n style.textContent = CUTE_STYLE;\n document.head.append(style);\n}\nensureCuteStyle();\n\nexport const renderCommentsView: ToolImplementation = (_handle, element) => {\n return render(\n () => (\n <RepoContext.Provider value={element.repo}>\n <CommentsView element={element} />\n </RepoContext.Provider>\n ),\n element\n );\n};\n\n// Renders a single comment thread from its subdocument handle. Mounted by\n// `CommentsView` via `<patchwork-view tool-id=\"comment-thread\">`, one per\n// thread, with the thread's subdocument url as `doc-url`.\nexport const renderCommentThread: ToolImplementation<CommentThread> = (\n handle,\n element\n) => {\n return render(\n () => (\n <RepoContext.Provider value={element.repo}>\n <CommentThreadView\n handle={handle}\n element={element}\n repo={element.repo}\n />\n </RepoContext.Provider>\n ),\n element\n );\n};\n"],"names":["ms","require$$0","debug","template","CommentsView","props","repo","useRepo","selectedDocUrls","subscribe","element","type","targetDocUrl","commentEntries","useScopedCommentEntries","focusDoc","focusHandle","subscribeDoc","contactHandle","currentContactUrl","url","threadUrls","createMemo","entries","Set","threadUrl","add","Array","from","threadTargetUrlMap","map","Map","targetUrl","existing","get","includes","push","set","selectedHandles","useResolvedHandles","Object","keys","selection","threadTargetHandleMap","useResolvedHandleMap","threadsWithVisibleTarget","useThreadsWithVisibleTarget","docLevelThreadUrls","targets","length","every","t","renderableThreadUrls","filter","has","displayedThreadUrls","overlappingThreads","threadOverlapsSelection","pinnedThread","setPinnedThread","createSignal","primaryThreadUrl","pinned","overlaps","undefined","secondaryThreadUrls","p","u","hoveredThread","setHoveredThread","createEffect","handle","urls","desired","change","doc","highlight","onSelectThread","targetUrls","wasPrimary","next","onClickThreadCard","e","target","closest","threadState","onCleanup","canAddComment","Boolean","onAddComment","contactUrl","find","createDocumentThread","docHandle","_el$","_tmpl$2","_el$2","firstChild","_$insert","_$createComponent","Show","when","children","_el$4","_tmpl$","$$click","fallback","_tmpl$3","For","each","_el$6","_tmpl$4","_el$7","addEventListener","docUrl","_$owner","_$getOwner","_$effect","_$setAttribute","setEntries","unsubscribe","subscribeProvider","value","handles","setHandles","list","cancelled","Promise","all","catch","then","resolved","h","setResolved","m","out","key","visible","setVisible","recompute","some","targetIsVisible","flatHandles","on","off","values","positions","rangePositions","start","end","s","contains","_$delegateEvents","kind","block","spec","apply","insert","pos","at","render","opts","CommentThreadView","thread","setThread","onChange","state","createElementAttribute","isPrimary","stateClass","isDocLevel","refs","ref","isResolved","cardClass","commentIds","prev","c","comments","id","i","draftComment","isDraft","draftContent","content","draftCommentHandle","d","sub","onResolveThread","onReopenThread","onReplyToComment","createReply","threadHandle","onDeleteComment","commentHandle","remove","onSaveDraft","comment","timestamp","Date","now","onCancelDraft","commentValue","commentId","CommentView","_$className","_el$5","_tmpl$6","_el$9","_tmpl$8","_el$0","_tmpl$9","_el$8","_tmpl$7","_tmpl$5","setComment","contact","useDocument","shouldRender","contactName","ct","name","_$memo","_el$1","_tmpl$1","_el$10","_el$11","_el$12","_el$13","nextSibling","_el$14","_tmpl$0","relativeTime","_el$15","_tmpl$10","CuteText","text","CuteDraftEditor","_p$","_v$","_v$2","parent","onMount","editor","createCuteEditor","path","schema","defaultSchema","autocompletes","defaultAutocompletes","view","focus","onKeyDown","event","metaKey","ctrlKey","code","preventDefault","stopPropagation","draft","trim","removeEventListener","destroy","_el$16","_tmpl$11","_ref$","_$use","toolElement","read","getAttribute","setValue","observer","MutationObserver","observe","attributes","attributeFilter","disconnect","ensureCuteStyle","document","getElementById","style","createElement","textContent","CUTE_STYLE","head","append","renderCommentsView","_handle","RepoContext","Provider","renderCommentThread"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22]}
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./assets/main-DfvTgZ-4.js","./assets/comments-D9lwpHOh.js","./assets/datatype-C4SMwWiO.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./assets/main-51fB7vpU.js","./assets/comments-D9lwpHOh.js","./assets/datatype-C4SMwWiO.js"])))=>i.map(i=>d[i]);
2
2
  const scriptRel = "modulepreload";
3
3
  const assetsURL = function(dep, importerUrl) {
4
4
  return new URL(dep, importerUrl).href;
@@ -68,7 +68,7 @@ const plugins = [
68
68
  name: "Comments",
69
69
  async load() {
70
70
  const { renderCommentsView } = await __vitePreload(async () => {
71
- const { renderCommentsView: renderCommentsView2 } = await import("./assets/main-DfvTgZ-4.js");
71
+ const { renderCommentsView: renderCommentsView2 } = await import("./assets/main-51fB7vpU.js");
72
72
  return { renderCommentsView: renderCommentsView2 };
73
73
  }, true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
74
74
  return (element) => renderCommentsView(null, element);
@@ -101,7 +101,7 @@ const plugins = [
101
101
  supportedDatatypes: ["comment-thread"],
102
102
  async load() {
103
103
  const { renderCommentThread } = await __vitePreload(async () => {
104
- const { renderCommentThread: renderCommentThread2 } = await import("./assets/main-DfvTgZ-4.js");
104
+ const { renderCommentThread: renderCommentThread2 } = await import("./assets/main-51fB7vpU.js");
105
105
  return { renderCommentThread: renderCommentThread2 };
106
106
  }, true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
107
107
  return renderCommentThread;