@inkandswitch/patchwork-pkg-base 0.0.41 → 0.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/account/dist/{InlineContactAvatar-TVDLE2AV.js → InlineContactAvatar-6UAAJ73R.js} +2 -1
- package/packages/account/dist/InlineContactAvatar-6UAAJ73R.js.map +7 -0
- package/packages/account/dist/index.js +1 -1
- package/packages/chat/dist/{ChatRoot-DQkQQvPO.js → ChatRoot-WdCS4aLg.js} +3001 -2807
- package/packages/chat/dist/{context-tool-BuY29sJF.js → context-tool-KkwLFr2k.js} +2 -2
- package/packages/chat/dist/{index-NiYOPQzY.js → index-P8UuZ1jj.js} +3 -3
- package/packages/chat/dist/index.js +1 -1
- package/packages/chat/dist/{tool-He3mRTzT.js → tool-DWqQOW59.js} +2 -2
- package/packages/chat/package.json +1 -1
- package/packages/codemirror-base/dist/chunk-H5POLO74.js +2658 -0
- package/packages/codemirror-base/dist/chunk-H5POLO74.js.map +7 -0
- package/packages/codemirror-base/dist/lib/codemirror.js +1 -1
- package/packages/codemirror-base/dist/tool.js +9 -5
- package/packages/codemirror-base/dist/tool.js.map +2 -2
- package/packages/codemirror-base/package.json +1 -1
- package/packages/codemirror-markdown/dist/extensions/markdown.js +0 -94
- package/packages/codemirror-markdown/dist/extensions/markdown.js.map +3 -3
- package/packages/drafts/dist/assets/{DraftOverlayProvider-B0Mtq1UF.js → DraftOverlayProvider-VYKlzOy1.js} +85 -25
- package/packages/drafts/dist/assets/DraftOverlayProvider-VYKlzOy1.js.map +1 -0
- package/packages/drafts/dist/assets/{DraftListProvider-D41q9O5B.js → DraftStateProvider-DX8b_RgQ.js} +270 -39
- package/packages/drafts/dist/assets/DraftStateProvider-DX8b_RgQ.js.map +1 -0
- package/packages/drafts/dist/assets/{clone-policy-C4pVv5sr.js → clone-policy-CIdEhg7W.js} +5 -2
- package/packages/drafts/dist/assets/{clone-policy-C4pVv5sr.js.map → clone-policy-CIdEhg7W.js.map} +1 -1
- package/packages/drafts/dist/assets/draft-docs-Bi8K1y3a.js +554 -0
- package/packages/drafts/dist/assets/draft-docs-Bi8K1y3a.js.map +1 -0
- package/packages/drafts/dist/assets/main-BR_tW0sp.js +3105 -0
- package/packages/drafts/dist/assets/main-BR_tW0sp.js.map +1 -0
- package/packages/drafts/dist/index.js +14 -14
- package/packages/drafts/dist/index.js.map +1 -1
- package/packages/drafts/package.json +1 -1
- package/packages/threepane/dist/IsolatedDocumentArea-2JIBFDOX.js +2 -0
- package/packages/threepane/dist/{PatchworkFrame-4AEBOBRE.js → PatchworkFrame-P5P6JTJE.js} +2 -2
- package/packages/threepane/dist/chunk-CGHYPNSB.js +972 -0
- package/packages/threepane/dist/chunk-CGHYPNSB.js.map +7 -0
- package/packages/threepane/dist/index.js +1 -1
- package/packages/tldraw4/dist/tool.js +61 -10
- package/packages/tldraw4/dist/tool.js.map +2 -2
- package/packages/tldraw4/package.json +2 -2
- package/packages/account/dist/InlineContactAvatar-TVDLE2AV.js.map +0 -7
- package/packages/codemirror-base/dist/chunk-5IG5TKXV.js +0 -795
- package/packages/codemirror-base/dist/chunk-5IG5TKXV.js.map +0 -7
- package/packages/drafts/dist/assets/DraftListProvider-D41q9O5B.js.map +0 -1
- package/packages/drafts/dist/assets/DraftOverlayProvider-B0Mtq1UF.js.map +0 -1
- package/packages/drafts/dist/assets/main-Cp8VsNHh.js +0 -2331
- package/packages/drafts/dist/assets/main-Cp8VsNHh.js.map +0 -1
- package/packages/threepane/dist/IsolatedDocumentArea-MZBBRFMY.js +0 -2
- package/packages/threepane/dist/chunk-HNLVJAZZ.js +0 -972
- package/packages/threepane/dist/chunk-HNLVJAZZ.js.map +0 -7
- /package/packages/threepane/dist/{IsolatedDocumentArea-MZBBRFMY.js.map → IsolatedDocumentArea-2JIBFDOX.js.map} +0 -0
- /package/packages/threepane/dist/{PatchworkFrame-4AEBOBRE.js.map → PatchworkFrame-P5P6JTJE.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-Cp8VsNHh.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.1_@automerge+automerge-repo@2.6.0-subduction.47_supports-color@7.2._7da048330ce229efe623709826d179e7/node_modules/solid-automerge/out/context.js","../../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.47_supports-color@7.2._7da048330ce229efe623709826d179e7/node_modules/solid-automerge/out/createDocSignal.js","../../node_modules/.pnpm/@inkandswitch+patchwork-providers-solid@0.2.7_@automerge+automerge-repo@2.6.0-subductio_da34c10f1bc63895d710f582f3ec3c59/node_modules/@inkandswitch/patchwork-providers-solid/dist/index.js","../../src/DraftsSidebar.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 { createContext } from \"solid-js\";\nexport const RepoContext = createContext(\n null\n);\n//# sourceMappingURL=context.js.map\n","\"use strict\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { createSignal } from \"solid-js\";\nexport default function createDocSignal(handle) {\n const [signal, setSignal] = createSignal(handle()?.doc());\n createEffect(() => {\n const h = handle();\n function update() {\n setSignal(() => h?.doc());\n }\n update();\n if (h) {\n h.on(\"change\", update);\n onCleanup(() => h.off(\"change\", update));\n }\n });\n return signal;\n}\n//# sourceMappingURL=createDocSignal.js.map\n","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\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n For,\n onCleanup,\n Show,\n type Accessor,\n} from \"solid-js\";\nimport { createDocSignal } from \"solid-automerge\";\nimport type {\n AutomergeUrl,\n DocHandle,\n Repo,\n UrlHeads,\n} from \"@automerge/automerge-repo/slim\";\nimport { decodeHeads, encodeHeads } from \"@automerge/automerge-repo/slim\";\nimport * as Automerge from \"@automerge/automerge/slim\";\nimport { getRegistry, isLoadedPlugin } from \"@inkandswitch/patchwork-plugins\";\nimport {\n subscribe,\n subscribeDoc,\n} from \"@inkandswitch/patchwork-providers-solid\";\nimport type {\n CheckedOutDraft,\n CloneEntry,\n DraftCheckpoint,\n DraftDoc,\n DraftList,\n DraftMemberDoc,\n HasDrafts,\n} from \"./draft-types\";\n\n// Seed for the read-only `draft:list` subscription until the provider answers.\n// `main.url` is a placeholder; the Main card displays the host doc url instead.\nconst EMPTY_DRAFT_LIST: DraftList = {\n main: { url: \"\" as AutomergeUrl, members: [], childCount: 0, name: null },\n drafts: [],\n};\n\n// Bump on each deploy to eyeball whether the latest build has synced.\nconst DRAFTS_VERSION = \"0.0.18\";\n\n// Logged at module load so the console shows which build is running even\n// before the panel renders.\nconsole.log(`[drafts] DraftsSidebar v${DRAFTS_VERSION} loaded`);\n\n// A pause between consecutive changes longer than this starts a new group:\n// bursts of continuous editing read as a single row, however long they run,\n// and any minute-plus lull splits the timeline.\nconst INACTIVITY_GAP = 60 * 1000;\n\nexport function DraftsSidebar(props: { element: HTMLElement }) {\n const [hostDoc, hostDocHandle] = subscribeDoc<HasDrafts>(props.element, {\n type: \"draft:root-doc\",\n });\n\n // Selection only: which draft is checked out (writeable).\n const [, checkedOutHandle] = subscribeDoc<CheckedOutDraft>(props.element, {\n type: \"draft:checked-out\",\n });\n\n // Read the checkout doc coarsely from the live handle (handle.doc()) rather\n // than a fine-grained patch-replay projection: the projection can render a\n // whole-value write doubled, whereas handle.doc() is always the correct\n // materialized document.\n const checkedOut = createDocSignal(checkedOutHandle);\n const selected = createMemo<AutomergeUrl | null>(\n () => checkedOut()?.checkedOut ?? null\n );\n\n // Where the scrubber sits: the change whose heads are displayed. Ephemeral,\n // client-only state: the stored checkpoint (`checkedOut.at`) is what\n // actually pins the view; this mirrors it to render the token and the\n // group highlight. Not persisted, so it resets on reload (the pinned view\n // survives).\n const [scrubber, setScrubber] = createSignal<ScrubberState | null>(null);\n\n // A version being dragged out of a history timeline (from a group row or\n // the scrubber sticker). While set, the actions area shows a drop zone\n // that forks a new draft at that version; cleared on drop or dragend.\n const [dragVersion, setDragVersion] = createSignal<{\n members: DraftMemberDoc[];\n head: ChangeRef;\n } | null>(null);\n const [dropActive, setDropActive] = createSignal(false);\n\n // The derived drafts list (read-only): main plus each draft with its member\n // docs, recomputed and pushed by the provider.\n const list = subscribe<DraftList>(\n props.element,\n { type: \"draft:list\" },\n EMPTY_DRAFT_LIST\n );\n\n const isMainSelected = createMemo(() => selected() === null);\n // Drafting off a folder isn't supported yet, so creating a draft is disabled\n // while viewing a folder on Main.\n const isFolder = createMemo(\n () => hostDoc()?.[\"@patchwork\"]?.type === \"folder\"\n );\n\n const selectDraft = (url: AutomergeUrl | null) => {\n const handle = checkedOutHandle();\n if (!handle) return;\n setScrubber(null);\n handle.change((d) => {\n d.checkedOut = url;\n // Switching drafts (or to main) returns to the live latest heads.\n d.at = null;\n });\n };\n\n const getRepo = (): Repo | undefined =>\n \"repo\" in window ? window.repo : undefined;\n\n // Monotonic counter so a slow checkpoint computation can't overwrite a newer\n // scrub position (a drag fires one recompute per snapped change).\n let scrubSeq = 0;\n\n // Apply a scrubber position: freeze every member doc at its heads as of the\n // scrub head. The token and row highlight update immediately; the\n // checkpoint follows async. `draftUrl` is `null` for main.\n const onScrub = (\n draftUrl: AutomergeUrl | null,\n members: DraftMemberDoc[],\n scrub: ScrubberState\n ) => {\n const handle = checkedOutHandle();\n const repo = getRepo();\n if (!handle || !repo) return;\n setScrubber(scrub);\n const seq = ++scrubSeq;\n void (async () => {\n const checkpoint = await computeCheckpoint(repo, members, scrub.head);\n // A newer scrub landed while this one was computing; drop it.\n if (seq !== scrubSeq) return;\n handle.change((d) => {\n d.checkedOut = draftUrl;\n d.at = checkpoint;\n });\n })();\n };\n\n // Drop the time pin but stay on the same draft: back to live latest heads.\n const clearCheckpoint = () => {\n const handle = checkedOutHandle();\n if (!handle) return;\n setScrubber(null);\n handle.change((d) => {\n d.at = null;\n });\n };\n\n const onCreateDraft = async () => {\n if (isFolder()) return;\n const docHandle = hostDocHandle();\n if (!docHandle) return;\n const repo = getRepo();\n if (!repo) {\n console.warn(\"[drafts] window.repo is not set\");\n return;\n }\n\n // Top-level drafts branch off the main draft and live in its `drafts`\n // list. The main draft is created lazily the first time we draft this doc.\n const mainDraft = await ensureMainDraft(repo, docHandle);\n const draft = repo.create<DraftDoc>({\n \"@patchwork\": { type: \"draft\" },\n parent: mainDraft.url,\n drafts: [],\n clones: {},\n });\n mainDraft.change((d) => {\n d.drafts.push(draft.url);\n });\n selectDraft(draft.url);\n };\n\n // Resolve the host doc's single main draft, creating it (and pointing\n // `@patchwork.mainDraftUrl` at it) the first time. The main draft is\n // bookkeeping only: the list provider seeds its identity `clones`, and its\n // `drafts` holds the top-level draft list.\n const ensureMainDraft = async (\n repo: Repo,\n docHandle: DocHandle<HasDrafts>\n ): Promise<DocHandle<DraftDoc>> => {\n const existingUrl = docHandle.doc()?.[\"@patchwork\"]?.mainDraftUrl;\n if (existingUrl) return repo.find<DraftDoc>(existingUrl);\n\n const mainDraft = repo.create<DraftDoc>({\n \"@patchwork\": { type: \"draft\" },\n isMain: true,\n parent: docHandle.url,\n drafts: [],\n clones: {},\n });\n docHandle.change((d) => {\n // Mutate `@patchwork` in place. Spreading it into a fresh object and\n // reassigning would carry over references to existing document objects,\n // which Automerge rejects (\"Cannot create a reference to an existing\n // document object\").\n d[\"@patchwork\"]!.mainDraftUrl = mainDraft.url;\n });\n return mainDraft;\n };\n\n // Fork a new top-level draft off a historical version: every member doc is\n // cloned at the heads it had as of `head` (the dragged-out change), not at\n // the live latest. Pre-populating `DraftDoc.clones` here means the overlay's\n // lazy `resolveClone` reuses these entries instead of forking at current\n // heads. Members with no changes at or before the version (created later)\n // are left out; the version's docs don't reference them yet, so they are\n // normally never resolved beneath the draft.\n const onCreateDraftFromVersion = async (\n members: DraftMemberDoc[],\n head: ChangeRef\n ) => {\n if (isFolder()) return;\n const docHandle = hostDocHandle();\n if (!docHandle) return;\n const repo = getRepo();\n if (!repo) {\n console.warn(\"[drafts] window.repo is not set\");\n return;\n }\n\n // Reuse the scrub machinery to resolve per-doc heads at this version.\n const checkpoint = await computeCheckpoint(repo, members, head);\n\n const clones: Record<AutomergeUrl, CloneEntry> = {};\n for (const member of members) {\n const to = checkpoint[member.url]?.to;\n if (!to) continue;\n let handle: DocHandle<unknown> | null = null;\n try {\n // Clone the doc the timeline read its changes from (the draft's clone\n // when dragging out of a draft), pinned to the version's heads.\n // Keyed by the original url so baselines and merge-back resolve.\n handle = await repo.find<unknown>(member.cloneUrl ?? member.url);\n const clone = cloneAtVersion(repo, handle, to);\n clones[member.url] = { cloneUrl: clone.url, clonedAt: to };\n } catch (err) {\n reportForkFailure(\n handle ? collectForkDiagnostic(handle, member, to) : null,\n err\n );\n }\n }\n\n const mainDraft = await ensureMainDraft(repo, docHandle);\n const draft = repo.create<DraftDoc>({\n \"@patchwork\": { type: \"draft\" },\n parent: mainDraft.url,\n drafts: [],\n clones,\n });\n mainDraft.change((d) => {\n d.drafts.push(draft.url);\n });\n selectDraft(draft.url);\n };\n\n // Rename a draft, or main (`url === null`). Names live on the `DraftDoc`;\n // renaming main creates the main draft doc if this is the first draft-ish\n // action on the host doc. `null` clears back to the default label.\n const onRename = async (url: AutomergeUrl | null, name: string | null) => {\n const repo = getRepo();\n if (!repo) return;\n let handle: DocHandle<DraftDoc>;\n if (url === null) {\n const docHandle = hostDocHandle();\n if (!docHandle) return;\n handle = await ensureMainDraft(repo, docHandle);\n } else {\n handle = await repo.find<DraftDoc>(url);\n }\n handle.change((d) => {\n if (name) d.name = name;\n else delete d.name;\n });\n };\n\n const onMergeDraft = async () => {\n const draftUrl = selected();\n if (!draftUrl) return;\n if (!window.confirm(\"Merge this draft into the main document?\")) return;\n const repo = getRepo();\n if (!repo) {\n console.warn(\"[drafts] window.repo is not set\");\n return;\n }\n const draftHandle = await repo.find<DraftDoc>(draftUrl);\n await mergeDraft(repo, draftHandle);\n selectDraft(null);\n };\n\n return (\n <div class=\"drafts-panel\">\n <Show\n when={hostDoc()}\n fallback={<div class=\"drafts-empty\">No document selected.</div>}\n >\n <Show when={isMainSelected()}>\n <div class=\"drafts-actions drafts-actions--top\">\n <button\n class=\"drafts-btn drafts-btn--primary\"\n disabled={isFolder()}\n onClick={onCreateDraft}\n title={\n isFolder()\n ? \"Drafts aren't supported for folders yet\"\n : \"Create a new draft off this document\"\n }\n >\n New draft\n </button>\n <Show when={isFolder()}>\n <span class=\"drafts-hint\">\n Drafts aren't supported for folders yet.\n </span>\n </Show>\n </div>\n </Show>\n <div class=\"drafts-list\">\n <MainCard\n hostDocUrl={hostDocHandle()?.url}\n isSelected={isMainSelected()}\n members={() => list().main.members}\n name={list().main.name}\n onRename={(name) => void onRename(null, name)}\n onSelect={() => selectDraft(null)}\n onScrub={(scrub) => onScrub(null, list().main.members, scrub)}\n scrubber={() => (isMainSelected() ? scrubber() : null)}\n onDragVersion={(head) =>\n setDragVersion(\n head ? { members: list().main.members, head } : null\n )\n }\n hasCheckpoint={isMainSelected() && !!checkedOut()?.at}\n onReturnToLatest={clearCheckpoint}\n />\n <For each={list().drafts}>\n {(summary) => (\n <DraftCard\n url={summary.url}\n members={summary.members}\n mainDocUrl={hostDocHandle()?.url}\n isSelected={selected() === summary.url}\n name={summary.name}\n onRename={(name) => void onRename(summary.url, name)}\n onSelect={selectDraft}\n onScrub={(scrub) => onScrub(summary.url, summary.members, scrub)}\n scrubber={() =>\n selected() === summary.url ? scrubber() : null\n }\n onDragVersion={(head) =>\n setDragVersion(\n head ? { members: summary.members, head } : null\n )\n }\n hasCheckpoint={\n selected() === summary.url && !!checkedOut()?.at\n }\n onReturnToLatest={clearCheckpoint}\n />\n )}\n </For>\n </div>\n <div class=\"drafts-actions\">\n <Show when={dragVersion()}>\n <div\n class=\"drafts-dropzone\"\n data-over={dropActive() ? \"\" : undefined}\n onDragEnter={(e) => {\n e.preventDefault();\n setDropActive(true);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n }}\n onDragLeave={() => setDropActive(false)}\n onDrop={(e) => {\n e.preventDefault();\n const version = dragVersion();\n setDropActive(false);\n setDragVersion(null);\n if (version) {\n void onCreateDraftFromVersion(version.members, version.head);\n }\n }}\n >\n Drop to fork a new draft from this version\n </div>\n </Show>\n <Show when={!isMainSelected()}>\n <button\n class=\"drafts-btn drafts-btn--warning\"\n onClick={onMergeDraft}\n title=\"Merge this draft into Main\"\n >\n Merge into Main\n </button>\n </Show>\n </div>\n </Show>\n <div class=\"drafts-version\">v{DRAFTS_VERSION}</div>\n </div>\n );\n}\n\n// Merges every cloned doc back into its original, recording per-clone\n// merge heads for auditing, and marks the draft as merged.\nasync function mergeDraft(\n repo: Repo,\n draftHandle: DocHandle<DraftDoc>\n): Promise<void> {\n const entries = Object.entries(draftHandle.doc()?.clones ?? {}) as [\n AutomergeUrl,\n CloneEntry,\n ][];\n for (const [originalUrl, entry] of entries) {\n if (entry.cloneUrl === originalUrl) continue;\n const [original, clone] = await Promise.all([\n repo.find<unknown>(originalUrl),\n repo.find<unknown>(entry.cloneUrl),\n ]);\n original.merge(clone);\n const mergedAt = original.heads();\n draftHandle.change((d) => {\n const e = d.clones[originalUrl];\n if (e) e.mergedAt = mergedAt;\n });\n }\n draftHandle.change((d) => {\n d.mergedAt = Date.now();\n });\n}\n\n// --- Cloning a member at a version -------------------------------------------\n// The obvious way — `repo.clone(handle.view(to))`, i.e. wasm `fork_at` — is\n// broken upstream: on documents whose history contains certain concurrent\n// merge changes (as anything synced through subduction ends up with),\n// `fork_at` panics with `MissingOps` in `ChangeCollector::from_build_meta`\n// at *any* heads, and the panic poisons the doc object for the rest of the\n// session (every later call throws \"recursive use of an object detected\").\n// Confirmed offline against automerge 3.3.0-fragments.1 and .2 with a\n// 26-change minimal repro.\n//\n// So the version clone is built without `fork_at`: collect the ancestor\n// closure of the pin heads from the change metadata, bundle exactly those\n// changes (`saveBundle`), hydrate a fresh doc from the bundle\n// (`loadIncremental`), and install it into a new repo handle — the same move\n// `repo.clone` performs internally, minus the panicking wasm path. The\n// resulting doc's heads are exactly `to`, it shares history with the\n// original, and merges back cleanly.\n\n// Build a clone of `handle`'s doc pinned to the `to` heads and register it\n// with the repo. Throws (a plain JS error, no wasm panic) when the pin's\n// ancestry can't be resolved from the doc's change metadata.\nfunction cloneAtVersion(\n repo: Repo,\n handle: DocHandle<unknown>,\n to: UrlHeads\n): DocHandle<unknown> {\n const doc = handle.doc() as Automerge.Doc<unknown>;\n const pinHeads = decodeHeads(to);\n\n // Ancestor closure of the pin heads, walked over the full change metadata.\n const metas = Automerge.getChangesMetaSince(doc, []);\n const byHash = new Map(metas.map((m) => [m.hash, m]));\n const closure = new Set<string>();\n const stack = [...pinHeads];\n while (stack.length > 0) {\n const hash = stack.pop()!;\n if (closure.has(hash)) continue;\n const meta = byHash.get(hash);\n if (!meta) {\n throw new Error(\n `[drafts] change ${hash} is not in the doc's history metadata`\n );\n }\n closure.add(hash);\n stack.push(...meta.deps);\n }\n\n const bundle = Automerge.saveBundle(doc, [...closure]);\n const pinned = Automerge.loadIncremental(\n Automerge.init<unknown>(),\n bundle\n );\n\n const gotHeads = [...Automerge.getHeads(pinned)].sort();\n const wantHeads = [...pinHeads].sort();\n if (JSON.stringify(gotHeads) !== JSON.stringify(wantHeads)) {\n throw new Error(\n `[drafts] version clone heads mismatch: wanted ${wantHeads}, got ${gotHeads}`\n );\n }\n\n const clone = repo.create<unknown>();\n clone.update(() => pinned);\n return clone;\n}\n\n// --- Fork-at-version diagnostics --------------------------------------------\n// When `cloneAtVersion` fails, everything we can learn about the member and\n// the pinned heads is dumped as one JSON block tagged\n// [drafts][fork-diagnostic]; paste that back when reporting.\n\n// Everything we could learn about the member and the pinned heads, plus the\n// final error.\ntype ForkDiagnostic = {\n draftsVersion: string;\n memberUrl: AutomergeUrl;\n sourceUrl: AutomergeUrl;\n memberClonedAt: UrlHeads | null;\n // The version being forked at, as url-encoded heads and as hex hashes.\n to: UrlHeads;\n toHex: string[];\n // The doc's live frontier (hex), for comparison with `toHex`.\n currentHeads: string[] | null;\n // Does the doc itself consider `toHex` a valid point in its history?\n hasHeads: boolean | null;\n // Change hashes the doc knows it is missing ops for, as of `toHex`.\n missingDeps: string[] | null;\n stats: { numChanges: number; numOps: number } | null;\n automerge: {\n jsGitHead: string;\n wasmGitHead: string | null;\n wasmVersion: string | null;\n } | null;\n // Where each pinned hash sits in the doc's history: its topological index,\n // metadata, and whether it is a live head. `known: false` means the doc has\n // no change with that hash at all.\n pinnedChanges: {\n hash: string;\n known: boolean;\n topoIndex: number | null;\n time: number | null;\n actor: string | null;\n seq: number | null;\n deps: string[] | null;\n isCurrentHead: boolean;\n }[];\n // Sedimentree fragment coverage: how the doc's history is bundled.\n // `topoRange` is the [min, max] topological index of the fragment's member\n // changes and `containsPin` whether a pinned hash is one of them — so a\n // fork-depth failure boundary can be read directly against bundle\n // boundaries. A pinned hash buried inside a higher-level bundle is the\n // prime MissingOps suspect.\n fragments:\n | {\n level: number;\n head: string;\n memberCount: number;\n topoRange: [number, number] | null;\n containsPin: boolean;\n }[]\n | null;\n probeErrors: string[];\n failure?: { message: string; stack?: string };\n};\n\n// The saved doc bytes captured before the failing fork, kept out of the JSON\n// report (too big) and exposed on `window.__draftsForkRepro` instead, so the\n// exact failing document can be reproduced offline.\ntype ForkRepro = {\n url: AutomergeUrl;\n toHex: string[];\n docBase64: string;\n};\n\n// Snapshot everything we can read about `handle`'s doc and the pinned heads.\n// Every probe is individually guarded so one bad call doesn't lose the rest.\nfunction collectForkDiagnostic(\n handle: DocHandle<unknown>,\n member: DraftMemberDoc,\n to: UrlHeads\n): ForkDiagnostic {\n const diagnostic: ForkDiagnostic = {\n draftsVersion: DRAFTS_VERSION,\n memberUrl: member.url,\n sourceUrl: member.cloneUrl ?? member.url,\n memberClonedAt: member.clonedAt,\n to,\n toHex: [],\n currentHeads: null,\n hasHeads: null,\n missingDeps: null,\n stats: null,\n automerge: null,\n pinnedChanges: [],\n fragments: null,\n probeErrors: [],\n };\n const probe = (name: string, run: () => void) => {\n try {\n run();\n } catch (err) {\n diagnostic.probeErrors.push(`${name}: ${String(err)}`);\n }\n };\n\n probe(\"decodeHeads\", () => {\n diagnostic.toHex = decodeHeads(to);\n });\n\n const doc = handle.doc() as Automerge.Doc<unknown>;\n\n probe(\"getHeads\", () => {\n diagnostic.currentHeads = Automerge.getHeads(doc);\n });\n probe(\"hasHeads\", () => {\n diagnostic.hasHeads = Automerge.hasHeads(doc, diagnostic.toHex);\n });\n probe(\"getMissingDeps\", () => {\n diagnostic.missingDeps = Automerge.getMissingDeps(doc, diagnostic.toHex);\n });\n probe(\"stats\", () => {\n const s = Automerge.stats(doc);\n diagnostic.stats = { numChanges: s.numChanges, numOps: s.numOps };\n });\n probe(\"releaseInfo\", () => {\n const info = Automerge.releaseInfo();\n diagnostic.automerge = {\n jsGitHead: info.js.gitHead,\n wasmGitHead: info.wasm?.gitHead ?? null,\n wasmVersion: info.wasm?.cargoPackageVersion ?? null,\n };\n });\n probe(\"pinnedChanges\", () => {\n const topo = Automerge.topoHistoryTraversal(doc);\n const metas = Automerge.getChangesMetaSince(doc, []);\n const metaByHash = new Map(metas.map((m) => [m.hash, m]));\n diagnostic.pinnedChanges = diagnostic.toHex.map((hash) => {\n const meta = metaByHash.get(hash);\n const topoIndex = topo.indexOf(hash);\n return {\n hash,\n known: !!meta || topoIndex >= 0,\n topoIndex: topoIndex >= 0 ? topoIndex : null,\n time: meta?.time ?? null,\n actor: meta?.actor ?? null,\n seq: meta?.seq ?? null,\n deps: meta?.deps ?? null,\n isCurrentHead: diagnostic.currentHeads?.includes(hash) ?? false,\n };\n });\n });\n probe(\"fragments\", () => {\n const topo = Automerge.topoHistoryTraversal(doc);\n const topoIndex = new Map(topo.map((h, i) => [h, i]));\n const pinned = new Set(diagnostic.toHex);\n diagnostic.fragments = Automerge.getFragmentMetadata(doc).map((f) => {\n let min = Infinity;\n let max = -Infinity;\n let containsPin = false;\n for (const h of f.members) {\n const i = topoIndex.get(h);\n if (i !== undefined) {\n if (i < min) min = i;\n if (i > max) max = i;\n }\n if (pinned.has(h)) containsPin = true;\n }\n return {\n level: f.level,\n head: f.head,\n memberCount: f.members.length,\n topoRange:\n min <= max ? ([min, max] as [number, number]) : null,\n containsPin,\n };\n });\n });\n probe(\"saveDoc\", () => {\n // Capture the full doc bytes for an offline repro; published to\n // `window.__draftsForkRepro` by `reportForkFailure`.\n const bytes = Automerge.save(doc);\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n lastForkRepro = {\n url: member.url,\n toHex: diagnostic.toHex,\n docBase64: btoa(binary),\n };\n });\n\n return diagnostic;\n}\n\n// The most recent member's saved bytes, captured by `collectForkDiagnostic`\n// and published by `reportForkFailure` when its member's fork fails.\nlet lastForkRepro: ForkRepro | null = null;\n\n// Dump the diagnostic and the error as one copy-pasteable JSON block.\nfunction reportForkFailure(\n diagnostic: ForkDiagnostic | null,\n err: unknown\n): void {\n const failure = {\n message: err instanceof Error ? err.message : String(err),\n stack: err instanceof Error ? err.stack : undefined,\n };\n if (!diagnostic) {\n console.error(\n \"[drafts][fork-diagnostic] failed before diagnostics could be gathered:\",\n failure\n );\n return;\n }\n diagnostic.failure = failure;\n if (lastForkRepro && lastForkRepro.url === diagnostic.memberUrl) {\n (window as unknown as Record<string, unknown>).__draftsForkRepro =\n lastForkRepro;\n }\n console.error(\n \"[drafts][fork-diagnostic] failed to fork member at version — paste this block back:\\n\" +\n JSON.stringify(diagnostic, null, 2) +\n \"\\n[drafts][fork-diagnostic] the failing doc's bytes are on \" +\n \"window.__draftsForkRepro — to save them for an offline repro, run:\\n\" +\n \" const r = window.__draftsForkRepro;\\n\" +\n \" const bytes = Uint8Array.from(atob(r.docBase64), c => c.charCodeAt(0));\\n\" +\n \" const a = document.createElement('a');\\n\" +\n \" a.href = URL.createObjectURL(new Blob([bytes]));\\n\" +\n \" a.download = 'fork-repro.automerge'; a.click();\\n\" +\n \" console.log('pin heads:', r.toHex);\"\n );\n}\n\nfunction MainCard(props: {\n hostDocUrl: AutomergeUrl | undefined;\n isSelected: boolean;\n members: Accessor<DraftMemberDoc[]>;\n name: string | null;\n onRename: (name: string | null) => void;\n onSelect: () => void;\n onScrub: (scrub: ScrubberState) => void;\n scrubber: Accessor<ScrubberState | null>;\n onDragVersion: (head: ChangeRef | null) => void;\n hasCheckpoint: boolean;\n onReturnToLatest: () => void;\n}) {\n return (\n <div class=\"draft-card\" data-selected={props.isSelected ? \"\" : undefined}>\n {/* A div, not a <button>: the rename input rendered inside would be\n invalid (and misbehave) nested in a button. */}\n <div\n class=\"draft-card-header\"\n onClick={props.onSelect}\n title=\"Main version (host document)\"\n >\n <div class=\"draft-card-title\">\n <DraftName\n name={props.name}\n fallback=\"Main\"\n onRename={props.onRename}\n />\n <Show when={props.isSelected}>\n <span class=\"draft-badge\">current</span>\n </Show>\n </div>\n </div>\n <Show when={props.isSelected}>\n <DraftChangesList\n members={props.members}\n mainDocUrl={props.hostDocUrl}\n onScrub={props.onScrub}\n scrubber={props.scrubber}\n onDragVersion={props.onDragVersion}\n />\n <ReturnToLatestButton\n visible={props.hasCheckpoint}\n onClick={props.onReturnToLatest}\n />\n </Show>\n </div>\n );\n}\n\nfunction DraftCard(props: {\n url: AutomergeUrl;\n members: DraftMemberDoc[];\n mainDocUrl: AutomergeUrl | undefined;\n isSelected: boolean;\n name: string | null;\n onRename: (name: string | null) => void;\n onSelect: (url: AutomergeUrl) => void;\n onScrub: (scrub: ScrubberState) => void;\n scrubber: Accessor<ScrubberState | null>;\n onDragVersion: (head: ChangeRef | null) => void;\n hasCheckpoint: boolean;\n onReturnToLatest: () => void;\n}) {\n return (\n <div class=\"draft-card\" data-selected={props.isSelected ? \"\" : undefined}>\n {/* A div, not a <button>: see MainCard. */}\n <div\n class=\"draft-card-header\"\n onClick={() => props.onSelect(props.url)}\n title=\"Open draft\"\n >\n <div class=\"draft-card-title\">\n <DraftName\n name={props.name}\n fallback=\"Draft\"\n onRename={props.onRename}\n />\n <Show when={props.isSelected}>\n <span class=\"draft-badge\">current</span>\n </Show>\n </div>\n </div>\n <Show when={props.isSelected}>\n <DraftChangesList\n members={() => props.members}\n mainDocUrl={props.mainDocUrl}\n onScrub={props.onScrub}\n scrubber={props.scrubber}\n onDragVersion={props.onDragVersion}\n />\n <ReturnToLatestButton\n visible={props.hasCheckpoint}\n onClick={props.onReturnToLatest}\n />\n </Show>\n </div>\n );\n}\n\n// Card footer shown while the card's timeline is pinned to a checkpoint:\n// drops the time pin and returns the view to the live latest heads. Rendered\n// outside the scrollable changes area so it never scrolls out of reach.\nfunction ReturnToLatestButton(props: { visible: boolean; onClick: () => void }) {\n return (\n <Show when={props.visible}>\n <button\n type=\"button\"\n class=\"draft-card-return\"\n onClick={props.onClick}\n title=\"Return to the latest version\"\n >\n Return to latest\n </button>\n </Show>\n );\n}\n\n// A card's display name. Double-click to rename inline: Enter or clicking\n// away commits, Escape cancels, and committing an empty value clears the\n// name back to the default label.\nfunction DraftName(props: {\n name: string | null;\n fallback: string;\n onRename: (name: string | null) => void;\n}) {\n const [editing, setEditing] = createSignal(false);\n return (\n <Show\n when={editing()}\n fallback={\n <span\n class=\"draft-name\"\n title=\"Double-click to rename\"\n onDblClick={() => setEditing(true)}\n >\n {props.name ?? props.fallback}\n </span>\n }\n >\n <input\n class=\"draft-name-input\"\n value={props.name ?? \"\"}\n placeholder={props.fallback}\n // Focus once mounted; the ref fires before insertion, hence the tick.\n ref={(el) => setTimeout(() => el.select())}\n onClick={(e) => e.stopPropagation()}\n onDblClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\") setEditing(false);\n }}\n onBlur={(e) => {\n if (!editing()) return; // already cancelled via Escape\n setEditing(false);\n const value = e.currentTarget.value.trim();\n if (value !== (props.name ?? \"\")) props.onRename(value || null);\n }}\n />\n </Show>\n );\n}\n\n// One change in the interleaved timeline. `docUrl` is the original member url\n// (used for labelling and as the checkpoint anchor), never the per-draft clone\n// the change was read from. `title` is the source document's display title.\n// `seq` is the change's per-document causal index, used only to break\n// timestamp ties (see `collectInterleavedChanges`). `additions`/`deletions`\n// are the change's rough edit magnitude, aggregated for the group +/- counts.\ntype DraftChange = {\n docUrl: AutomergeUrl;\n title: string;\n hash: string;\n // Automerge change time, in SECONDS (multiply by 1000 for a JS Date).\n time: number;\n actor: string;\n message: string | null;\n seq: number;\n additions: number;\n deletions: number;\n};\n\n// One burst of activity: consecutive changes separated by no more than\n// INACTIVITY_GAP, regardless of author or document. Rendered as a single\n// non-expandable row. Clicking it parks the scrubber at `newest`.\ntype TimeGroup = {\n id: string;\n endTime: number;\n actors: string[];\n additions: number;\n deletions: number;\n newest: DraftChange;\n changes: DraftChange[];\n};\n\n// A reference to one change in the interleaved timeline, by document and\n// hash. `time` steers how the *other* member docs' heads are resolved around\n// it (see `computeCheckpoint`).\ntype ChangeRef = {\n docUrl: AutomergeUrl;\n hash: string;\n time: number;\n};\n\n// Where the scrubber sits: the change whose heads the view displays. The\n// head is anchored by change identity rather than index so a recomputed\n// timeline doesn't move the token.\ntype ScrubberState = {\n head: ChangeRef;\n};\n\n// Strip a timeline change down to the fields that identify it for scrubbing.\nfunction changeRef(change: DraftChange): ChangeRef {\n return { docUrl: change.docUrl, hash: change.hash, time: change.time };\n}\n\n// Renders a draft's (or main's) changes as a timeline of activity groups:\n// every member doc's changes interleaved newest first, then split wherever\n// the editing paused for INACTIVITY_GAP (see `groupChanges`). A gutter on\n// the left spans the whole history (top = latest change, bottom = first);\n// the indicator — a calendar-style dot + line — marks the version being\n// looked at. Its line paints *under* the (semi-transparent) group rows;\n// dragging starts only from its handles in the gutter. While pinned, a\n// sticker overlays the row at the head with the exact change the line sits\n// on. The member set is passed in (from the card's `DraftSummary`); the\n// effect below keeps the timeline live as those docs edit.\nfunction DraftChangesList(props: {\n members: Accessor<DraftMemberDoc[]>;\n mainDocUrl: AutomergeUrl | undefined;\n onScrub: (scrub: ScrubberState) => void;\n scrubber: Accessor<ScrubberState | null>;\n onDragVersion: (head: ChangeRef | null) => void;\n}) {\n const [changes, setChanges] = createSignal<DraftChange[]>([]);\n\n // Whenever the member set changes, resolve a handle per member, listen for\n // edits so the timeline stays live, and recompute. A `disposed` flag guards\n // against the async resolution landing after the effect was torn down.\n createEffect(() => {\n const list = props.members();\n const mainDocUrl = props.mainDocUrl;\n const repo = \"repo\" in window ? window.repo : undefined;\n if (!repo) return;\n\n let disposed = false;\n const listeners: { handle: DocHandle<unknown>; onChange: () => void }[] =\n [];\n\n const recompute = async () => {\n const next = await collectInterleavedChanges(repo, list, mainDocUrl);\n if (!disposed) setChanges(next);\n };\n\n void (async () => {\n for (const member of list) {\n const handle = await repo.find<unknown>(member.cloneUrl ?? member.url);\n if (disposed) return;\n const onChange = () => void recompute();\n handle.on(\"change\", onChange);\n listeners.push({ handle, onChange });\n }\n void recompute();\n })();\n\n onCleanup(() => {\n disposed = true;\n for (const { handle, onChange } of listeners) {\n handle.off(\"change\", onChange);\n }\n });\n });\n\n // The flat, newest-first history folded into activity groups for rendering.\n // Groups whose changes carry no edits (metadata-only churn — zero +/-\n // counts) are dropped from the timeline entirely.\n const timeGroups = createMemo(() =>\n groupChanges(changes()).filter((g) => g.additions > 0 || g.deletions > 0)\n );\n\n // The scrubbable timeline: the visible groups' changes flattened\n // newest-first. All scrubber indices refer to this list, so it must stay\n // consistent with the rendered rows (not the raw, unfiltered history).\n const visibleChanges = createMemo(() =>\n timeGroups().flatMap((g) => g.changes)\n );\n\n // Scrub so the head sits at the timeline change at `headIndex` (global,\n // 0 = newest).\n const scrubTo = (headIndex: number) => {\n const head = visibleChanges()[headIndex];\n if (!head) return;\n props.onScrub({ head: changeRef(head) });\n };\n\n // Jump the scrubber to a group: head at the group's newest change.\n const scrubToGroup = (group: TimeGroup) => {\n props.onScrub({ head: changeRef(group.newest) });\n };\n\n // Where the scrubber head sits in the flat timeline; null when nothing is\n // pinned (live latest) or the anchored change vanished from a recompute.\n const headIndex = createMemo<number | null>(() => {\n const s = props.scrubber();\n if (!s) return null;\n const idx = visibleChanges().findIndex(\n (c) => c.hash === s.head.hash && c.docUrl === s.head.docUrl\n );\n return idx >= 0 ? idx : null;\n });\n\n const groupContainsHead = (group: TimeGroup): boolean => {\n const s = props.scrubber();\n return (\n !!s &&\n group.changes.some(\n (c) => c.hash === s.head.hash && c.docUrl === s.head.docUrl\n )\n );\n };\n\n // --- Scrubber geometry ---------------------------------------------------\n // The track mirrors the rows column: each group row is one vertical band,\n // and the group's changes distribute evenly across the band's height, so\n // every individual change — including ones in the middle of a group — is a\n // valid stop for the token, not just group boundaries.\n const rowEls = new Map<string, HTMLElement>();\n const [rowsEl, setRowsEl] = createSignal<HTMLDivElement>();\n // Bumped after layout changes so `bands` re-measures the rendered rows.\n const [measureTick, setMeasureTick] = createSignal(0);\n\n createEffect(() => {\n const el = rowsEl();\n if (!el) return;\n const observer = new ResizeObserver(() => setMeasureTick((t) => t + 1));\n observer.observe(el);\n onCleanup(() => observer.disconnect());\n });\n\n // Rows render after the groups memo recomputes, so measure again on the\n // next frame once the DOM has settled.\n createEffect(() => {\n timeGroups();\n requestAnimationFrame(() => setMeasureTick((t) => t + 1));\n });\n\n type Band = {\n startIndex: number;\n count: number;\n top: number;\n height: number;\n };\n const bands = createMemo<Band[]>(() => {\n measureTick();\n const out: Band[] = [];\n let index = 0;\n for (const group of timeGroups()) {\n const el = rowEls.get(group.id);\n if (el) {\n out.push({\n startIndex: index,\n count: group.changes.length,\n top: el.offsetTop,\n height: el.offsetHeight,\n });\n }\n index += group.changes.length;\n }\n return out;\n });\n\n // Map a global change index to a y offset in the track. Indices interpolate\n // across their group's band; an index past the oldest change maps to the\n // very bottom.\n const yForIndex = (index: number): number => {\n const bs = bands();\n if (bs.length === 0) return 0;\n for (const b of bs) {\n if (index < b.startIndex + b.count) {\n return b.top + ((index - b.startIndex) / b.count) * b.height;\n }\n }\n const last = bs[bs.length - 1];\n return last.top + last.height;\n };\n\n // Inverse: the change index nearest a pointer y (in track coordinates).\n const indexForY = (y: number): number => {\n const bs = bands();\n if (bs.length === 0) return 0;\n for (const b of bs) {\n if (y < b.top) return b.startIndex;\n if (y < b.top + b.height) {\n const idx =\n b.startIndex + Math.round(((y - b.top) / b.height) * b.count);\n return Math.min(idx, b.startIndex + b.count - 1);\n }\n }\n const last = bs[bs.length - 1];\n return Math.max(0, last.startIndex + last.count - 1);\n };\n\n // The indicator's pixel position: the head line's y in the track. The\n // zero-height box is fine — the dot and line overflow it and stay\n // grabbable. With nothing pinned it idles at the very top — you're looking\n // at the live latest.\n const tokenGeometry = createMemo(() => {\n if (visibleChanges().length === 0 || bands().length === 0) return null;\n return { top: yForIndex(headIndex() ?? 0) };\n });\n\n let trackEl: HTMLDivElement | undefined;\n\n // Pointer y relative to the track's top edge. The rect is re-read per event\n // so scrolling the card mid-drag stays accurate.\n const yInTrack = (ev: PointerEvent): number => {\n const rect = trackEl!.getBoundingClientRect();\n return ev.clientY - rect.top;\n };\n\n // Begin an indicator drag: the head follows the pointer (offset by where\n // the indicator was grabbed). Scrubbing starts only from the indicator's\n // own handles (dot, line) — the bare gutter and the rows don't scrub.\n // Every position snaps to an individual change, so the indicator can rest\n // anywhere in history — between groups or in the middle of one.\n const beginDrag = (ev: PointerEvent) => {\n if (!trackEl || visibleChanges().length === 0) return;\n ev.preventDefault();\n ev.stopPropagation();\n const grabOffset = yInTrack(ev) - yForIndex(headIndex() ?? 0);\n\n let last = headIndex() ?? 0;\n const onMove = (e: PointerEvent) => {\n const head = indexForY(yInTrack(e) - grabOffset);\n if (head === last) return;\n last = head;\n scrubTo(head);\n };\n\n const target = ev.currentTarget as HTMLElement;\n target.setPointerCapture(ev.pointerId);\n const onUp = () => {\n target.removeEventListener(\"pointermove\", onMove);\n target.removeEventListener(\"pointerup\", onUp);\n target.removeEventListener(\"pointercancel\", onUp);\n };\n target.addEventListener(\"pointermove\", onMove);\n target.addEventListener(\"pointerup\", onUp);\n target.addEventListener(\"pointercancel\", onUp);\n };\n\n // Start a native drag carrying a version out of the timeline. The payload\n // rides in a component signal (source and drop zone share the panel);\n // dataTransfer is only set so the browser actually starts the drag.\n const beginVersionDrag = (ev: DragEvent, head: ChangeRef) => {\n if (!ev.dataTransfer) return;\n ev.dataTransfer.setData(\"text/plain\", `${head.docUrl}#${head.hash}`);\n ev.dataTransfer.effectAllowed = \"copy\";\n props.onDragVersion(head);\n };\n\n // The exact change the scrubber head sits on; feeds the sticker that\n // overlays the group row with the version being looked at. It is\n // suppressed when the head sits exactly on a group's newest change (the\n // row already shows that version).\n const headChange = createMemo<DraftChange | null>(() => {\n const idx = headIndex();\n const change = idx === null ? null : (visibleChanges()[idx] ?? null);\n if (!change) return null;\n const atGroupStart = timeGroups().some(\n (g) => g.newest.hash === change.hash && g.newest.docUrl === change.docUrl\n );\n return atGroupStart ? null : change;\n });\n\n return (\n <div class=\"draft-card-changes\">\n <Show\n when={timeGroups().length > 0}\n fallback={<div class=\"draft-changes-empty\">No changes yet.</div>}\n >\n <div class=\"draft-changes-body\">\n <div class=\"draft-scrubber\" ref={trackEl} />\n <div class=\"draft-changes-rows\" ref={setRowsEl}>\n <For each={timeGroups()}>\n {(group) => (\n <TimeGroupRow\n group={group}\n rowRef={(el) => rowEls.set(group.id, el)}\n isSelected={groupContainsHead(group)}\n onSelect={() => scrubToGroup(group)}\n onVersionDragStart={(e) =>\n beginVersionDrag(e, changeRef(group.newest))\n }\n onVersionDragEnd={() => props.onDragVersion(null)}\n />\n )}\n </For>\n </div>\n <Show when={tokenGeometry()}>\n <div\n class=\"draft-scrubber-token\"\n data-live={headIndex() === null ? \"\" : undefined}\n style={{ top: `${tokenGeometry()!.top}px` }}\n >\n {/* The head line, painted under the group rows. */}\n <div class=\"draft-scrubber-line\" />\n {/* Grab handle, confined to the gutter. */}\n <div\n class=\"draft-scrubber-edge\"\n title=\"Drag to scrub through history\"\n onPointerDown={beginDrag}\n />\n <div\n class=\"draft-scrubber-dot\"\n title=\"Drag to scrub through history\"\n onPointerDown={beginDrag}\n />\n {/* Pinned inside a group: overlay the row with the exact\n version the head sits on. Draggable — dragging it out forks\n a new draft at that version. */}\n <Show when={headChange()}>\n {(change) => (\n <div\n class=\"draft-scrubber-sticker\"\n draggable={true}\n title=\"Drag out to fork a new draft from this version\"\n onDragStart={(e) =>\n beginVersionDrag(e, changeRef(change()))\n }\n onDragEnd={() => props.onDragVersion(null)}\n >\n <span class=\"draft-sticker-time\">\n {formatTime(change().time)}\n </span>\n <span class=\"draft-sticker-title\">{change().title}</span>\n <span class=\"draft-sticker-spacer\" />\n <EditCounts\n additions={change().additions}\n deletions={change().deletions}\n />\n </div>\n )}\n </Show>\n </div>\n </Show>\n </div>\n </Show>\n </div>\n );\n}\n\n// One time group, rendered as a single non-expandable row: author avatars,\n// the group's newest timestamp, and the aggregated +/- counts. Clicking the\n// row parks the scrubber at the top of the group. The row highlights while\n// the scrubber head sits inside the group. Dragging the row out forks a new\n// draft at the group's newest change (the same version clicking pins);\n// dragstart only fires past the movement threshold, so click-to-select is\n// unaffected.\nfunction TimeGroupRow(props: {\n group: TimeGroup;\n rowRef: (el: HTMLElement) => void;\n isSelected: boolean;\n onSelect: () => void;\n onVersionDragStart: (e: DragEvent) => void;\n onVersionDragEnd: () => void;\n}) {\n return (\n <button\n type=\"button\"\n class=\"draft-group-row\"\n ref={props.rowRef}\n data-selected={props.isSelected ? \"\" : undefined}\n title=\"View the draft as of this group — drag out to fork a draft from it\"\n onClick={props.onSelect}\n draggable={true}\n onDragStart={props.onVersionDragStart}\n onDragEnd={props.onVersionDragEnd}\n >\n <AuthorAvatars actors={props.group.actors} />\n <span class=\"draft-group-time\">{formatTime(props.group.endTime)}</span>\n <span class=\"draft-group-spacer\" />\n <EditCounts\n additions={props.group.additions}\n deletions={props.group.deletions}\n />\n </button>\n );\n}\n\n// A stack of author avatars (deduped), newest-contributor first.\nfunction AuthorAvatars(props: { actors: string[] }) {\n const visible = () => props.actors.slice(0, 3);\n const extra = () => Math.max(0, props.actors.length - 3);\n return (\n <div class=\"draft-avatars\">\n <For each={visible()}>\n {(actor, i) => (\n <div\n class=\"draft-avatar\"\n title={actor}\n style={{\n background: authorColor(actor),\n \"margin-left\": i() === 0 ? \"0\" : \"-4px\",\n \"z-index\": String(visible().length - i()),\n }}\n >\n {getInitials(actor)}\n </div>\n )}\n </For>\n <Show when={extra() > 0}>\n <div class=\"draft-avatar draft-avatar--extra\">+{extra()}</div>\n </Show>\n </div>\n );\n}\n\n// The +N / -N edit-size counts shown at the end of a group row.\nfunction EditCounts(props: { additions: number; deletions: number }) {\n return (\n <span class=\"draft-counts\">\n <Show when={props.additions > 0}>\n <span class=\"draft-count draft-count--add\">+{props.additions}</span>\n </Show>\n <Show when={props.deletions > 0}>\n <span class=\"draft-count draft-count--del\">-{props.deletions}</span>\n </Show>\n </span>\n );\n}\n\n// Fold a flat, newest-first list of changes into activity groups. Consecutive\n// changes stay in the same group while the pause between them is at most\n// INACTIVITY_GAP; a longer lull starts a new group. A group can span any\n// stretch of continuous editing — only inactivity splits it.\nfunction groupChanges(changes: DraftChange[]): TimeGroup[] {\n const timeGroups: TimeGroup[] = [];\n let window: DraftChange[] = [];\n let prevTimeMs: number | null = null;\n\n const flush = () => {\n if (window.length > 0) {\n timeGroups.push(buildTimeGroup(window));\n window = [];\n }\n };\n\n for (const change of changes) {\n const timeMs = change.time * 1000;\n // Rows arrive newest-first, so the previous row is this change's newer\n // neighbour; a gap larger than the threshold between them is a lull.\n if (prevTimeMs !== null && prevTimeMs - timeMs > INACTIVITY_GAP) flush();\n window.push(change);\n prevTimeMs = timeMs;\n }\n flush();\n\n return timeGroups;\n}\n\n// Build one group from a window of newest-first changes: dedupe the authors\n// (newest contributor first) and aggregate the +/- counts.\nfunction buildTimeGroup(windowNewestFirst: DraftChange[]): TimeGroup {\n const actors: string[] = [];\n let additions = 0;\n let deletions = 0;\n for (const c of windowNewestFirst) {\n if (!actors.includes(c.actor)) actors.push(c.actor);\n additions += c.additions;\n deletions += c.deletions;\n }\n const newest = windowNewestFirst[0];\n return {\n id: `tg-${newest.hash}`,\n endTime: newest.time,\n actors,\n additions,\n deletions,\n newest,\n changes: windowNewestFirst,\n };\n}\n\n// Build the checkpoint map for a scrub position. Each member's displayed\n// version (`to`) is its heads as of `head`: the doc that owns that change is\n// pinned exactly to it, every other member to its latest change at or before\n// it (approximate but good enough). The diff baseline (`from`) is always the\n// displayed heads themselves (no diff) — set explicitly (rather than\n// omitted) so a draft doesn't fall back to its fork-point baseline and light\n// up the whole draft diff. Members with no change at or before `head` are\n// omitted entirely: they didn't exist yet, so they fall through to live.\nasync function computeCheckpoint(\n repo: Repo,\n members: DraftMemberDoc[],\n head: ChangeRef\n): Promise<DraftCheckpoint> {\n const checkpoint: DraftCheckpoint = {};\n for (const member of members) {\n try {\n const handle = await repo.find<unknown>(member.cloneUrl ?? member.url);\n const doc = handle.doc();\n if (!doc) continue;\n const since = member.clonedAt ? decodeHeads(member.clonedAt) : [];\n const metas = Automerge.getChangesMetaSince(doc, since);\n\n // Displayed version: exactly the head change for the doc that owns it,\n // otherwise the member's latest change at or before it.\n let to: UrlHeads;\n if (member.url === head.docUrl) {\n // Pin the head's doc exactly even if it falls outside the metas\n // window (robust against a mismatched fork point).\n to = encodeHeads([head.hash]);\n } else {\n let pinnedIndex = -1;\n let bestTime = -Infinity;\n metas.forEach((m, i) => {\n if (m.time <= head.time && m.time >= bestTime) {\n bestTime = m.time;\n pinnedIndex = i;\n }\n });\n if (pinnedIndex < 0) continue;\n to = encodeHeads([metas[pinnedIndex].hash]);\n }\n\n checkpoint[member.url] = { from: to, to };\n } catch (err) {\n console.warn(\n \"[drafts] failed to compute checkpoint for member:\",\n member,\n err\n );\n }\n }\n return checkpoint;\n}\n\n// Collect every member doc's post-fork changes into one interleaved timeline,\n// newest first. `getChangesMetaSince` returns each doc's changes in topological\n// (causal, oldest-first) order, so we stamp each change with its per-document\n// `seq` index and sort by time with `seq` as the tie-break: `meta.time` is only\n// second-resolution, so changes sharing a timestamp fall back to their\n// document's own change order rather than being shuffled. On a draft `clonedAt`\n// is set, so reading the clone since that fork point yields exactly the draft's\n// own changes; on main both clone fields are null, so we read the original doc\n// since `[]` for its full history. Members with no changes are omitted.\n//\n// Changes that predate the root document's creation are dropped: a member doc\n// dragged in after the fact (e.g. a tldraw with its own prior edit history)\n// would otherwise contribute changes from before this document even existed,\n// which reads as noise. When the cutoff can't be resolved we keep everything.\nasync function collectInterleavedChanges(\n repo: Repo,\n members: DraftMemberDoc[],\n mainDocUrl: AutomergeUrl | undefined\n): Promise<DraftChange[]> {\n const rows: DraftChange[] = [];\n const createdAt = await getDocCreationTime(repo, mainDocUrl);\n for (const member of members) {\n try {\n const handle = await repo.find<unknown>(member.cloneUrl ?? member.url);\n const doc = handle.doc();\n if (!doc) continue;\n const since = member.clonedAt ? decodeHeads(member.clonedAt) : [];\n const metas = Automerge.getChangesMetaSince(doc, since);\n if (metas.length === 0) continue;\n const title = await resolveDocTitle(doc, member.url);\n metas.forEach((meta, seq) => {\n // Hide anything from before the root document was created. `seq` still\n // reflects the change's true per-document position, so dropping rows\n // here doesn't disturb the tie-break ordering.\n if (createdAt !== undefined && meta.time && meta.time < createdAt) {\n return;\n }\n const { additions, deletions } = computeEditCounts(\n doc as Automerge.Doc<unknown>,\n meta.hash,\n meta.deps\n );\n rows.push({\n docUrl: member.url,\n title,\n hash: meta.hash,\n time: meta.time,\n actor: meta.actor,\n message: meta.message,\n seq,\n additions,\n deletions,\n });\n });\n } catch (err) {\n // A member doc that can't be resolved (or whose fork point is missing)\n // is simply omitted rather than failing the whole list.\n console.warn(\"[drafts] failed to read changes for member:\", member, err);\n }\n }\n // Newest first by timestamp. On a tie (meta.time is only second-resolution),\n // fall back to each document's own change order, also newest-first: `seq` is\n // the per-document causal index (oldest = 0), so the higher (later) seq sorts\n // first. This keeps same-second changes consistent with the newest-first\n // intent instead of flipping that run to oldest-first.\n rows.sort((a, b) => b.time - a.time || b.seq - a.seq);\n return rows;\n}\n\n// Work out one change's rough edit magnitude by diffing it against its parents\n// and counting its patches: splice lengths and insert counts as additions, del\n// lengths as deletions, everything else (put / inc / mark / …) as one addition.\n// `@patchwork` metadata paths are ignored. Feeds the group +/- counts.\nfunction computeEditCounts(\n doc: Automerge.Doc<unknown>,\n hash: string,\n deps: string[]\n): { additions: number; deletions: number } {\n let additions = 0;\n let deletions = 0;\n try {\n const patches = Automerge.diff(\n doc,\n deps as unknown as Automerge.Heads,\n [hash] as unknown as Automerge.Heads\n );\n for (const patch of patches) {\n if (patch.path[0] === \"@patchwork\") continue;\n if (patch.action === \"splice\") {\n additions += (patch.value as string).length;\n } else if (patch.action === \"insert\") {\n additions += Array.isArray((patch as { values?: unknown[] }).values)\n ? (patch as { values: unknown[] }).values.length\n : 1;\n } else if (patch.action === \"del\") {\n deletions += (patch as { length?: number }).length ?? 1;\n } else {\n additions += 1;\n }\n }\n } catch (err) {\n console.warn(\"[drafts] failed to diff change for edit counts:\", hash, err);\n }\n return { additions, deletions };\n}\n\n// When was a document created, as a Unix SECONDS timestamp? Reads the doc's\n// full history and returns its first change's time (the creation change).\n// Returns undefined when the doc, its history, or that time can't be resolved,\n// in which case callers skip the \"before creation\" filter rather than hiding\n// everything.\nasync function getDocCreationTime(\n repo: Repo,\n url: AutomergeUrl | undefined\n): Promise<number | undefined> {\n if (!url) return undefined;\n try {\n const handle = await repo.find<unknown>(url);\n const doc = handle.doc();\n if (!doc) return undefined;\n const metas = Automerge.getChangesMetaSince(doc, []);\n return metas[0]?.time || undefined;\n } catch (err) {\n console.warn(\"[drafts] failed to resolve creation time for:\", url, err);\n return undefined;\n }\n}\n\n// Resolve a document's display title: prefer its cached `@patchwork.title`,\n// otherwise ask its datatype for one, falling back to a short url. Mirrors the\n// sideboard's `docLinkFromUrl` but reuses an already-loaded doc.\nasync function resolveDocTitle(\n doc: unknown,\n url: AutomergeUrl\n): Promise<string> {\n try {\n const meta = (doc as { \"@patchwork\"?: { title?: string; type?: string } })[\n \"@patchwork\"\n ];\n if (typeof meta?.title === \"string\" && meta.title) return meta.title;\n\n const type = meta?.type;\n if (type) {\n const registry = getRegistry(\"patchwork:datatype\");\n const datatype = registry.get(type);\n if (datatype) {\n await registry.load(datatype.id);\n if (isLoadedPlugin(datatype)) {\n const title = datatype.module.getTitle(doc);\n if (title) return title;\n }\n }\n }\n } catch (err) {\n console.warn(\"[drafts] failed to resolve title for:\", url, err);\n }\n return shortUrl(url);\n}\n\n// \"automerge:4NMNnk…AVdXu\" → a compact, fixed-width label for a doc url.\nfunction shortUrl(url: AutomergeUrl): string {\n const id = url.replace(/^automerge:/, \"\");\n if (id.length <= 10) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\n// A stable-ish color for an author, so the same person reads the same across\n// rows. Actors are Automerge actor ids (per device/session), the best \"who\"\n// signal available in a draft's raw change history.\nfunction authorColor(authorId: string): string {\n let hash = 0;\n for (let i = 0; i < authorId.length; i++) {\n hash = authorId.charCodeAt(i) + ((hash << 5) - hash);\n }\n const h = Math.abs(hash) % 360;\n return `hsl(${h}, 45%, 63%)`;\n}\n\n// Two short characters to stand in for an author on their avatar.\nfunction getInitials(authorId: string): string {\n return authorId.slice(0, 2).toUpperCase();\n}\n\n// Format an Automerge change time (Unix SECONDS) as a short local timestamp.\nfunction formatTime(timeSeconds: number): string {\n if (!timeSeconds) return \"\";\n const date = new Date(timeSeconds * 1000);\n const datePart = date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n const timePart = date.toLocaleTimeString(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n });\n return `${datePart}, ${timePart}`;\n}\n","import { render } from \"solid-js/web\";\nimport { RepoContext } from \"solid-automerge\";\nimport type { ToolImplementation } from \"@inkandswitch/patchwork-plugins\";\nimport { DraftsSidebar } from \"./DraftsSidebar\";\n\nexport const renderDraftsSidebar: ToolImplementation = (_handle, element) => {\n return render(\n () => (\n <RepoContext.Provider value={element.repo}>\n <DraftsSidebar element={element} />\n </RepoContext.Provider>\n ),\n element\n );\n};\n"],"names":["ms","require$$0","debug","template","Providers.subscribe","EMPTY_DRAFT_LIST","main","url","members","childCount","name","drafts","DRAFTS_VERSION","console","log","INACTIVITY_GAP","DraftsSidebar","props","hostDoc","hostDocHandle","subscribeDoc","element","type","checkedOutHandle","checkedOut","createDocSignal","selected","createMemo","scrubber","setScrubber","createSignal","dragVersion","setDragVersion","dropActive","setDropActive","list","subscribe","isMainSelected","isFolder","selectDraft","handle","change","d","at","getRepo","window","repo","undefined","scrubSeq","onScrub","draftUrl","scrub","seq","checkpoint","computeCheckpoint","head","clearCheckpoint","onCreateDraft","docHandle","warn","mainDraft","ensureMainDraft","draft","create","parent","clones","push","existingUrl","doc","mainDraftUrl","find","isMain","onCreateDraftFromVersion","member","to","cloneUrl","clone","cloneAtVersion","clonedAt","err","reportForkFailure","collectForkDiagnostic","onRename","onMergeDraft","confirm","draftHandle","mergeDraft","_el$","_tmpl$7","_el$9","firstChild","_$insert","_$createComponent","Show","when","fallback","_tmpl$8","children","_el$2","_tmpl$2","_el$3","$$click","_tmpl$","_$effect","_p$","_v$","_v$2","e","disabled","t","_$setAttribute","_el$5","_tmpl$3","MainCard","hostDocUrl","isSelected","onSelect","onDragVersion","hasCheckpoint","_$memo","onReturnToLatest","For","each","summary","DraftCard","mainDocUrl","_el$6","_tmpl$6","_el$7","_tmpl$4","addEventListener","preventDefault","version","dataTransfer","dropEffect","_el$8","_tmpl$5","entries","Object","originalUrl","entry","original","Promise","all","merge","mergedAt","heads","Date","now","pinHeads","decodeHeads","metas","Automerge","getChangesMetaSince","byHash","Map","map","m","hash","closure","Set","stack","length","pop","has","meta","get","Error","add","deps","bundle","saveBundle","pinned","loadIncremental","init","gotHeads","getHeads","sort","wantHeads","JSON","stringify","update","diagnostic","draftsVersion","memberUrl","sourceUrl","memberClonedAt","toHex","currentHeads","hasHeads","missingDeps","stats","automerge","pinnedChanges","fragments","probeErrors","probe","run","String","getMissingDeps","s","numChanges","numOps","info","releaseInfo","jsGitHead","js","gitHead","wasmGitHead","wasm","wasmVersion","cargoPackageVersion","topo","topoHistoryTraversal","metaByHash","topoIndex","indexOf","known","time","actor","isCurrentHead","includes","h","i","getFragmentMetadata","f","min","Infinity","max","containsPin","level","memberCount","topoRange","bytes","save","binary","CHUNK","fromCharCode","subarray","lastForkRepro","docBase64","btoa","failure","message","error","__draftsForkRepro","_el$1","_tmpl$0","_el$10","_el$11","_$addEventListener","DraftName","_tmpl$9","DraftChangesList","ReturnToLatestButton","visible","onClick","_el$13","_tmpl$1","_el$14","_el$15","_el$17","_tmpl$10","editing","setEditing","_el$19","_tmpl$12","$$dblclick","_el$18","_tmpl$11","value","currentTarget","trim","$$keydown","key","blur","stopPropagation","_$use","el","setTimeout","select","changeRef","docUrl","changes","setChanges","createEffect","disposed","listeners","recompute","next","collectInterleavedChanges","onChange","on","onCleanup","off","timeGroups","groupChanges","filter","g","additions","deletions","visibleChanges","flatMap","scrubTo","headIndex","scrubToGroup","group","newest","idx","findIndex","c","groupContainsHead","some","rowEls","rowsEl","setRowsEl","measureTick","setMeasureTick","observer","ResizeObserver","observe","disconnect","requestAnimationFrame","bands","out","index","id","startIndex","count","top","offsetTop","height","offsetHeight","yForIndex","bs","b","last","indexForY","y","Math","round","tokenGeometry","trackEl","yInTrack","ev","rect","getBoundingClientRect","clientY","beginDrag","grabOffset","onMove","target","setPointerCapture","pointerId","onUp","removeEventListener","beginVersionDrag","setData","effectAllowed","headChange","atGroupStart","_el$20","_tmpl$15","_tmpl$16","_el$21","_tmpl$14","_el$22","_el$23","nextSibling","_ref$","TimeGroupRow","rowRef","set","onVersionDragStart","onVersionDragEnd","_el$24","_tmpl$13","_el$25","_el$26","_el$27","$$pointerdown","_el$29","_tmpl$17","_el$30","_el$31","formatTime","title","EditCounts","_v$3","_v$4","_$setStyleProperty","_el$33","_tmpl$18","_el$34","_ref$2","AuthorAvatars","actors","endTime","slice","extra","_el$36","_tmpl$20","_el$39","_tmpl$21","getInitials","_v$5","authorColor","_v$6","_v$7","a","_el$37","_tmpl$19","_el$40","_tmpl$24","_el$41","_tmpl$22","_el$43","_tmpl$23","prevTimeMs","flush","buildTimeGroup","timeMs","windowNewestFirst","since","encodeHeads","pinnedIndex","bestTime","forEach","from","rows","createdAt","getDocCreationTime","resolveDocTitle","computeEditCounts","patches","diff","patch","path","action","Array","isArray","values","registry","getRegistry","datatype","load","isLoadedPlugin","module","getTitle","shortUrl","replace","authorId","charCodeAt","abs","toUpperCase","timeSeconds","date","datePart","toLocaleDateString","month","day","timePart","toLocaleTimeString","hour","minute","second","hour12","_$delegateEvents","renderDraftsSidebar","_handle","render","RepoContext","Provider"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|