{
  "version": 3,
  "sources": ["../public/core.mjs", "../public/theme-mode.mjs", "../public/export.mjs", "../node_modules/fflate/esm/browser.js", "../src/shared/project-document.mjs", "../public/portable.mjs", "../public/reorder.mjs", "../public/relationships.mjs", "../public/save-coordinator.mjs", "../public/draft-journal.mjs", "../public/guest-attachments.mjs", "../public/markdown.mjs", "../public/board-controls.mjs", "../public/app.js"],
  "sourcesContent": ["export function themeChain(themes, themeId) {\n  const byId = new Map(themes.map((theme) => [theme.id, theme]));\n  const result = [];\n  const seen = new Set();\n  let current = byId.get(themeId);\n  while (current && !seen.has(current.id)) {\n    result.push(current.id);\n    seen.add(current.id);\n    current = current.parentId ? byId.get(current.parentId) : null;\n  }\n  return result;\n}\n\nexport function effectiveImplementations(state, themeId) {\n  const chain = themeChain(state.themes, themeId);\n  const current = state.themes.find((theme) => theme.id === themeId);\n  const hidden = new Set(current?.hiddenInheritedImplementationIds || []);\n  return state.implementations\n    .filter((implementation) => {\n      const direct = implementation.themeIds.includes(themeId);\n      const inherited = implementation.themeIds.some((id) => chain.includes(id));\n      return inherited && (direct || !hidden.has(implementation.id));\n    })\n    .map((implementation) => ({\n      ...implementation,\n      directInTheme: implementation.themeIds.includes(themeId),\n      originThemeIds: implementation.themeIds.filter((id) => chain.includes(id)),\n    }));\n}\n\nexport function effectiveConflicts(state, themeId) {\n  const chain = themeChain(state.themes, themeId);\n  const current = state.themes.find((theme) => theme.id === themeId);\n  const applicable = state.conflicts.filter((conflict) => conflict.themeId === null || chain.includes(conflict.themeId));\n  const overridden = new Set(applicable.filter((conflict) => conflict.overridesConflictId).map((conflict) => conflict.overridesConflictId));\n  const hidden = new Set(current?.hiddenInheritedConflictIds || []);\n  return applicable.filter((conflict) => {\n    if (overridden.has(conflict.id)) return false;\n    const local = conflict.themeId === themeId;\n    return local || !hidden.has(conflict.id);\n  });\n}\n\nexport function blockingConflicts(conflicts, lockedIds, candidateId) {\n  const locked = new Set(lockedIds);\n  return conflicts.filter((conflict) => {\n    if (!conflict.implementationIds.includes(candidateId)) return false;\n    return conflict.implementationIds.every((id) => id === candidateId || locked.has(id));\n  });\n}\n\nexport function normalizeLocked(conflicts, requestedIds) {\n  const result = [];\n  for (const id of requestedIds) {\n    if (blockingConflicts(conflicts, result, id).length === 0) result.push(id);\n  }\n  return result;\n}\n\nexport function requirementClosure(requirements, requestedIds) {\n  const selected = new Set(requestedIds);\n  let changed = true;\n  while (changed) {\n    changed = false;\n    for (const requirement of requirements || []) {\n      if (selected.has(requirement.fromImplementationId) && !selected.has(requirement.toImplementationId)) {\n        selected.add(requirement.toImplementationId);\n        changed = true;\n      }\n    }\n  }\n  return [...selected];\n}\n\nexport function lockWithRequirements(conflicts, requirements, lockedIds, candidateId, availableIds) {\n  const locked = requirementClosure(requirements, [...lockedIds, candidateId]);\n  const available = availableIds ? new Set(availableIds) : null;\n  const missingIds = available ? locked.filter((id) => !available.has(id)) : [];\n  const completedConflicts = conflicts.filter((conflict) => conflict.implementationIds.every((id) => locked.includes(id)));\n  return { locked, missingIds, completedConflicts };\n}\n\nexport function normalizeLockedWithRequirements(conflicts, requirements, requestedIds, availableIds) {\n  let result = [];\n  for (const id of requestedIds) {\n    const proposal = lockWithRequirements(conflicts, requirements, result, id, availableIds);\n    if (!proposal.missingIds.length && !proposal.completedConflicts.length) result = proposal.locked;\n  }\n  return result;\n}\n\nexport function unlockRequirementDependents(requirements, lockedIds, implementationId) {\n  return lockedIds.filter((id) => id !== implementationId && !requirementClosure(requirements, [id]).includes(implementationId));\n}\n\nexport function implementationConflictCount(conflicts, implementationId) {\n  return conflicts.filter((conflict) => conflict.implementationIds.includes(implementationId)).length;\n}\n\nexport function blendBackground(colors) {\n  const clean = colors.filter(Boolean);\n  if (!clean.length) return 'linear-gradient(135deg, #f8fafc, #eef2f7)';\n  if (clean.length === 1) return clean[0];\n  const step = 100 / clean.length;\n  const stops = clean.flatMap((color, index) => [`${color} ${index * step}%`, `${color} ${(index + 1) * step}%`]);\n  return `linear-gradient(135deg, ${stops.join(', ')})`;\n}\n\nexport function readableTextColor(colors) {\n  const clean = colors.filter(Boolean);\n  if (!clean.length) return '#172033';\n  const values = clean.map((hex) => {\n    const normalized = hex.replace('#', '');\n    if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return 230;\n    const r = parseInt(normalized.slice(0, 2), 16);\n    const g = parseInt(normalized.slice(2, 4), 16);\n    const b = parseInt(normalized.slice(4, 6), 16);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  });\n  const average = values.reduce((sum, value) => sum + value, 0) / values.length;\n  return average < 145 ? '#ffffff' : '#172033';\n}\n", "export const THEME_MODES = ['auto', 'light', 'dark'];\nexport const DEFAULT_MODE = 'auto';\nconst VALID = new Set(THEME_MODES);\n\nexport function normalizeMode(value) {\n  return VALID.has(value) ? value : DEFAULT_MODE;\n}\n\nexport function resolveThemeMode(preference, systemPrefersDark) {\n  const mode = normalizeMode(preference);\n  if (mode === 'light') return 'light';\n  if (mode === 'dark') return 'dark';\n  return systemPrefersDark ? 'dark' : 'light';\n}\n\nexport function nextMode(current) {\n  const mode = normalizeMode(current);\n  const index = THEME_MODES.indexOf(mode);\n  return THEME_MODES[(index + 1) % THEME_MODES.length];\n}\n\nexport function modeLabel(mode) {\n  const resolved = normalizeMode(mode);\n  if (resolved === 'auto') return 'Auto';\n  if (resolved === 'light') return 'Light';\n  return 'Dark';\n}\n\nexport function modeGlyph(mode) {\n  const resolved = normalizeMode(mode);\n  if (resolved === 'auto') return '\u25D0';\n  if (resolved === 'light') return '\u2600';\n  return '\u263E';\n}\n", "export function htmlToMarkdown(html) {\n  if (!html) return '';\n  let md = html;\n  md = md.replace(/<pre>([\\s\\S]*?)<\\/pre>/gi, '\\n```\\n$1\\n```\\n');\n  md = md.replace(/<h1>([\\s\\S]*?)<\\/h1>/gi, (match, content) => {\n    const trimmed = content.trim();\n    return `\\n# ${trimmed}\\n`;\n  });\n  md = md.replace(/<h2>([\\s\\S]*?)<\\/h2>/gi, (match, content) => {\n    const trimmed = content.trim();\n    return `\\n## ${trimmed}\\n`;\n  });\n  md = md.replace(/<h3>([\\s\\S]*?)<\\/h3>/gi, (match, content) => {\n    const trimmed = content.trim();\n    return `\\n### ${trimmed}\\n`;\n  });\n  md = md.replace(/<h4>([\\s\\S]*?)<\\/h4>/gi, (match, content) => {\n    const trimmed = content.trim();\n    return `\\n#### ${trimmed}\\n`;\n  });\n  md = md.replace(/<blockquote>([\\s\\S]*?)<\\/blockquote>/gi, '\\n> $1\\n');\n  md = md.replace(/<ul>([\\s\\S]*?)<\\/ul>/gi, (_, inner) => inner.replace(/<li>([\\s\\S]*?)<\\/li>/gi, '- $1\\n'));\n  md = md.replace(/<ol>([\\s\\S]*?)<\\/ol>/gi, (_, inner) => {\n    let num = 0;\n    return inner.replace(/<li>([\\s\\S]*?)<\\/li>/gi, (m, content) => `${++num}. ${content}\\n`);\n  });\n  md = md.replace(/<p>([\\s\\S]*?)<\\/p>/gi, '\\n\\n$1\\n\\n');\n  md = md.replace(/<br\\s*\\/?>/gi, '\\n');\n  md = md.replace(/<strong>([\\s\\S]*?)<\\/strong>/gi, '**$1**');\n  md = md.replace(/<b>([\\s\\S]*?)<\\/b>/gi, '**$1**');\n  md = md.replace(/<em>([\\s\\S]*?)<\\/em>/gi, '*$1*');\n  md = md.replace(/<i>([\\s\\S]*?)<\\/i>/gi, '*$1*');\n  md = md.replace(/<s>([\\s\\S]*?)<\\/s>/gi, '~~$1~~');\n  md = md.replace(/<u>([\\s\\S]*?)<\\/u>/gi, '$1');\n  md = md.replace(/<code>([\\s\\S]*?)<\\/code>/gi, '`$1`');\n  md = md.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi, '[$2]($1)');\n  md = md.replace(/<\\/?div[^>]*>/gi, '');\n  md = md.replace(/\\n{3,}/g, '\\n\\n');\n  md = md.trim();\n  md = md.replace(/([^\\n])\\n{3,}/g, '$1\\n\\n');\n  return md;\n}\n\nfunction nameOrFallback(item) {\n  return item?.name || item?.title || 'Untitled';\n}\n\nfunction byId(list, id) {\n  return list.find((item) => item.id === id);\n}\n\nfunction stripHtml(value = '') {\n  return value.replace(/<[^>]*>/g, '');\n}\n\nexport function generateExportMarkdown(state) {\n  const lines = [];\n  const h = (level, text) => lines.push(`${'#'.repeat(level)} ${text}`);\n  const p = (text) => lines.push('', text, '');\n  const blank = () => lines.push('');\n  const hr = () => lines.push('', '---', '');\n\n  h(1, state.meta.name);\n  p(`*Created: ${state.meta.createdAt.split('T')[0]} | Updated: ${state.meta.updatedAt.split('T')[0]}*`);\n  hr();\n\n  lines.push('## Table of Contents', '');\n  const sections = [];\n  if (state.ideas.length) sections.push('- [Ideas](#ideas)');\n  if (state.implementations.length) sections.push('- [Implementations](#implementations)');\n  if (state.themes.length) sections.push('- [Themes](#themes)');\n  if (state.ideaGroups.length) sections.push('- [Idea Groups](#idea-groups)');\n  if (state.implementationGroups.length) sections.push('- [Implementation Groups](#implementation-groups)');\n  if (state.groupLinks.length) sections.push('- [Group Connections](#group-connections)');\n  if (state.conflicts.length) sections.push('- [Conflicts](#conflicts)');\n  if (state.savedViews.length) sections.push('- [Saved Views](#saved-views)');\n  lines.push(...sections, '');\n  hr();\n\n  if (state.ideas.length) {\n    h(2, 'Ideas');\n    blank();\n    for (const idea of state.ideas) {\n      const groups = (idea.groupIds || []).map((gid) => byId(state.ideaGroups, gid)).filter(Boolean);\n      h(3, idea.title);\n      if (groups.length) p(`**Groups:** ${groups.map((g) => g.name || 'Untitled').join(', ')}`);\n      if (idea.detailsMarkdown) lines.push(idea.detailsMarkdown);\n      else if (idea.detailsHtml) lines.push(htmlToMarkdown(idea.detailsHtml));\n      blank();\n    }\n    hr();\n  }\n\n  if (state.implementations.length) {\n    h(2, 'Implementations');\n    blank();\n    for (const impl of state.implementations) {\n      const linkedIdeas = (impl.ideaIds || []).map((iid) => byId(state.ideas, iid)).filter(Boolean);\n      const themes = (impl.themeIds || []).map((tid) => byId(state.themes, tid)).filter(Boolean);\n      const groups = (impl.groupIds || []).map((gid) => byId(state.implementationGroups, gid)).filter(Boolean);\n      const relConflicts = state.conflicts.filter((c) => c.implementationIds.includes(impl.id));\n      h(3, impl.title);\n      if (linkedIdeas.length) p(`**Linked Ideas:** ${linkedIdeas.map((i) => i.title).join(', ')}`);\n      if (themes.length) p(`**Themes:** ${themes.map((t) => t.name).join(', ')}`);\n      if (groups.length) p(`**Groups:** ${groups.map((g) => g.name || 'Untitled').join(', ')}`);\n      if (relConflicts.length) p(`**Conflicts:** ${relConflicts.map((c) => c.name).join(', ')}`);\n      if ((impl.attachments || []).length) p(`**Attachments:** ${impl.attachments.map((a) => `${a.name}${a.size ? ` (${(a.size / 1024).toFixed(0)} KB)` : ''}`).join(', ')}`);\n      if (impl.detailsMarkdown) lines.push(impl.detailsMarkdown);\n      else if (impl.detailsHtml) lines.push(htmlToMarkdown(impl.detailsHtml));\n      blank();\n    }\n    hr();\n  }\n\n  if (state.themes.length) {\n    h(2, 'Themes');\n    blank();\n    const children = new Map();\n    for (const theme of state.themes) {\n      const parent = theme.parentId || '__root__';\n      if (!children.has(parent)) children.set(parent, []);\n      children.get(parent).push(theme);\n    }\n    for (const list of children.values()) list.sort((a, b) => a.name.localeCompare(b.name));\n    const walk = (parentId, depth) => {\n      for (const theme of children.get(parentId) || []) {\n        lines.push(`${'  '.repeat(depth)}- **${theme.name}**${theme.parentId ? ` (parent: ${nameOrFallback(byId(state.themes, theme.parentId))})` : ' (root)'}`);\n        walk(theme.id, depth + 1);\n      }\n    };\n    walk('__root__', 0);\n    blank();\n    hr();\n  }\n\n  if (state.ideaGroups.length) {\n    h(2, 'Idea Groups');\n    blank();\n    for (const group of state.ideaGroups) {\n      lines.push(`- **${group.name || 'Untitled'}**${group.description ? ` \u2014 ${group.description}` : ''}${group.color ? ` \\`${group.color}\\`` : ''}`);\n    }\n    blank();\n    hr();\n  }\n\n  if (state.implementationGroups.length) {\n    h(2, 'Implementation Groups');\n    blank();\n    for (const group of state.implementationGroups) {\n      lines.push(`- **${group.name || 'Untitled'}**${group.description ? ` \u2014 ${group.description}` : ''}${group.color ? ` \\`${group.color}\\`` : ''}`);\n    }\n    blank();\n    hr();\n  }\n\n  if (state.groupLinks.length) {\n    h(2, 'Group Connections');\n    blank();\n    for (const link of state.groupLinks) {\n      const ig = byId(state.ideaGroups, link.ideaGroupId);\n      const img = byId(state.implementationGroups, link.implementationGroupId);\n      lines.push(`- **${ig?.name || 'Unknown'}** \u2194 **${img?.name || 'Unknown'}**${link.description ? `: ${link.description}` : ''}`);\n    }\n    blank();\n    hr();\n  }\n\n  if (state.conflicts.length) {\n    h(2, 'Conflicts');\n    blank();\n    for (const conflict of state.conflicts) {\n      const members = (conflict.implementationIds || []).map((iid) => byId(state.implementations, iid)).filter(Boolean);\n      h(3, conflict.name);\n      p(`**Scope:** ${conflict.themeId ? byId(state.themes, conflict.themeId)?.name || 'Unknown' : 'Global'}`);\n      if (members.length) p(`**Members:** ${members.map((m) => m.title).join(', ')}`);\n      if (conflict.overridesConflictId) {\n        const overridden = byId(state.conflicts, conflict.overridesConflictId);\n        if (overridden) p(`*Overrides: ${overridden.name}*`);\n      }\n      if (conflict.detailsMarkdown) lines.push(conflict.detailsMarkdown);\n      else if (conflict.detailsHtml) lines.push(htmlToMarkdown(conflict.detailsHtml));\n      blank();\n    }\n    hr();\n  }\n\n  if (state.savedViews.length) {\n    h(2, 'Saved Views');\n    blank();\n    for (const view of state.savedViews) {\n      const theme = byId(state.themes, view.themeId);\n      lines.push(`- **${view.name}** \u2014 ${view.kind === 'rich' ? 'Rich view' : 'Simple selection'}${theme ? ` in ${theme.name}` : ''}, ${view.lockedImplementationIds.length} locked`);\n    }\n    blank();\n  }\n\n  return lines.join('\\n');\n}\n\nexport function stripBoldFromState(state) {\n  let changed = false;\n  const strip = (html) => {\n    if (!html) return html;\n    const cleaned = html.replace(/<\\/?b[^>]*>/gi, '').replace(/<\\/?strong[^>]*>/gi, '');\n    if (cleaned !== html) changed = true;\n    return cleaned;\n  };\n  for (const idea of state.ideas || []) {\n    idea.detailsHtml = strip(idea.detailsHtml);\n  }\n  for (const impl of state.implementations || []) {\n    impl.detailsHtml = strip(impl.detailsHtml);\n  }\n  for (const conflict of state.conflicts || []) {\n    conflict.detailsHtml = strip(conflict.detailsHtml);\n  }\n  return changed;\n}\n\nexport function escapeHtml(value = '') {\n  return String(value)\n    .replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')\n    .replaceAll('\"', '&quot;').replaceAll(\"'\", '&#039;');\n}\n\nfunction markdownToHtml(md) {\n  if (!md) return '';\n  let html = md;\n  html = html.replace(/```([\\s\\S]*?)```/g, '<pre>$1</pre>');\n  html = html.replace(/^###### (.+)$/gm, '<h6>$1</h6>');\n  html = html.replace(/^##### (.+)$/gm, '<h5>$1</h5>');\n  html = html.replace(/^#### (.+)$/gm, '<h4>$1</h4>');\n  html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');\n  html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');\n  html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');\n  html = html.replace(/^> (.+)$/gm, '<blockquote>$1</blockquote>');\n  const ulMatches = [...html.matchAll(/^(\\s*)- (.+)$/gm)];\n  for (const m of ulMatches) {\n    const indent = m[1]?.length || 0;\n    const content = m[2];\n    const before = html.slice(0, m.index);\n    const inUl = /<ul>/.test(before.split('').reverse().join(''));\n    if (!inUl) {\n      html = html.replace(m[0], '<ul>\\n<li>' + content + '</li>');\n    } else {\n      html = html.replace(m[0], '<li>' + content + '</li>');\n    }\n  }\n  html = html.replace(/^(\\d+)\\. (.+)$/gm, '<ol><li>$2</li></ol>');\n  html = html.replace(/__([^_]+)__/g, '<strong>$1</strong>');\n  html = html.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n  html = html.replace(/_([^_]+)_/g, '<em>$1</em>');\n  html = html.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n  html = html.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n  html = html.replace(/`([^`]+)`/g, '<code>$1</code>');\n  html = html.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\">$1</a>');\n  html = html.replace(/\\n\\n/g, '</p><p>');\n  html = html.replace(/\\n/g, '<br>');\n  html = '<p>' + html + '</p>';\n  html = html.replace(/^<p>(<h[1-6]>)/gm, '$1');\n  html = html.replace(/(<\\/h[1-6]>)<\\/p>$/gm, '$1');\n  html = html.replace(/^<p>(<ul>)/gm, '$1');\n  html = html.replace(/(<\\/ul>)<\\/p>$/gm, '$1');\n  html = html.replace(/^<p>(<ol>)/gm, '$1');\n  html = html.replace(/(<\\/ol>)<\\/p>$/gm, '$1');\n  html = html.replace(/^<p>(<blockquote>)/gm, '$1');\n  html = html.replace(/(<\\/blockquote>)<\\/p>$/gm, '$1');\n  html = html.replace(/^<p>(<pre>)/gm, '$1');\n  html = html.replace(/(<\\/pre>)<\\/p>$/gm, '$1');\n  return html;\n}\n\nfunction parseSection(md, heading) {\n  const lines = md.split('\\n');\n  const startPattern = new RegExp(`^## ${heading}\\\\s*`, '');\n  const endPattern = /^## /;\n  let inSection = false;\n  let content = [];\n  for (const line of lines) {\n    if (startPattern.test(line)) {\n      inSection = true;\n      continue;\n    }\n    if (inSection && endPattern.test(line) && line !== `## ${heading}`) {\n      break;\n    }\n    if (inSection) {\n      content.push(line);\n    }\n  }\n  return content.join('\\n').trim();\n}\n\nfunction parseIdeaEntries(md) {\n  const entries = [];\n  const lines = md.split('\\n');\n  let currentTitle = null;\n  let currentContent = [];\n  for (const line of lines) {\n    if (/^### /.test(line)) {\n      if (currentTitle) entries.push({ title: currentTitle, content: currentContent.join('\\n').trim() });\n      currentTitle = line.replace(/^### /, '').trim();\n      currentContent = [];\n    } else if (currentTitle) {\n      currentContent.push(line);\n    }\n  }\n  if (currentTitle) entries.push({ title: currentTitle, content: currentContent.join('\\n').trim() });\n  return entries;\n}\n\nfunction parseImplEntries(md) {\n  const entries = [];\n  const lines = md.split('\\n');\n  let currentTitle = null;\n  let currentTags = {};\n  let currentContent = [];\n  for (const line of lines) {\n    if (/^### /.test(line)) {\n      if (currentTitle) entries.push({ title: currentTitle, ...currentTags, content: currentContent.join('\\n').trim() });\n      currentTitle = line.replace(/^### /, '').trim();\n      currentTags = {};\n      currentContent = [];\n    } else if (line.startsWith('**') && currentTitle) {\n      const match = line.match(/^\\*\\*([^*]+)\\*\\*\\s*:\\s*(.+)$/);\n      if (match) {\n        const key = match[1].toLowerCase().replace(/\\s+/g, '');\n        const val = match[2].trim();\n        currentTags[key.replace(/ /g, '')] = val;\n      }\n    } else if (line.startsWith('**') && currentTitle) {\n      const match = line.match(/^\\*\\*([^*]+)\\*\\*\\s*:\\s*(.+)$/);\n      if (match) {\n        const key = match[1].toLowerCase();\n        const stripped = key.replace(/\\s+/g, '').replace(/s$/, '');\n        currentTags[stripped] = match[2].trim();\n      }\n    } else if (currentTitle) {\n      currentContent.push(line);\n    }\n  }\n  if (currentTitle) entries.push({ title: currentTitle, ...currentTags, content: currentContent.join('\\n').trim() });\n  return entries;\n}\n\nfunction matchOrCreateGroup(list, name, color = null, description = null) {\n  const existing = list.find((g) => g.name === name);\n  if (existing) return existing.id;\n  const id = crypto.randomUUID();\n  list.push({ id, name, color: color || '', description: description || '' });\n  return id;\n}\n\nfunction matchOrCreateTheme(list, name, parentId = null) {\n  if (!name) return null;\n  const existing = list.find((t) => t.name === name);\n  if (existing) return existing.id;\n  const id = crypto.randomUUID();\n  list.push({ id, name, parentId, hiddenInheritedImplementationIds: [], hiddenInheritedConflictIds: [] });\n  return id;\n}\n\nexport function parseImportMarkdown(md, state) {\n  const lines = md.split('\\n');\n  let projectName = state.meta.name;\n  for (const line of lines) {\n    if (line.startsWith('# ') && !line.startsWith('## ')) {\n      projectName = line.slice(2).trim();\n      break;\n    }\n  }\n  const importedIds = { ideas: [], implementations: [], themes: [], ideaGroups: [], implementationGroups: [] };\n  const ideasSection = parseSection(md, 'Ideas');\n  if (ideasSection) {\n    const ideaEntries = parseIdeaEntries(ideasSection);\n    for (const entry of ideaEntries) {\n      const title = entry.title;\n      const groupMatch = entry.content.match(/^\\*\\*Groups\\*\\*\\s*:\\s*(.+)$/m);\n      const groupNames = groupMatch ? groupMatch[1].split(',').map((s) => s.trim()).filter(Boolean) : [];\n      const groupIds = groupNames.map((g) => matchOrCreateGroup(state.ideaGroups, g));\n      let details = entry.content;\n      details = details.replace(/^\\*\\*Groups\\*\\*\\s*:.+$/m, '').trim();\n      const detailsMarkdown = details;\n      const id = crypto.randomUUID();\n      state.ideas.push({ id, title, detailsMarkdown, groupIds, sortOrder: state.ideas.length });\n      importedIds.ideas.push(id);\n    }\n  }\n  const implSection = parseSection(md, 'Implementations');\n  if (implSection) {\n    const implEntries = parseImplEntries(implSection);\n    for (const entry of implEntries) {\n      const title = entry.title;\n      const ideaNames = (entry.linkedideas || '').split(',').map((s) => s.trim()).filter(Boolean);\n      const themeNames = (entry.themes || '').split(',').map((s) => s.trim()).filter(Boolean);\n      const groupIdNames = (entry.groups || '').split(',').map((s) => s.trim()).filter(Boolean);\n      const ideaIds = ideaNames.map((n) => {\n        const existing = state.ideas.find((i) => i.title === n);\n        if (existing) return existing.id;\n        const id = crypto.randomUUID();\n        state.ideas.push({ id, title: n, detailsMarkdown: '', groupIds: [], sortOrder: state.ideas.length });\n        importedIds.ideas.push(id);\n        return id;\n      });\n      const themeIds = themeNames.map((n) => matchOrCreateTheme(state.themes, n));\n      const groupIds = groupIdNames.map((g) => matchOrCreateGroup(state.implementationGroups, g));\n      const id = crypto.randomUUID();\n      state.implementations.push({ id, title, detailsMarkdown: entry.content || '', ideaIds, themeIds, groupIds, attachments: [], sortOrder: state.implementations.length });\n      importedIds.implementations.push(id);\n    }\n  }\n  state.meta.name = projectName;\n  state.meta.updatedAt = new Date().toISOString();\n  return importedIds;\n}\n", "// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    , // determined by compression function\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n    var e = new Error(msg || ec[ind]);\n    e.code = ind;\n    if (Error.captureStackTrace)\n        Error.captureStackTrace(e, err);\n    if (!nt)\n        throw e;\n    return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data[0]) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush(ev.data[1]);\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n        w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function (sync) { w.postMessage([0, sync]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n        if (final) {\n            // cleanup unneeded buffers/state to reduce memory usage\n            this.s = this.o = {};\n            this.b = et;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n     *             extra bytes, but guarantees all pushed data is immediately\n     *             decompressible. A separate DEFLATE stream may be concatenated\n     *             with the current output after a sync flush.\n     */\n    Deflate.prototype.flush = function (sync) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n        // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n        // but the deterministic trailer (00 00 FF FF) is useful in some situations\n        if (sync) {\n            var c = new u8(6);\n            c[0] = this.s.r >> 3;\n            // write empty, non-final type-0 block\n            var ep = wfblk(c, this.s.r, et);\n            this.s.r = 0;\n            this.ondata(c.subarray(0, ep >> 3), false);\n        }\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n     *             extra bytes, but guarantees all pushed data is immediately\n     *             decompressible.\n     */\n    Gzip.prototype.flush = function (sync) {\n        Deflate.prototype.flush.call(this, sync);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, 0);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n        else if (final) {\n            Inflate.prototype.c.call(this, final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n     *             extra bytes, but guarantees all pushed data is immediately\n     *             decompressible.\n     */\n    Zlib.prototype.flush = function (sync) {\n        Deflate.prototype.flush.call(this, sync);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (ArrayBuffer.isView(val))\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n    var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n    var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n    var nf = nsc + nsu + noff;\n    if (z && nf) {\n        for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n            if (b2(d, b) == 1) {\n                return [\n                    nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n                    nsu ? b8(d, b + 4) : su,\n                    noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n                    1\n                ];\n            }\n        }\n        // z == 2 for unknown whether or not zip64\n        if (z < 2)\n            err(13);\n    }\n    return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        // we shouldn't really do this cast, but properly handling ArrayBufferLike\n        // makes the API unergonomic with Buffer\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (chunk, final) {\n        // same as ZipPassThrough: cast to retain Buffer ergonomics\n        this.ondata(null, chunk, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (chunk, final) {\n        try {\n            this.i.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (chunk, final) {\n        if (this.i.terminate)\n            chunk = slc(chunk, 0);\n        this.i.push(chunk, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n                        if (dd)\n                            sc_1 = -1 - z64;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = b4(data, e - 20) == 0x7064B50;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = b4(data, e - 20) == 0x7064B50;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n", "export const PROJECT_DOCUMENT_VERSION = 2;\nexport const MAX_PROJECT_DOCUMENT_BYTES = 4 * 1024 * 1024;\n\nexport class ProjectValidationError extends Error {\n  constructor(issues) {\n    super(issues[0] || 'Invalid project document.');\n    this.name = 'ProjectValidationError';\n    this.issues = issues;\n  }\n}\n\nconst arrays = [\n  'themes',\n  'ideaGroups',\n  'implementationGroups',\n  'ideas',\n  'implementations',\n  'groupLinks',\n  'conflicts',\n  'requirements',\n  'savedViews',\n];\n\nfunction clone(value) {\n  return structuredClone(value);\n}\n\nfunction string(value, fallback = '') {\n  return typeof value === 'string' ? value : fallback;\n}\n\nfunction stringIds(value) {\n  return Array.isArray(value) ? [...new Set(value.filter((item) => typeof item === 'string' && item))] : [];\n}\n\nfunction legacyHtmlToMarkdown(value = '') {\n  return string(value)\n    .replace(/<pre>([\\s\\S]*?)<\\/pre>/gi, '\\n```\\n$1\\n```\\n')\n    .replace(/<h([1-6])>([\\s\\S]*?)<\\/h\\1>/gi, (_, level, content) => `\\n${'#'.repeat(Number(level))} ${content.trim()}\\n`)\n    .replace(/<blockquote>([\\s\\S]*?)<\\/blockquote>/gi, '\\n> $1\\n')\n    .replace(/<li>([\\s\\S]*?)<\\/li>/gi, '- $1\\n')\n    .replace(/<p>([\\s\\S]*?)<\\/p>/gi, '\\n\\n$1\\n\\n')\n    .replace(/<br\\s*\\/?>/gi, '\\n')\n    .replace(/<(strong|b)>([\\s\\S]*?)<\\/\\1>/gi, '**$2**')\n    .replace(/<(em|i)>([\\s\\S]*?)<\\/\\1>/gi, '*$2*')\n    .replace(/<s>([\\s\\S]*?)<\\/s>/gi, '~~$1~~')\n    .replace(/<code>([\\s\\S]*?)<\\/code>/gi, '`$1`')\n    .replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi, '[$2]($1)')\n    .replace(/<[^>]+>/g, '')\n    .replace(/\\n{3,}/g, '\\n\\n')\n    .trim();\n}\n\nfunction normalizeMarkdownItem(item, fallbackTitle, index) {\n  const normalized = {\n    ...item,\n    id: string(item?.id),\n    detailsMarkdown: string(item?.detailsMarkdown) || legacyHtmlToMarkdown(item?.detailsHtml),\n  };\n  delete normalized.detailsHtml;\n  if (fallbackTitle) normalized.title = string(item?.title, fallbackTitle).slice(0, 240);\n  if (index !== undefined) normalized.sortOrder = Number.isFinite(item?.sortOrder) ? item.sortOrder : index;\n  return normalized;\n}\n\nfunction normalizeView(value = {}) {\n  return {\n    lockedImplementationIds: stringIds(value.lockedImplementationIds),\n    visibleImplementationIds: stringIds(value.visibleImplementationIds),\n    previousVisibleImplementationIds: stringIds(value.previousVisibleImplementationIds),\n    manuallyLockedImplementationIds: stringIds(value.manuallyLockedImplementationIds || value.lockedImplementationIds),\n    selectedImplementationIds: stringIds(value.selectedImplementationIds),\n    expandedIdeaIds: stringIds(value.expandedIdeaIds),\n    expandedImplementationIds: stringIds(value.expandedImplementationIds),\n    showExcluded: value.showExcluded !== false,\n    search: string(value.search),\n    ideaGroupFilterIds: stringIds(value.ideaGroupFilterIds || (value.ideaGroupFilter && value.ideaGroupFilter !== 'all' ? [value.ideaGroupFilter] : [])),\n    knownImplementationIds: stringIds(value.knownImplementationIds),\n    ideaSort: ['manual', 'implementations', 'locked', 'conflicts'].includes(value.ideaSort) ? value.ideaSort : 'manual',\n    ideaSortDirection: value.ideaSortDirection === 'desc' ? 'desc' : 'asc',\n  };\n}\n\nexport function migrateProjectDocument(input) {\n  if (!input || typeof input !== 'object' || Array.isArray(input)) throw new ProjectValidationError(['Project document must be an object.']);\n  const state = clone(input);\n  for (const key of arrays) if (!Array.isArray(state[key])) state[key] = [];\n  state.meta = state.meta && typeof state.meta === 'object' ? state.meta : {};\n  state.uiByTheme = state.uiByTheme && typeof state.uiByTheme === 'object' && !Array.isArray(state.uiByTheme) ? state.uiByTheme : {};\n  state.displaySettings = state.displaySettings && typeof state.displaySettings === 'object' ? state.displaySettings : {};\n\n  state.version = PROJECT_DOCUMENT_VERSION;\n  state.meta.id = string(state.meta.id);\n  state.meta.name = string(state.meta.name, 'My Ideation Project').slice(0, 160);\n  state.meta.createdAt = string(state.meta.createdAt, new Date().toISOString());\n  state.meta.updatedAt = string(state.meta.updatedAt, state.meta.createdAt);\n  state.displaySettings = {\n    ideaTitleSize: Math.min(32, Math.max(12, Number(state.displaySettings.ideaTitleSize) || 18)),\n    ideaDetailsSize: Math.min(24, Math.max(10, Number(state.displaySettings.ideaDetailsSize) || 14)),\n    implementationTitleSize: Math.min(28, Math.max(10, Number(state.displaySettings.implementationTitleSize) || 14)),\n    implementationDetailsSize: Math.min(22, Math.max(10, Number(state.displaySettings.implementationDetailsSize) || 13)),\n  };\n\n  state.themes = state.themes.map((item) => ({\n    ...item,\n    id: string(item?.id),\n    name: string(item?.name, 'Untitled theme').slice(0, 160),\n    parentId: string(item?.parentId) || null,\n    hiddenInheritedImplementationIds: stringIds(item?.hiddenInheritedImplementationIds),\n    hiddenInheritedConflictIds: stringIds(item?.hiddenInheritedConflictIds),\n  }));\n  state.ideas = state.ideas.map((item, index) => ({\n    ...normalizeMarkdownItem(item, 'Untitled idea', index),\n    groupIds: stringIds(item?.groupIds),\n  }));\n  state.implementations = state.implementations.map((item, index) => ({\n    ...normalizeMarkdownItem(item, 'Untitled implementation', index),\n    ideaIds: stringIds(item?.ideaIds),\n    themeIds: stringIds(item?.themeIds),\n    groupIds: stringIds(item?.groupIds),\n    attachments: Array.isArray(item?.attachments) ? item.attachments : [],\n  }));\n  state.conflicts = state.conflicts.map((item) => {\n    const normalized = normalizeMarkdownItem(item);\n    return {\n      ...normalized,\n      name: string(item?.name, 'Untitled conflict').slice(0, 240),\n      themeId: string(item?.themeId) || null,\n      implementationIds: stringIds(item?.implementationIds),\n      overridesConflictId: string(item?.overridesConflictId) || null,\n    };\n  });\n  state.requirements = state.requirements.map((item) => {\n    const normalized = normalizeMarkdownItem(item);\n    return {\n      ...normalized,\n      fromImplementationId: string(item?.fromImplementationId),\n      toImplementationId: string(item?.toImplementationId),\n    };\n  });\n  state.savedViews = state.savedViews.map((item) => ({\n    ...item,\n    id: string(item?.id),\n    name: string(item?.name, 'Untitled view').slice(0, 160),\n    themeId: string(item?.themeId),\n    lockedImplementationIds: stringIds(item?.lockedImplementationIds),\n  }));\n  state.uiByTheme = Object.fromEntries(Object.entries(state.uiByTheme).map(([themeId, view]) => [themeId, normalizeView(view)]));\n  state.activeThemeId = string(state.activeThemeId);\n  return state;\n}\n\nfunction duplicateIds(list) {\n  const seen = new Set();\n  const duplicates = new Set();\n  for (const item of list) {\n    if (!item.id) continue;\n    if (seen.has(item.id)) duplicates.add(item.id);\n    seen.add(item.id);\n  }\n  return [...duplicates];\n}\n\nexport function validateProjectDocument(input, { maxBytes = MAX_PROJECT_DOCUMENT_BYTES } = {}) {\n  const state = migrateProjectDocument(input);\n  const issues = [];\n  const bytes = new TextEncoder().encode(JSON.stringify(state)).byteLength;\n  if (bytes > maxBytes) issues.push(`Project document exceeds the ${Math.floor(maxBytes / 1024 / 1024)} MB limit.`);\n  if (!state.meta.id) issues.push('Project metadata is missing an id.');\n  if (!state.themes.length) issues.push('At least one theme is required.');\n\n  for (const key of ['themes', 'ideaGroups', 'implementationGroups', 'ideas', 'implementations', 'groupLinks', 'conflicts', 'requirements', 'savedViews']) {\n    for (const duplicate of duplicateIds(state[key])) issues.push(`${key} contains duplicate id ${duplicate}.`);\n    if (state[key].some((item) => !item.id)) issues.push(`${key} contains an item without an id.`);\n  }\n\n  const ids = (key) => new Set(state[key].map((item) => item.id));\n  const themeIds = ids('themes');\n  const ideaIds = ids('ideas');\n  const implementationIds = ids('implementations');\n  const ideaGroupIds = ids('ideaGroups');\n  const implementationGroupIds = ids('implementationGroups');\n  const conflictIds = ids('conflicts');\n  if (!themeIds.has(state.activeThemeId)) issues.push('The active theme does not exist.');\n\n  for (const theme of state.themes) {\n    if (theme.parentId && !themeIds.has(theme.parentId)) issues.push(`Theme ${theme.id} has a missing parent.`);\n    const seen = new Set([theme.id]);\n    let parentId = theme.parentId;\n    while (parentId) {\n      if (seen.has(parentId)) {\n        issues.push(`Theme ${theme.id} is part of a parent cycle.`);\n        break;\n      }\n      seen.add(parentId);\n      parentId = state.themes.find((item) => item.id === parentId)?.parentId || null;\n    }\n  }\n  for (const idea of state.ideas) for (const groupId of idea.groupIds) if (!ideaGroupIds.has(groupId)) issues.push(`Idea ${idea.id} references missing group ${groupId}.`);\n  for (const item of state.implementations) {\n    for (const ideaId of item.ideaIds) if (!ideaIds.has(ideaId)) issues.push(`Implementation ${item.id} references missing idea ${ideaId}.`);\n    for (const themeId of item.themeIds) if (!themeIds.has(themeId)) issues.push(`Implementation ${item.id} references missing theme ${themeId}.`);\n    for (const groupId of item.groupIds) if (!implementationGroupIds.has(groupId)) issues.push(`Implementation ${item.id} references missing group ${groupId}.`);\n  }\n  for (const conflict of state.conflicts) {\n    if (conflict.themeId && !themeIds.has(conflict.themeId)) issues.push(`Conflict ${conflict.id} references a missing theme.`);\n    if (conflict.implementationIds.length < 2) issues.push(`Conflict ${conflict.id} must contain at least two implementations.`);\n    for (const implementationId of conflict.implementationIds) if (!implementationIds.has(implementationId)) issues.push(`Conflict ${conflict.id} references missing implementation ${implementationId}.`);\n    if (conflict.overridesConflictId && !conflictIds.has(conflict.overridesConflictId)) issues.push(`Conflict ${conflict.id} overrides a missing conflict.`);\n  }\n  for (const requirement of state.requirements) {\n    if (!implementationIds.has(requirement.fromImplementationId) || !implementationIds.has(requirement.toImplementationId)) issues.push(`Requirement ${requirement.id} references a missing implementation.`);\n    if (requirement.fromImplementationId === requirement.toImplementationId) issues.push(`Requirement ${requirement.id} cannot require itself.`);\n  }\n  for (const saved of state.savedViews) {\n    if (!themeIds.has(saved.themeId)) issues.push(`Saved view ${saved.id} references a missing theme.`);\n    for (const implementationId of saved.lockedImplementationIds) if (!implementationIds.has(implementationId)) issues.push(`Saved view ${saved.id} references a missing implementation.`);\n  }\n  if (issues.length) throw new ProjectValidationError(issues);\n  return state;\n}\n\nconst transientViewKeys = ['search', 'expandedIdeaIds', 'expandedImplementationIds', 'selectedImplementationIds'];\n\nexport function projectDocumentForPersistence(input) {\n  const state = validateProjectDocument(input);\n  for (const view of Object.values(state.uiByTheme || {})) {\n    for (const key of transientViewKeys) delete view[key];\n  }\n  return state;\n}\n\nexport function projectContentFingerprint(state) {\n  const comparable = clone(state);\n  for (const view of Object.values(comparable.uiByTheme || {})) {\n    for (const key of transientViewKeys) delete view[key];\n  }\n  return JSON.stringify(comparable, (key, value) => key === 'updatedAt' ? undefined : value);\n}\n", "import { strToU8, zipSync, unzipSync, strFromU8 } from 'fflate';\nimport { validateProjectDocument, projectDocumentForPersistence } from '../src/shared/project-document.mjs';\n\nconst FORMAT_V1 = 'ideation-workbench/project-directory';\nconst FORMAT_V2 = 'ideation-workbench/archive';\nconst importedFiles = new WeakMap();\n\nfunction filename(name) {\n  return String(name || 'ideation-project').replace(/[^a-zA-Z0-9 _-]/g, '_').trim() || 'ideation-project';\n}\n\nfunction attachmentName(attachment) {\n  const id = String(attachment.id || attachment.storageName || crypto.randomUUID()).replace(/[^a-zA-Z0-9_-]/g, '_');\n  const name = String(attachment.name || 'attachment.bin').replace(/[^a-zA-Z0-9._ -]/g, '_');\n  return `attachments/${id}-${name}`;\n}\n\nasync function sha256(bytes) {\n  const digest = await crypto.subtle.digest('SHA-256', bytes);\n  return [...new Uint8Array(digest)].map((value) => value.toString(16).padStart(2, '0')).join('');\n}\n\nfunction attachmentRefs(state) {\n  const refs = new Map();\n  for (const implementation of state.implementations || []) {\n    for (const attachment of implementation.attachments || []) {\n      const key = attachment.id || attachment.storageName || attachment.url;\n      if (key && !refs.has(key)) refs.set(key, attachment);\n    }\n  }\n  return [...refs.values()];\n}\n\nexport function projectDocument(state) {\n  return { format: FORMAT_V1, version: 1, exportedAt: new Date().toISOString(), state: projectDocumentForPersistence(state) };\n}\n\nexport function parseProjectDocument(text) {\n  const document = JSON.parse(text);\n  if (document?.format === FORMAT_V1 && document.version === 1 && document.state?.meta) return validateProjectDocument(document.state);\n  if (document?.format === FORMAT_V2 && document.version === 2 && document.project?.meta) return validateProjectDocument(document.project);\n  throw new Error('This is not a supported Ideation project export.');\n}\n\nasync function createArchive(state) {\n  const project = projectDocumentForPersistence(state);\n  const files = {};\n  const manifestAttachments = [];\n  for (const attachment of attachmentRefs(project)) {\n    if (!attachment.url) throw new Error(`Attachment \"${attachment.name || 'Untitled'}\" cannot be read for export.`);\n    const response = await fetch(attachment.url);\n    if (!response.ok) throw new Error(`Attachment \"${attachment.name || 'Untitled'}\" could not be exported.`);\n    const bytes = new Uint8Array(await response.arrayBuffer());\n    const path = attachmentName(attachment);\n    files[path] = bytes;\n    manifestAttachments.push({\n      id: attachment.id || attachment.storageName,\n      name: attachment.name || 'attachment.bin',\n      mime: attachment.mime || response.headers.get('content-type') || 'application/octet-stream',\n      size: bytes.byteLength,\n      sha256: await sha256(bytes),\n      path,\n    });\n  }\n  const manifest = {\n    format: FORMAT_V2,\n    version: 2,\n    exportedAt: new Date().toISOString(),\n    projectFile: 'project.json',\n    attachments: manifestAttachments,\n  };\n  files['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2));\n  files['project.json'] = strToU8(JSON.stringify(project, null, 2));\n  return files;\n}\n\nexport async function downloadProjectZip(state) {\n  const archive = zipSync(await createArchive(state), { level: 6 });\n  const blob = new Blob([archive], { type: 'application/zip' });\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = `${filename(state.meta?.name)}.zip`;\n  link.click();\n  URL.revokeObjectURL(url);\n}\n\nexport async function exportProjectDirectory(state) {\n  if (!window.showDirectoryPicker) throw new Error('Directory export is supported in Chromium-based browsers. Use ZIP export in this browser.');\n  const root = await window.showDirectoryPicker({ mode: 'readwrite' });\n  const files = await createArchive(state);\n  for (const [path, bytes] of Object.entries(files)) {\n    const parts = path.split('/');\n    let directory = root;\n    while (parts.length > 1) directory = await directory.getDirectoryHandle(parts.shift(), { create: true });\n    const handle = await directory.getFileHandle(parts[0], { create: true });\n    const writable = await handle.createWritable();\n    await writable.write(bytes);\n    await writable.close();\n  }\n}\n\nasync function parseArchive(files) {\n  const manifestBytes = files['manifest.json'];\n  if (!manifestBytes) {\n    const legacy = files['ideation-project.json'];\n    if (!legacy) throw new Error('The ZIP does not contain a supported project archive.');\n    return parseProjectDocument(strFromU8(legacy));\n  }\n  const manifest = JSON.parse(strFromU8(manifestBytes));\n  if (manifest.format !== FORMAT_V2 || manifest.version !== 2) throw new Error('This archive version is not supported.');\n  const projectBytes = files[manifest.projectFile || 'project.json'];\n  if (!projectBytes) throw new Error('The archive is missing project.json.');\n  const state = validateProjectDocument(JSON.parse(strFromU8(projectBytes)));\n  const attachments = [];\n  for (const entry of manifest.attachments || []) {\n    const bytes = files[entry.path];\n    if (!bytes) throw new Error(`The archive is missing ${entry.path}.`);\n    if (bytes.byteLength !== entry.size || await sha256(bytes) !== entry.sha256) throw new Error(`Attachment checksum failed for ${entry.name}.`);\n    attachments.push({ ...entry, blob: new Blob([bytes], { type: entry.mime || 'application/octet-stream' }) });\n  }\n  importedFiles.set(state, attachments);\n  return state;\n}\n\nexport function importedAttachments(state) {\n  return importedFiles.get(state) || [];\n}\n\nexport async function importProjectFile(file) {\n  if (file.name.toLowerCase().endsWith('.zip')) return parseArchive(unzipSync(new Uint8Array(await file.arrayBuffer())));\n  return parseProjectDocument(await file.text());\n}\n\nexport async function importProjectDirectory() {\n  if (!window.showDirectoryPicker) throw new Error('Directory import is supported in Chromium-based browsers. Import a ZIP in this browser.');\n  const root = await window.showDirectoryPicker({ mode: 'read' });\n  try {\n    const manifestHandle = await root.getFileHandle('manifest.json');\n    const manifest = JSON.parse(await (await manifestHandle.getFile()).text());\n    const projectHandle = await root.getFileHandle(manifest.projectFile || 'project.json');\n    const state = validateProjectDocument(JSON.parse(await (await projectHandle.getFile()).text()));\n    const attachmentsDirectory = await root.getDirectoryHandle('attachments');\n    const attachments = [];\n    for (const entry of manifest.attachments || []) {\n      const handle = await attachmentsDirectory.getFileHandle(entry.path.split('/').pop());\n      const file = await handle.getFile();\n      const bytes = new Uint8Array(await file.arrayBuffer());\n      if (bytes.byteLength !== entry.size || await sha256(bytes) !== entry.sha256) throw new Error(`Attachment checksum failed for ${entry.name}.`);\n      attachments.push({ ...entry, blob: file });\n    }\n    importedFiles.set(state, attachments);\n    return state;\n  } catch (error) {\n    if (error?.name !== 'NotFoundError') throw error;\n    const handle = await root.getFileHandle('ideation-project.json');\n    return parseProjectDocument(await (await handle.getFile()).text());\n  }\n}\n", "export function ideaOrder(items, orderedIds) {\n  const rank = new Map(orderedIds.map((id, index) => [id, index]));\n  for (const item of items) if (rank.has(item.id)) item.sortOrder = rank.get(item.id);\n}\n\nexport function implementationOrderForIdea(item, ideaId) {\n  return item.ideaSortOrders?.[ideaId] ?? item.sortOrder ?? 0;\n}\n\nexport function implementationOrder(items, ideaId, orderedIds) {\n  const rank = new Map(orderedIds.map((id, index) => [id, index]));\n  for (const item of items) {\n    if (!rank.has(item.id)) continue;\n    item.ideaSortOrders ||= {};\n    item.ideaSortOrders[ideaId] = rank.get(item.id);\n  }\n}\n", "export function fuzzyMatches(value, query) {\n  const text = String(value || '').toLowerCase();\n  const needle = String(query || '').trim().toLowerCase();\n  if (!needle) return true;\n  let index = 0;\n  for (const character of needle) { index = text.indexOf(character, index); if (index < 0) return false; index += 1; }\n  return true;\n}\n\nexport function allPairs(ids) {\n  const pairs = [];\n  for (let left = 0; left < ids.length; left += 1) for (let right = left + 1; right < ids.length; right += 1) pairs.push([ids[left], ids[right]]);\n  return pairs;\n}\n\nexport function requirementEdges(chains) {\n  const edges = new Map();\n  for (const chain of chains) for (const from of chain.from || []) for (const to of chain.to || []) if (from !== to) edges.set(`${from}:${to}`, { fromImplementationId: from, toImplementationId: to });\n  return [...edges.values()];\n}\n\nexport function validRequirementChains(chains) {\n  return chains.filter((chain) => chain.from?.length && chain.to?.length);\n}\n", "export class SaveCoordinator {\n  constructor({ save, journal, onStatus = () => {}, onSaved = () => {}, onConflict = () => {} }) {\n    this.save = save;\n    this.journal = journal;\n    this.onStatus = onStatus;\n    this.onSaved = onSaved;\n    this.onConflict = onConflict;\n    this.pending = null;\n    this.running = false;\n    this.retryTimer = null;\n  }\n\n  async enqueue(snapshot, metadata = {}) {\n    const next = { snapshot: structuredClone(snapshot), metadata };\n    if (this.pending) next.metadata.analyticsEvents = [...(this.pending.metadata?.analyticsEvents || []), ...(metadata.analyticsEvents || [])];\n    this.pending = next;\n    await this.journal?.write(this.pending.snapshot);\n    this.onStatus('queued');\n    return this.drain();\n  }\n\n  async drain() {\n    if (this.running) return;\n    this.running = true;\n    try {\n      while (this.pending) {\n        const pending = this.pending;\n        const { snapshot, metadata } = pending;\n        this.pending = null;\n        this.onStatus('saving');\n        try {\n          const result = await this.save(snapshot);\n          this.onSaved(result, snapshot, metadata);\n          if (!this.pending) {\n            await this.journal?.clear();\n            this.onStatus('saved');\n          }\n        } catch (error) {\n          if (!this.pending) this.pending = pending;\n          else this.pending.metadata.analyticsEvents = [...(metadata.analyticsEvents || []), ...(this.pending.metadata?.analyticsEvents || [])];\n          if (error?.status === 409) {\n            this.onStatus('conflict');\n            this.onConflict(error, snapshot);\n            return;\n          }\n          this.onStatus('offline');\n          this.scheduleRetry();\n          return;\n        }\n      }\n    } finally {\n      this.running = false;\n    }\n  }\n\n  scheduleRetry(delay = 3000) {\n    clearTimeout(this.retryTimer);\n    this.retryTimer = setTimeout(() => this.drain(), delay);\n  }\n\n  async flush() {\n    clearTimeout(this.retryTimer);\n    await this.drain();\n  }\n}\n\n", "const DATABASE = 'ideation-workbench';\nconst STORE = 'drafts';\n\nfunction openDatabase() {\n  if (!globalThis.indexedDB) return Promise.resolve(null);\n  return new Promise((resolve, reject) => {\n    const request = indexedDB.open(DATABASE, 1);\n    request.onupgradeneeded = () => {\n      if (!request.result.objectStoreNames.contains(STORE)) request.result.createObjectStore(STORE);\n    };\n    request.onsuccess = () => resolve(request.result);\n    request.onerror = () => reject(request.error);\n  });\n}\n\nexport function createDraftJournal(key) {\n  const fallbackKey = `ideation-workbench:draft:${key}`;\n  const transact = async (mode, operation) => {\n    const database = await openDatabase().catch(() => null);\n    if (!database) return operation(null);\n    return new Promise((resolve, reject) => {\n      const transaction = database.transaction(STORE, mode);\n      const store = transaction.objectStore(STORE);\n      const request = operation(store);\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n      transaction.oncomplete = () => database.close();\n    });\n  };\n  return {\n    async read() {\n      try {\n        const value = await transact('readonly', (store) => store ? store.get(key) : JSON.parse(localStorage.getItem(fallbackKey) || 'null'));\n        return value || null;\n      } catch {\n        return JSON.parse(localStorage.getItem(fallbackKey) || 'null');\n      }\n    },\n    async write(value) {\n      try {\n        await transact('readwrite', (store) => store ? store.put(value, key) : localStorage.setItem(fallbackKey, JSON.stringify(value)));\n      } catch {\n        localStorage.setItem(fallbackKey, JSON.stringify(value));\n      }\n    },\n    async clear() {\n      try {\n        await transact('readwrite', (store) => store ? store.delete(key) : localStorage.removeItem(fallbackKey));\n      } catch {\n        localStorage.removeItem(fallbackKey);\n      }\n    },\n  };\n}\n\n", "const DATABASE = 'ideation-workbench';\nconst STORE = 'attachments';\nconst urls = new Map();\n\nfunction openDatabase() {\n  return new Promise((resolve, reject) => {\n    const request = indexedDB.open(DATABASE, 2);\n    request.onupgradeneeded = () => {\n      if (!request.result.objectStoreNames.contains('drafts')) request.result.createObjectStore('drafts');\n      if (!request.result.objectStoreNames.contains(STORE)) request.result.createObjectStore(STORE);\n    };\n    request.onsuccess = () => resolve(request.result);\n    request.onerror = () => reject(request.error);\n  });\n}\n\nasync function operation(mode, callback) {\n  const database = await openDatabase();\n  return new Promise((resolve, reject) => {\n    const transaction = database.transaction(STORE, mode);\n    const request = callback(transaction.objectStore(STORE));\n    request.onsuccess = () => resolve(request.result);\n    request.onerror = () => reject(request.error);\n    transaction.oncomplete = () => database.close();\n  });\n}\n\nexport async function storeGuestAttachment(projectId, blob, metadata = {}) {\n  const id = metadata.id || crypto.randomUUID();\n  const record = {\n    id,\n    projectId,\n    blob,\n    name: metadata.name || blob.name || 'attachment.bin',\n    mime: metadata.mime || blob.type || 'application/octet-stream',\n    size: blob.size,\n    createdAt: new Date().toISOString(),\n  };\n  await operation('readwrite', (store) => store.put(record, id));\n  const url = URL.createObjectURL(blob);\n  urls.set(id, url);\n  return { id, storageName: id, name: record.name, mime: record.mime, size: record.size, url, guest: true };\n}\n\nexport async function hydrateGuestAttachments(state) {\n  for (const implementation of state.implementations || []) {\n    for (const attachment of implementation.attachments || []) {\n      if (!attachment.guest && !String(attachment.storageName || '').startsWith('guest-')) continue;\n      const id = attachment.id || attachment.storageName;\n      let url = urls.get(id);\n      if (!url) {\n        const record = await operation('readonly', (store) => store.get(id));\n        if (record?.blob) {\n          url = URL.createObjectURL(record.blob);\n          urls.set(id, url);\n        }\n      }\n      if (url) attachment.url = url;\n    }\n  }\n}\n\nexport async function deleteGuestAttachment(id) {\n  await operation('readwrite', (store) => store.delete(id));\n  if (urls.has(id)) URL.revokeObjectURL(urls.get(id));\n  urls.delete(id);\n}\n\n", "function escapeHtml(value = '') {\n  return String(value)\n    .replaceAll('&', '&amp;')\n    .replaceAll('<', '&lt;')\n    .replaceAll('>', '&gt;')\n    .replaceAll('\"', '&quot;')\n    .replaceAll(\"'\", '&#039;');\n}\n\nexport function markdownToSafeHtml(markdown = '') {\n  let html = escapeHtml(markdown);\n  html = html.replace(/^#### (.+)$/gm, '<h4>$1</h4>');\n  html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');\n  html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');\n  html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');\n  html = html.replace(/^&gt; (.+)$/gm, '<blockquote>$1</blockquote>');\n  html = html.replace(/\\*\\*([^*\\n]+)\\*\\*/g, '<strong>$1</strong>');\n  html = html.replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n  html = html.replace(/~~([^~\\n]+)~~/g, '<s>$1</s>');\n  html = html.replace(/`([^`\\n]+)`/g, '<code>$1</code>');\n  html = html.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+|mailto:[^)\\s]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>');\n  html = html.replace(/(?:^|\\n)((?:- .+(?:\\n|$))+)/g, (_, block) => `<ul>${block.trim().split('\\n').map((line) => `<li>${line.slice(2)}</li>`).join('')}</ul>`);\n  html = html.replace(/(?:^|\\n)((?:\\d+\\. .+(?:\\n|$))+)/g, (_, block) => `<ol>${block.trim().split('\\n').map((line) => `<li>${line.replace(/^\\d+\\.\\s+/, '')}</li>`).join('')}</ol>`);\n  return html.split(/\\n{2,}/).map((block) => /^<(?:h\\d|ul|ol|blockquote)/.test(block) ? block : `<p>${block.replace(/\\n/g, '<br>')}</p>`).join('');\n}\n\nexport function detailsText(item) {\n  return String(item?.detailsMarkdown || '');\n}\n\n", "function escapeHtml(value = '') {\n  return String(value).replace(/[&<>\"']/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#039;' }[character]));\n}\n\nexport function boardControlsHtml({ view, groups = [], shared = false, include = {} }) {\n  const action = (name) => shared ? `data-view-action=\"${name}\"` : `data-action=\"${name}\"`;\n  const prefix = shared ? 'shared-' : '';\n  const searchId = shared ? 'shared-search' : 'search-input';\n  const selected = new Set(view.ideaGroupFilterIds || []);\n  const label = !selected.size ? 'All groups' : selected.size === 1 && selected.has('__ungrouped__') ? 'Ungrouped' : `${selected.size} group${selected.size === 1 ? '' : 's'}`;\n  const groupRow = (id, name) => `<div class=\"group-filter-row\"><button ${action('group-only')} data-id=\"${id}\">${escapeHtml(name)}</button><button class=\"group-filter-toggle ${selected.has(id) ? 'active' : ''}\" ${action('group-toggle')} data-id=\"${id}\" aria-label=\"Toggle ${escapeHtml(name)}\">${selected.has(id) ? '\u2713' : '+'}</button></div>`;\n  const options = `<option value=\"manual\" ${view.ideaSort === 'manual' ? 'selected' : ''}>Manual</option><option value=\"implementations\" ${view.ideaSort === 'implementations' ? 'selected' : ''}>Implementation count</option><option value=\"locked\" ${view.ideaSort === 'locked' ? 'selected' : ''}>Locked count</option><option value=\"conflicts\" ${view.ideaSort === 'conflicts' ? 'selected' : ''}>Conflict count</option>`;\n  const direction = view.ideaSortDirection === 'desc' ? '\u2193' : '\u2191';\n  return `<label class=\"search-box\"><span class=\"sr-only\">Search</span><input id=\"${searchId}\" type=\"search\" placeholder=\"Search ideas and implementations\u2026\" value=\"${escapeHtml(view.search || '')}\" /></label>${!shared ? '<button class=\"button ghost compact mobile-filter-button\" data-action=\"open-mobile-filters\">Filters</button>' : ''}<label class=\"compact-field sort-control\"><span>Sort ideas</span><select id=\"${prefix}idea-sort\" aria-label=\"Sort ideas\">${options}</select></label><button id=\"${prefix}idea-sort-direction\" class=\"button ghost compact\" ${action('toggle-sort-direction')} title=\"Sort ${view.ideaSortDirection === 'desc' ? 'descending' : 'ascending'}\" aria-label=\"Toggle sort direction\">${direction}</button><label class=\"compact-field\"><span>Idea groups</span><details id=\"${prefix}group-filter\" class=\"group-filter\"><summary id=\"${prefix}group-filter-label\">${label}</summary><div id=\"${prefix}group-filter-options\">${groupRow('all', 'All groups')}${groupRow('__ungrouped__', 'Ungrouped')}${groups.map((group) => groupRow(group.id, group.name || 'Untitled group')).join('')}</div></details></label><button class=\"button ghost compact\" ${action('show-all')}>Show all</button><button class=\"button ghost compact\" ${action('hide-all')}>Hide all</button><button class=\"button ghost compact\" ${action(shared ? 'restore' : 'restore-visible')}>Restore previous</button>${include.fontSettings ? `<button class=\"button ghost compact\" ${action('open-display-settings')} title=\"Font size settings\" aria-label=\"Font size settings\">\u2699</button>` : ''}<label class=\"toggle-label\" title=\"Shows implementations that cannot currently be locked because they would complete a conflict.\"><input id=\"${prefix}show-excluded\" type=\"checkbox\" ${view.showExcluded ? 'checked' : ''} /> Show excluded</label>${include.lockSummary ? '<div class=\"lock-summary\"><strong id=\"lock-count\">0 locked</strong><button class=\"link-button\" data-action=\"clear-locks\">Clear</button></div>' : ''}`;\n}\n", "import {\n  blendBackground,\n  blockingConflicts,\n  effectiveConflicts,\n  lockWithRequirements,\n  effectiveImplementations,\n  normalizeLockedWithRequirements,\n  readableTextColor,\n  themeChain,\n} from './core.mjs';\nimport { modeGlyph, modeLabel, nextMode, normalizeMode, resolveThemeMode } from './theme-mode.mjs';\nimport { generateExportMarkdown, parseImportMarkdown, htmlToMarkdown } from './export.mjs';\nimport { downloadProjectZip, exportProjectDirectory, importProjectDirectory, importProjectFile, importedAttachments } from './portable.mjs';\nimport { ideaOrder, implementationOrder, implementationOrderForIdea } from './reorder.mjs';\nimport { allPairs, fuzzyMatches, requirementEdges, validRequirementChains } from './relationships.mjs';\nimport { validateProjectDocument, projectContentFingerprint, projectDocumentForPersistence } from '../src/shared/project-document.mjs';\nimport { SaveCoordinator } from './save-coordinator.mjs';\nimport { createDraftJournal } from './draft-journal.mjs';\nimport { storeGuestAttachment, hydrateGuestAttachments, deleteGuestAttachment } from './guest-attachments.mjs';\nimport { markdownToSafeHtml, detailsText } from './markdown.mjs';\nimport { boardControlsHtml } from './board-controls.mjs';\n\nconst $ = (selector, root = document) => root.querySelector(selector);\nconst $$ = (selector, root = document) => [...root.querySelectorAll(selector)];\nconst gate = $('#project-gate');\nconst app = $('#app');\nconst modal = $('#modal');\nconst modalTitle = $('#modal-title');\nconst modalBody = $('#modal-body');\nconst toast = $('#toast');\n\nlet state = null;\nlet projectPath = '';\nlet currentInspectorId = null;\nlet currentInspectorIdeaId = null;\nlet focusedConflictId = null;\nlet saveTimer = null;\nlet modalSubmitHandler = null;\nlet lastSavedSnapshot = '';\nlet includedProjects = [];\nlet storageMode = null;\nlet clerk = null;\nlet clerkStatus = 'idle';\nlet clerkInitialization = null;\nlet guestState = null;\nlet cloudWorkspaceReady = false;\nlet authenticationError = '';\nlet pendingCloudConflict = null;\nlet activeDrag = null;\nlet relationshipDraft = null;\nlet requirementBuilder = null;\nlet modalCloseReturn = null;\nlet modalDirty = false;\nlet currentProjectId = 'guest';\nlet currentRevision = 0;\nlet saveCoordinator = null;\nlet pendingSaveConflict = null;\nlet pendingRecoveredDraft = null;\nlet undoStack = [];\nlet redoStack = [];\nlet historyBaseline = '';\nlet historyCoalesceTimer = null;\nlet selfHosted = false;\nlet runtimeConfig = null;\nlet analyticsClient = null;\nlet analyticsLoading = null;\nlet pendingAnalyticsEvents = [];\nlet boardDensity = localStorage.getItem('ideation-workbench:board-density') === 'compact' ? 'compact' : 'detailed';\nconst GUEST_STORAGE_KEY = 'ideation-workbench:guest-state:v1';\nconst GUEST_BACKUP_KEY = 'ideation-workbench:guest-backup-before-cloud:v1';\nconst ANALYTICS_CONSENT_KEY = 'ideation-workbench:analytics-consent:v1';\n\nfunction guestDefaultState(name = 'My Ideation Project') {\n  const themeId = id();\n  const stamp = new Date().toISOString();\n  return { version: 2, meta: { id: id(), name, createdAt: stamp, updatedAt: stamp }, displaySettings: { ideaTitleSize: 18, ideaDetailsSize: 14, implementationTitleSize: 14, implementationDetailsSize: 13 }, themes: [{ id: themeId, name: 'Core', parentId: null, hiddenInheritedImplementationIds: [], hiddenInheritedConflictIds: [] }], ideaGroups: [], implementationGroups: [], ideas: [], implementations: [], groupLinks: [], conflicts: [], requirements: [], savedViews: [], uiByTheme: { [themeId]: defaultView() }, activeThemeId: themeId };\n}\n\nfunction readGuestState() {\n  try { return JSON.parse(localStorage.getItem(GUEST_STORAGE_KEY) || 'null') || guestDefaultState(); }\n  catch { return guestDefaultState(); }\n}\n\nfunction saveGuestState(next) {\n  guestState = projectDocumentForPersistence(next);\n  localStorage.setItem(GUEST_STORAGE_KEY, JSON.stringify(guestState));\n  return guestState;\n}\n\nfunction guestHasWork(candidate) {\n  if (!candidate) return false;\n  return Boolean(candidate.ideas?.length || candidate.implementations?.length || candidate.ideaGroups?.length || candidate.implementationGroups?.length || candidate.conflicts?.length || candidate.savedViews?.length || candidate.themes?.length > 1);\n}\n\nfunction renderStorageNotice() {\n  const notice = $('#storage-note');\n  if (!notice) return;\n  if (storageMode === 'cloud') {\n    notice.textContent = 'Saved to your private account.';\n    return;\n  }\n  if (pendingCloudConflict) {\n    notice.innerHTML = 'This browser project has not been uploaded. <button class=\"link-button\" data-action=\"resolve-cloud-conflict\">Choose where to save it</button>';\n    return;\n  }\n  if (clerk?.user) {\n    notice.innerHTML = 'Signed in, but this browser project is not connected to cloud storage yet. <button class=\"link-button\" data-action=\"retry-cloud-connection\">Connect it now</button>';\n    return;\n  }\n  notice.innerHTML = 'Saved only in this browser. <button class=\"link-button\" data-action=\"sign-in\">Get an account to keep it across devices</button>';\n}\n\nasync function api(path, options = {}) {\n  if (storageMode === 'guest') {\n    if (path === '/api/status') return { authenticated: false, provisioned: false, open: true, path: 'This browser (not uploaded)', projectId: guestState?.meta?.id || 'guest', revision: currentRevision, state: structuredClone(guestState) };\n    if (path === '/api/state' && (!options.method || options.method === 'GET')) return structuredClone(guestState);\n    if (path === '/api/state' && options.method === 'PUT') {\n      const body = JSON.parse(options.body);\n      const next = body?.state || body;\n      return { state: saveGuestState(validateProjectDocument(next)), revision: currentRevision += 1 };\n    }\n    if (path.startsWith('/api/attachments') && options.method === 'POST') {\n      const filename = new URL(path, location.origin).searchParams.get('filename') || options.body?.name || 'attachment.bin';\n      return storeGuestAttachment(currentProjectId, options.body, { name: filename });\n    }\n    if (path.startsWith('/api/attachments/') && options.method === 'DELETE') {\n      await deleteGuestAttachment(decodeURIComponent(path.slice('/api/attachments/'.length)));\n      return { ok: true };\n    }\n    return { projects: [] };\n  }\n  const headers = new Headers(options.headers || {});\n  if (clerk?.session) {\n    const token = await clerk.session.getToken();\n    if (token) headers.set('Authorization', `Bearer ${token}`);\n  }\n  const response = await fetch(path, { ...options, headers });\n  const isJson = response.headers.get('content-type')?.includes('application/json');\n  const payload = isJson ? await response.json() : await response.text();\n  if (!response.ok) {\n    const cause = new Error(payload?.error || payload || `Request failed: ${response.status}`);\n    cause.status = response.status;\n    cause.payload = payload;\n    throw cause;\n  }\n  return payload;\n}\n\nconst escapeHtml = (value = '') => String(value)\n  .replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')\n  .replaceAll('\"', '&quot;').replaceAll(\"'\", '&#039;');\n\nconst COLOR_MODE_KEY = 'iw-theme';\nconst colorScheme = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;\nlet colorMode = normalizeMode(localStorage.getItem(COLOR_MODE_KEY));\n\nfunction effectiveColorMode() {\n  return resolveThemeMode(colorMode, Boolean(colorScheme && colorScheme.matches));\n}\n\nfunction applyColorMode() {\n  if (colorMode === 'auto') document.documentElement.removeAttribute('data-theme');\n  else document.documentElement.setAttribute('data-theme', colorMode);\n  const resolved = effectiveColorMode();\n  document.querySelectorAll('[data-action=\"cycle-color-mode\"]').forEach((button) => {\n    const glyph = button.querySelector('.mode-glyph');\n    if (glyph) glyph.textContent = modeGlyph(colorMode);\n    const label = modeLabel(colorMode) === 'Auto' ? `Auto (${resolved === 'dark' ? 'Dark' : 'Light'})` : modeLabel(colorMode);\n    button.title = `Color theme: ${label}`;\n    button.setAttribute('aria-label', `Color theme: ${label}. Click to switch.`);\n  });\n}\n\nfunction cycleColorMode() {\n  colorMode = nextMode(colorMode);\n  try { if (colorMode === 'auto') localStorage.removeItem(COLOR_MODE_KEY); else localStorage.setItem(COLOR_MODE_KEY, colorMode); } catch (e) {}\n  applyColorMode();\n}\n\napplyColorMode();\nif (colorScheme) colorScheme.addEventListener('change', applyColorMode);\n\nfunction id() {\n  if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();\n  const bytes = new Uint8Array(16);\n  if (globalThis.crypto?.getRandomValues) globalThis.crypto.getRandomValues(bytes);\n  else for (let index = 0; index < bytes.length; index += 1) bytes[index] = Math.floor(Math.random() * 256);\n  bytes[6] = (bytes[6] & 0x0f) | 0x40;\n  bytes[8] = (bytes[8] & 0x3f) | 0x80;\n  const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\nfunction byId(list, itemId) { return list.find((item) => item.id === itemId); }\nfunction unique(values) { return [...new Set(values)]; }\nfunction numberSort(a, b) { return (a.sortOrder || 0) - (b.sortOrder || 0) || a.title.localeCompare(b.title); }\nfunction themeName(themeId) { return byId(state.themes, themeId)?.name || 'Unknown theme'; }\nfunction activeTheme() { return byId(state.themes, state.activeThemeId); }\nfunction conflictsForTheme() { return effectiveConflicts(state, state.activeThemeId); }\nfunction implementationsForTheme() { return effectiveImplementations(state, state.activeThemeId); }\nfunction requirements() { return state.requirements ||= []; }\n\nfunction showToast(message) {\n  toast.textContent = message;\n  toast.hidden = false;\n  clearTimeout(showToast.timer);\n  showToast.timer = setTimeout(() => { toast.hidden = true; }, 2600);\n}\n\nfunction setStatus(message) { $('#save-status').textContent = message; }\n\nfunction analyticsConsentGranted() { return localStorage.getItem(ANALYTICS_CONSENT_KEY) === 'enabled'; }\n\nfunction renderAnalyticsConsentPrompt() {\n  const prompt = $('#analytics-consent');\n  if (!prompt) return;\n  const configured = Boolean(runtimeConfig?.posthogProjectToken && runtimeConfig?.posthogHost);\n  prompt.hidden = selfHosted || !configured || localStorage.getItem(ANALYTICS_CONSENT_KEY) !== null;\n}\n\nfunction attemptEventFor(event) {\n  return ({\n    idea_created: 'idea_create_attempted', implementation_created: 'implementation_create_attempted', conflict_created: 'conflict_create_attempted', requirements_created: 'requirements_create_attempted', saved_view_created: 'saved_view_create_attempted', decision_lock_updated: 'decision_lock_update_attempted', project_created: 'project_create_attempted', project_shared: 'project_share_attempted', project_exported: 'project_export_attempted', project_imported: 'project_import_attempted', attachment_uploaded: 'attachment_upload_attempted',\n  })[event];\n}\n\nfunction captureEvent(event, properties = {}) { analyticsClient?.capture(event, properties); }\n\nfunction recordPersistedEvent(event, properties = {}, captureAttempt = true) {\n  const attempted = attemptEventFor(event);\n  if (captureAttempt && attempted) captureEvent(attempted, properties);\n  pendingAnalyticsEvents.push({ event, properties });\n}\n\nasync function identifySignedInUser() { analyticsClient?.identify(clerk?.user?.id); }\n\nasync function ensureAnalytics() {\n  if (!analyticsConsentGranted() || selfHosted || analyticsClient) return analyticsClient;\n  if (analyticsLoading) return analyticsLoading;\n  analyticsLoading = (async () => {\n    const config = runtimeConfig || await fetch('/api/config').then((response) => response.ok ? response.json() : null);\n    if (!config || config.selfHosted) return null;\n    const { initializePostHog } = await import('/posthog.mjs');\n    analyticsClient = initializePostHog(config);\n    await identifySignedInUser();\n    return analyticsClient;\n  })();\n  try { return await analyticsLoading; }\n  catch (error) { console.error('Analytics could not be initialized.', error); return null; }\n  finally { analyticsLoading = null; }\n}\n\nasync function setAnalyticsConsent(enabled) {\n  if (!enabled) {\n    localStorage.setItem(ANALYTICS_CONSENT_KEY, 'disabled');\n    analyticsClient?.reset();\n    analyticsClient = null;\n    renderAnalyticsConsentPrompt();\n    return;\n  }\n  if (selfHosted) return showToast('Analytics is unavailable on self-hosted deployments.');\n  localStorage.setItem(ANALYTICS_CONSENT_KEY, 'enabled');\n  await ensureAnalytics();\n  renderAnalyticsConsentPrompt();\n}\n\nfunction defaultView() {\n  return {\n    lockedImplementationIds: [], visibleImplementationIds: [], previousVisibleImplementationIds: [],\n    manuallyLockedImplementationIds: [], selectedImplementationIds: [],\n    expandedIdeaIds: [], expandedImplementationIds: [], showExcluded: true, search: '', ideaGroupFilterIds: [],\n    knownImplementationIds: [], ideaSort: 'manual', ideaSortDirection: 'asc',\n  };\n}\n\nfunction view() {\n  state.uiByTheme ||= {};\n  state.uiByTheme[state.activeThemeId] ||= defaultView();\n  const target = state.uiByTheme[state.activeThemeId];\n  for (const [key, value] of Object.entries(defaultView())) if (!(key in target)) target[key] = structuredClone(value);\n  syncViewWithTheme(target);\n  return target;\n}\n\nfunction syncViewWithTheme(target) {\n  const effectiveIds = implementationsForTheme().map((item) => item.id);\n  const effectiveSet = new Set(effectiveIds);\n  const known = new Set(target.knownImplementationIds || []);\n  const newlyEffective = effectiveIds.filter((itemId) => !known.has(itemId));\n  target.visibleImplementationIds = unique([\n    ...(target.visibleImplementationIds || []).filter((itemId) => effectiveSet.has(itemId)),\n    ...newlyEffective,\n  ]);\n  target.previousVisibleImplementationIds = (target.previousVisibleImplementationIds || []).filter((itemId) => effectiveSet.has(itemId));\n  if (!Array.isArray(target.manuallyLockedImplementationIds)) target.manuallyLockedImplementationIds = [...(target.lockedImplementationIds || [])];\n  target.manuallyLockedImplementationIds = target.manuallyLockedImplementationIds.filter((itemId) => effectiveSet.has(itemId));\n  target.lockedImplementationIds = normalizeLockedWithRequirements(conflictsForTheme(), requirements(), target.manuallyLockedImplementationIds, effectiveIds);\n  target.selectedImplementationIds = (target.selectedImplementationIds || []).filter((itemId) => effectiveSet.has(itemId));\n  if (!Array.isArray(target.ideaGroupFilterIds)) target.ideaGroupFilterIds = target.ideaGroupFilter && target.ideaGroupFilter !== 'all' ? [target.ideaGroupFilter] : [];\n  target.expandedImplementationIds = (target.expandedImplementationIds || []).filter((itemId) => effectiveSet.has(itemId));\n  target.knownImplementationIds = effectiveIds;\n}\n\nfunction markDirty(recordHistory = true) {\n  if (!state) return;\n  const current = JSON.stringify(state);\n  if (recordHistory && historyBaseline && current !== historyBaseline) {\n    if (!historyCoalesceTimer) undoStack.push(JSON.parse(historyBaseline));\n    undoStack = undoStack.slice(-100);\n    redoStack = [];\n    clearTimeout(historyCoalesceTimer);\n    historyCoalesceTimer = setTimeout(() => { historyCoalesceTimer = null; historyBaseline = JSON.stringify(state); }, 700);\n  }\n  historyBaseline = current;\n  setStatus('Saving\u2026');\n  clearTimeout(saveTimer);\n  saveTimer = setTimeout(saveState, 450);\n}\n\nasync function saveState() {\n  if (!state) return;\n  const snapshot = projectDocumentForPersistence(state);\n  if (projectContentFingerprint(snapshot) === lastSavedSnapshot) { setStatus('Saved'); return; }\n  const analyticsEvents = pendingAnalyticsEvents;\n  pendingAnalyticsEvents = [];\n  await saveCoordinator?.enqueue(snapshot, { analyticsEvents });\n}\n\nfunction downloadStateCopy(snapshot, suffix = 'local-copy') {\n  const blob = new Blob([JSON.stringify(snapshot, null, 2)], { type: 'application/json' });\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = `${state.meta.name.replace(/[^a-zA-Z0-9 _-]/g, '_')}-${suffix}.json`;\n  link.click();\n  URL.revokeObjectURL(url);\n}\n\nfunction configureSaveCoordinator() {\n  const journal = createDraftJournal(`${storageMode}:${currentProjectId}`);\n  const savePath = storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/state` : '/api/state';\n  saveCoordinator = new SaveCoordinator({\n    journal,\n    save: async (snapshot) => api(savePath, {\n      method: 'PUT',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ state: snapshot, baseRevision: currentRevision }),\n    }),\n    onStatus(status) {\n      if (status === 'saving' || status === 'queued') setStatus('Saving\u00E2\u20AC\u00A6');\n      if (status === 'offline') setStatus('Offline \u00E2\u20AC\u201D changes queued');\n      if (status === 'conflict') setStatus('Save conflict');\n    },\n    onSaved(result, snapshot, metadata) {\n      currentRevision = Number(result.revision || currentRevision + 1);\n      lastSavedSnapshot = projectContentFingerprint(result.state || snapshot);\n      if (projectContentFingerprint(state) === projectContentFingerprint(snapshot) && result.state?.meta?.updatedAt) state.meta.updatedAt = result.state.meta.updatedAt;\n      setStatus(`Saved ${new Date(result.state?.meta?.updatedAt || Date.now()).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`);\n      for (const event of metadata?.analyticsEvents || []) captureEvent(event.event, event.properties);\n    },\n    onConflict(error, snapshot) {\n      pendingSaveConflict = { error, snapshot, server: error.payload?.state || null };\n      modalManager('Changes need review', `<p>This project changed somewhere else while you were editing. Your local draft is safe.</p><div class=\"manager-list\"><button class=\"button secondary\" data-action=\"download-conflict-copy\">Download my local copy</button>${pendingSaveConflict.server ? '<button class=\"button secondary\" data-action=\"use-server-copy\">Reload the saved copy</button>' : ''}<button class=\"button danger\" data-action=\"force-save-local\">Replace the saved copy with mine</button><button class=\"button ghost\" data-action=\"close-modal\">Decide later</button></div>`);\n    },\n  });\n  journal.read().then((draft) => {\n    if (!draft || projectContentFingerprint(draft) === projectContentFingerprint(state)) return;\n    pendingRecoveredDraft = draft;\n    modalManager('Unsaved draft recovered', '<p>This browser contains changes that were not confirmed by storage.</p><div class=\"manager-list\"><button class=\"button primary\" data-action=\"restore-draft\">Restore the draft</button><button class=\"button secondary\" data-action=\"download-recovered-draft\">Download it first</button><button class=\"button ghost\" data-action=\"discard-recovered-draft\">Discard it</button></div>');\n  });\n}\n\nfunction themeOptions(selectedId, excludeIds = []) {\n  const excluded = new Set(excludeIds);\n  const children = new Map();\n  for (const theme of state.themes) {\n    const parent = theme.parentId || '__root__';\n    if (!children.has(parent)) children.set(parent, []);\n    children.get(parent).push(theme);\n  }\n  for (const list of children.values()) list.sort((a, b) => a.name.localeCompare(b.name));\n  const result = [];\n  const walk = (parentId, depth) => {\n    for (const theme of children.get(parentId) || []) {\n      if (!excluded.has(theme.id)) result.push(`<option value=\"${theme.id}\" ${theme.id === selectedId ? 'selected' : ''}>${'\u2014 '.repeat(depth)}${escapeHtml(theme.name)}</option>`);\n      walk(theme.id, depth + 1);\n    }\n  };\n  walk('__root__', 0);\n  return result.join('');\n}\n\nfunction themePath(themeId) {\n  const names = [];\n  let theme = byId(state.themes, themeId);\n  const seen = new Set();\n  while (theme && !seen.has(theme.id)) { names.unshift(theme.name); seen.add(theme.id); theme = byId(state.themes, theme.parentId); }\n  return names.join(' / ');\n}\n\nfunction checkboxGrid(name, items, selected = [], labeler = (item) => item.name || item.title || 'Untitled group') {\n  const selectedSet = new Set(selected);\n  if (!items.length) return '<p class=\"muted\">Nothing available yet.</p>';\n  return `<div class=\"checkbox-grid\">${items.map((item) => `\n    <label class=\"checkbox-item\"><input type=\"checkbox\" name=\"${name}\" value=\"${item.id}\" ${selectedSet.has(item.id) ? 'checked' : ''} /><span>${escapeHtml(labeler(item))}</span></label>\n  `).join('')}</div>`;\n}\n\nfunction richEditor(value = '', placeholder = 'Add details\u2026') {\n  return `<div class=\"markdown-editor-shell\"><textarea class=\"markdown-editor\" data-details-editor rows=\"8\" placeholder=\"${escapeHtml(placeholder)}\" aria-label=\"${escapeHtml(placeholder)}\">${escapeHtml(value)}</textarea><p class=\"tiny muted\">Markdown supported: **bold**, *italic*, lists, quotes, links, and code.</p></div>`;\n}\n\nfunction modalForm(title, body, onSubmit, submitLabel = 'Save') {\n  modalTitle.textContent = title;\n  modalBody.innerHTML = `<form id=\"modal-form\">${body}<div class=\"form-actions\"><button type=\"button\" class=\"button ghost\" data-action=\"close-modal\">Cancel</button><button type=\"submit\" class=\"button primary\">${escapeHtml(submitLabel)}</button></div></form>`;\n  modalSubmitHandler = onSubmit;\n  modalDirty = false;\n  modal.showModal();\n}\n\nfunction modalManager(title, body) {\n  modalTitle.textContent = title;\n  modalBody.innerHTML = body;\n  modalSubmitHandler = null;\n  modalDirty = false;\n  modal.showModal();\n}\n\nfunction closeModal() {\n  modal.close();\n  modalBody.innerHTML = '';\n  modalSubmitHandler = null;\n  modalCloseReturn = null;\n  modalDirty = false;\n}\n\nfunction modalHasDiscardableWork() {\n  if (modalDirty) return true;\n  if (modalCloseReturn) return false;\n  if (relationshipDraft?.screen === 'conflict' && (relationshipDraft.picked.length || relationshipDraft.conflictMembers.length)) return true;\n  return Boolean(requirementBuilder && (requirementBuilder.picked.length || requirementBuilder.sides.some((side) => side.length)));\n}\n\nfunction dismissModal() {\n  if (modalHasDiscardableWork() && !confirm('Discard the unfinished relationship changes?')) return;\n  const returnTo = modalCloseReturn;\n  closeModal();\n  if (returnTo) returnTo();\n}\n\nfunction getRichValue(root = modalBody) {\n  return String($('[data-details-editor]', root)?.value || '').trim();\n}\n\nfunction renderThemePicker() {\n  const name = activeTheme()?.name || 'Choose theme';\n  $('#active-theme-label').textContent = name;\n  $('#theme-picker-button').title = `Choose theme: ${name}`;\n}\n\nfunction openThemePicker() {\n  const children = new Map();\n  for (const theme of state.themes) {\n    const parent = theme.parentId || '__root__';\n    if (!children.has(parent)) children.set(parent, []);\n    children.get(parent).push(theme);\n  }\n  for (const list of children.values()) list.sort((a, b) => a.name.localeCompare(b.name));\n  const rows = [];\n  const walk = (parentId, depth) => {\n    for (const theme of children.get(parentId) || []) {\n      const prefix = depth ? `${'\u2014 '.repeat(depth)}` : '';\n      rows.push(`<button class=\"manager-row theme-choice ${theme.id === state.activeThemeId ? 'selected-theme' : ''}\" data-action=\"select-theme\" data-id=\"${theme.id}\"><span>${escapeHtml(prefix + theme.name)}</span><span class=\"tiny muted\">${escapeHtml(themePath(theme.id))}</span></button>`);\n      walk(theme.id, depth + 1);\n    }\n  };\n  walk('__root__', 0);\n  modalManager('Choose theme', `<div class=\"manager-list\">${rows.join('')}</div><div class=\"form-actions\"><button class=\"button secondary\" data-action=\"add-theme\">+ New theme</button><button class=\"button ghost\" data-action=\"close-modal\">Close</button></div>`);\n}\n\nfunction openCreateMenu() {\n  modalManager('Create', `<div class=\"manager-list create-menu\"><button class=\"button primary\" data-action=\"create-idea\">Idea</button><button class=\"button primary\" data-action=\"create-implementation\">Implementation</button><button class=\"button secondary\" data-action=\"create-theme\">Theme</button><button class=\"button secondary\" data-action=\"create-idea-group\">Idea group</button><button class=\"button secondary\" data-action=\"create-implementation-group\">Implementation group</button><button class=\"button ghost\" data-action=\"open-empty-relationship-flow\">Conflict / requirement</button></div>`);\n}\n\nfunction openCommandPalette() {\n  modalManager('Commands', `<label class=\"field\"><span>Find a command</span><input data-command-search type=\"search\" placeholder=\"Create, share, import\u2026\" autofocus /></label><div class=\"manager-list command-list\"><button class=\"button primary\" data-action=\"add-idea\">Create idea</button><button class=\"button primary\" data-action=\"create-implementation\">Create implementation</button><button class=\"button secondary\" data-action=\"manage-structure\">Open structure</button><button class=\"button secondary\" data-action=\"manage-saves\">Open saved views</button><button class=\"button secondary\" data-action=\"open-share-menu\">Manage shares</button><button class=\"button secondary\" data-action=\"open-project-library\">Open project library</button><button class=\"button secondary\" data-action=\"open-export-menu\">Export project</button><button class=\"button secondary\" data-action=\"open-import-menu\">Import project</button><button class=\"button ghost\" data-action=\"toggle-board-density\">Toggle board density</button></div>`);\n}\n\nfunction openMoreMenu() {\n  modalManager('More', `<div class=\"form-actions\"><button class=\"button ghost compact\" data-action=\"undo\" ${undoStack.length ? '' : 'disabled'}>Undo</button><button class=\"button ghost compact\" data-action=\"redo\" ${redoStack.length ? '' : 'disabled'}>Redo</button></div><div class=\"manager-list\"><button class=\"button secondary\" data-action=\"open-command-palette\">Commands <span class=\"tiny muted\">Ctrl/\u2318 K</span></button><button class=\"button secondary\" data-action=\"open-display-settings\">Display and sorting</button><button class=\"button secondary\" data-action=\"toggle-board-density\">Board density: ${boardDensity === 'compact' ? 'Compact' : 'Detailed'}</button><button class=\"button secondary\" data-action=\"manage-structure\">Structure</button><button class=\"button secondary\" data-action=\"manage-saves\">Saved views</button><button class=\"button secondary\" data-action=\"open-mobile-filters\">Filters and visibility</button><button class=\"button secondary\" data-action=\"open-share-menu\">Share</button><button class=\"button secondary\" data-action=\"open-export-menu\">Export</button><button class=\"button secondary\" data-action=\"open-import-menu\">Import</button><button class=\"button ghost\" data-action=\"project-menu\">Project settings</button></div>`);\n  if (state.savedViews.length >= 2) {\n    const compare = document.createElement('button');\n    compare.className = 'button secondary';\n    compare.dataset.action = 'compare-views';\n    compare.textContent = 'Compare saved views';\n    $('.manager-list', modalBody)?.insertBefore(compare, $('.manager-list [data-action=\"open-mobile-filters\"]', modalBody));\n  }\n}\n\nfunction openDisplaySettings() {\n  const settings = state.displaySettings || { ideaTitleSize: 18, ideaDetailsSize: 14, implementationTitleSize: 14, implementationDetailsSize: 13 };\n  const v = view();\n  modalForm('Display and sorting', `<div class=\"form-grid\"><label class=\"field\"><span>Idea title size</span><input name=\"ideaTitleSize\" type=\"number\" min=\"12\" max=\"32\" value=\"${settings.ideaTitleSize}\" /></label><label class=\"field\"><span>Idea details size</span><input name=\"ideaDetailsSize\" type=\"number\" min=\"10\" max=\"24\" value=\"${settings.ideaDetailsSize}\" /></label><label class=\"field\"><span>Implementation title size</span><input name=\"implementationTitleSize\" type=\"number\" min=\"10\" max=\"28\" value=\"${settings.implementationTitleSize}\" /></label><label class=\"field\"><span>Implementation details size</span><input name=\"implementationDetailsSize\" type=\"number\" min=\"10\" max=\"22\" value=\"${settings.implementationDetailsSize}\" /></label><label class=\"field\"><span>Sort ideas</span><select name=\"ideaSort\"><option value=\"manual\" ${v.ideaSort === 'manual' ? 'selected' : ''}>Manual order</option><option value=\"implementations\" ${v.ideaSort === 'implementations' ? 'selected' : ''}>Implementation count</option><option value=\"locked\" ${v.ideaSort === 'locked' ? 'selected' : ''}>Locked count</option><option value=\"conflicts\" ${v.ideaSort === 'conflicts' ? 'selected' : ''}>Conflict count</option></select></label><label class=\"field\"><span>Direction</span><select name=\"ideaSortDirection\"><option value=\"asc\" ${v.ideaSortDirection === 'asc' ? 'selected' : ''}>Ascending</option><option value=\"desc\" ${v.ideaSortDirection === 'desc' ? 'selected' : ''}>Descending</option></select></label></div>`, async (form) => {\n    const data = new FormData(form); const clamp = (name, min, max, fallback) => Math.min(max, Math.max(min, Number(data.get(name)) || fallback));\n    state.displaySettings = { ideaTitleSize: clamp('ideaTitleSize', 12, 32, 18), ideaDetailsSize: clamp('ideaDetailsSize', 10, 24, 14), implementationTitleSize: clamp('implementationTitleSize', 10, 28, 14), implementationDetailsSize: clamp('implementationDetailsSize', 10, 22, 13) };\n    v.ideaSort = String(data.get('ideaSort')); v.ideaSortDirection = String(data.get('ideaSortDirection'));\n    closeModal(); render(); markDirty();\n  });\n}\n\nfunction openMobileFilters() {\n  const v = view();\n  const groups = state.ideaGroups.map((group) => `<label class=\"checkbox-item\"><input type=\"checkbox\" data-mobile-group-filter value=\"${group.id}\" ${v.ideaGroupFilterIds.includes(group.id) ? 'checked' : ''}><span>${escapeHtml(group.name || 'Untitled group')}</span></label>`).join('');\n  modalManager('Filters and visibility', `<label class=\"toggle-label\"><input type=\"checkbox\" data-mobile-show-excluded ${v.showExcluded ? 'checked' : ''}> Show excluded choices</label><div class=\"form-actions\"><button class=\"button secondary\" data-action=\"show-all\">Show all</button><button class=\"button secondary\" data-action=\"hide-all\">Hide all</button><button class=\"button ghost\" data-action=\"restore-visible\">Restore previous</button></div><h3>Idea groups</h3><div class=\"checkbox-grid\"><label class=\"checkbox-item\"><input type=\"checkbox\" data-mobile-group-filter value=\"__ungrouped__\" ${v.ideaGroupFilterIds.includes('__ungrouped__') ? 'checked' : ''}><span>Ungrouped</span></label>${groups}</div><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"clear-mobile-filters\">Clear groups</button><button class=\"button primary\" data-action=\"apply-mobile-filters\">Apply</button></div>`);\n  const sort = document.createElement('label');\n  sort.className = 'field';\n  sort.innerHTML = `<span>Sort ideas</span><select data-mobile-idea-sort><option value=\"manual\">Manual</option><option value=\"implementations\">Implementation count</option><option value=\"locked\">Locked count</option><option value=\"conflicts\">Conflict count</option></select>`;\n  sort.querySelector('select').value = v.ideaSort;\n  modalBody.querySelector('.form-actions')?.before(sort);\n}\n\nfunction renderFilters() {\n  const v = view();\n  $('#board-controls').innerHTML = boardControlsHtml({ view: v, groups: state.ideaGroups, include: { fontSettings: true, lockSummary: true } });\n  const selectedControl = v.selectedImplementationIds.filter((id) => byId(state.implementations, id));\n  const lockSelectedControl = $('#lock-selected');\n  if (lockSelectedControl) {\n    lockSelectedControl.hidden = !selectedControl.length;\n    const allManual = selectedControl.every((id) => v.manuallyLockedImplementationIds.includes(id));\n    const conflicts = conflictsForTheme().filter((conflict) => selectedControl.some((id) => conflict.implementationIds.includes(id))).map((conflict) => conflict.name).slice(0, 3);\n    const required = requirements().filter((item) => selectedControl.includes(item.fromImplementationId)).map((item) => `${byId(state.implementations, item.fromImplementationId)?.title || 'Implementation'} \u2192 ${byId(state.implementations, item.toImplementationId)?.title || 'implementation'}`).slice(0, 3);\n    lockSelectedControl.textContent = `${allManual ? 'Unlock' : 'Lock'} selected (${selectedControl.length})`;\n    lockSelectedControl.title = `${allManual ? 'Unlock selected implementations' : 'Lock selected implementations and their requirements'}${conflicts.length ? `\\nConflicts: ${conflicts.join(', ')}` : ''}${required.length ? `\\nRequirements: ${required.join(', ')}` : ''}`;\n  }\n  $('#relationship-button').hidden = selectedControl.length < 2;\n  return;\n  $('#search-input').value = v.search;\n  $('#show-excluded').checked = v.showExcluded;\n  $('#idea-sort').value = v.ideaSort;\n  const sortDirection = $('#idea-sort-direction');\n  sortDirection.textContent = v.ideaSortDirection === 'desc' ? '\u2193' : '\u2191';\n  sortDirection.title = `Sort ${v.ideaSortDirection === 'desc' ? 'descending' : 'ascending'}`;\n  const selectedGroups = new Set(v.ideaGroupFilterIds);\n  const groupLabel = !selectedGroups.size ? 'All groups' : selectedGroups.size === 1 && selectedGroups.has('__ungrouped__') ? 'Ungrouped' : `${selectedGroups.size} group${selectedGroups.size === 1 ? '' : 's'}`;\n  $('#idea-group-filter-label').textContent = groupLabel;\n  $('#idea-group-filter-options').innerHTML = `<div class=\"group-filter-row\"><button data-action=\"filter-idea-group-only\" data-id=\"all\">All groups</button></div><div class=\"group-filter-row\"><button data-action=\"filter-idea-group-only\" data-id=\"__ungrouped__\">Ungrouped</button><button class=\"group-filter-toggle ${selectedGroups.has('__ungrouped__') ? 'active' : ''}\" data-action=\"toggle-idea-group-filter\" data-id=\"__ungrouped__\" aria-label=\"Toggle ungrouped\">${selectedGroups.has('__ungrouped__') ? '\u2713' : '+'}</button></div>${state.ideaGroups.map((group) => `<div class=\"group-filter-row\"><button data-action=\"filter-idea-group-only\" data-id=\"${group.id}\">${escapeHtml(group.name || 'Untitled group')}</button><button class=\"group-filter-toggle ${selectedGroups.has(group.id) ? 'active' : ''}\" data-action=\"toggle-idea-group-filter\" data-id=\"${group.id}\" aria-label=\"Toggle ${escapeHtml(group.name || 'group')}\">${selectedGroups.has(group.id) ? '\u2713' : '+'}</button></div>`).join('')}`;\n  $('#lock-count').textContent = `${v.lockedImplementationIds.length} locked`;\n  const selected = v.selectedImplementationIds.filter((id) => byId(state.implementations, id));\n  const lockSelected = $('#lock-selected');\n  if (lockSelected) {\n    lockSelected.hidden = !selected.length;\n    const allManual = selected.every((id) => v.manuallyLockedImplementationIds.includes(id));\n    const conflicts = conflictsForTheme().filter((conflict) => selected.some((id) => conflict.implementationIds.includes(id))).map((conflict) => conflict.name).slice(0, 3);\n    const required = requirements().filter((item) => selected.includes(item.fromImplementationId)).map((item) => `${byId(state.implementations, item.fromImplementationId)?.title || 'Implementation'} \u2192 ${byId(state.implementations, item.toImplementationId)?.title || 'implementation'}`).slice(0, 3);\n    lockSelected.textContent = `${allManual ? 'Unlock' : 'Lock'} selected (${selected.length})`;\n    lockSelected.title = `${allManual ? 'Unlock selected implementations' : 'Lock selected implementations and their requirements'}${conflicts.length ? `\\nConflicts: ${conflicts.join(', ')}` : ''}${required.length ? `\\nRequirements: ${required.join(', ')}` : ''}`;\n  }\n  const relationshipButton = $('#relationship-button');\n  if (relationshipButton) relationshipButton.hidden = selected.length < 2;\n}\n\nfunction ideaCardStyle(idea) {\n  const colors = idea.groupIds.map((groupId) => byId(state.ideaGroups, groupId)?.color).filter(Boolean);\n  return `--idea-bg:${blendBackground(colors)};--idea-fg:${readableTextColor(colors)};`;\n}\n\nfunction implementationBadges(implementation, blockers, conflicts, directInTheme) {\n  const badges = [];\n  const outgoing = requirements().filter((requirement) => requirement.fromImplementationId === implementation.id);\n  const incoming = requirements().filter((requirement) => requirement.toImplementationId === implementation.id);\n  if (!directInTheme) badges.push(`<span class=\"micro-badge\">Inherited</span>`);\n  if (outgoing.length) badges.push(`<span class=\"micro-badge\">Requires ${outgoing.length}</span>`);\n  if (incoming.length) badges.push(`<span class=\"micro-badge\">Required by ${incoming.length}</span>`);\n  if (blockers.length) badges.push(`<span class=\"micro-badge warning\">${blockers.length} blocking conflict${blockers.length === 1 ? '' : 's'}</span>`);\n  for (const conflict of conflicts.slice(0, 3)) badges.push(`<button class=\"micro-badge conflict\" data-action=\"focus-conflict\" data-id=\"${conflict.id}\" title=\"${escapeHtml(conflict.name)}\">${escapeHtml(conflict.name)}</button>`);\n  if (conflicts.length > 3) badges.push(`<span class=\"micro-badge\">+${conflicts.length - 3}</span>`);\n  return badges.join('');\n}\n\nfunction renderImplementationRow(implementation, allConflicts, v) {\n  const locked = v.lockedImplementationIds.includes(implementation.id);\n  const proposal = locked ? null : lockWithRequirements(allConflicts, requirements(), v.lockedImplementationIds, implementation.id, implementationsForTheme().map((item) => item.id));\n  const blockers = locked ? [] : unique([...blockingConflicts(allConflicts, v.lockedImplementationIds, implementation.id), ...(proposal?.completedConflicts || [])]);\n  const missingRequirements = proposal?.missingIds || [];\n  const cannotLock = Boolean(blockers.length || missingRequirements.length);\n  if (blockers.length && !v.showExcluded) return '';\n  const relatedConflicts = allConflicts.filter((conflict) => conflict.implementationIds.includes(implementation.id));\n  const expanded = v.expandedImplementationIds.includes(implementation.id);\n  const selected = v.selectedImplementationIds.includes(implementation.id);\n  const relationKinds = v.selectedImplementationIds.filter((id) => id !== implementation.id).map((selectedId) => {\n    const conflict = allConflicts.some((item) => item.implementationIds.includes(selectedId) && item.implementationIds.includes(implementation.id));\n    const requires = requirements().some((item) => item.fromImplementationId === selectedId && item.toImplementationId === implementation.id);\n    const requiredBy = requirements().some((item) => item.fromImplementationId === implementation.id && item.toImplementationId === selectedId);\n    return conflict ? 'relationship-conflict' : requires && requiredBy ? 'relationship-bidirectional' : requires ? 'relationship-requires' : requiredBy ? 'relationship-required-by' : '';\n  }).filter(Boolean);\n  const relationClass = relationKinds.includes('relationship-conflict') ? 'relationship-conflict' : relationKinds.includes('relationship-bidirectional') ? 'relationship-bidirectional' : relationKinds.includes('relationship-requires') ? 'relationship-requires' : relationKinds.includes('relationship-required-by') ? 'relationship-required-by' : '';\n  const focused = focusedConflictId ? byId(allConflicts, focusedConflictId) : null;\n  const focusClass = focusedConflictId ? (focused?.implementationIds.includes(implementation.id) ? 'conflict-member' : 'conflict-muted') : '';\n  return `<article class=\"impl-row ${locked ? 'locked' : ''} ${selected ? 'selected' : ''} ${relationClass} ${blockers.length ? 'incompatible' : ''} ${focusClass}\" data-implementation-id=\"${implementation.id}\">\n    <div class=\"impl-main\">\n      <button class=\"impl-title-button\" data-action=\"open-inspector\" data-id=\"${implementation.id}\">${escapeHtml(implementation.title)}</button>\n      <div class=\"impl-subline\">${implementationBadges(implementation, blockers, relatedConflicts, implementation.directInTheme)}</div>\n    </div>\n    <div class=\"impl-actions\">\n      <button class=\"drag-handle\" data-reorder-kind=\"implementation\" data-reorder-id=\"${implementation.id}\" aria-label=\"Reorder implementation ${escapeHtml(implementation.title)}. Use the arrow keys.\" title=\"Drag or use arrow keys to reorder\">\u283F</button>\n      <button class=\"lock-button ${selected ? 'active' : ''}\" data-action=\"toggle-selection\" data-id=\"${implementation.id}\" title=\"${selected ? 'Deselect' : 'Select'}\">${selected ? '\u2713' : '\u25CB'}</button>\n      <button data-action=\"toggle-impl-details\" data-id=\"${implementation.id}\" title=\"Toggle details\">${expanded ? '\u25B4' : '\u25BE'}</button>\n      <button data-action=\"hide-implementation\" data-id=\"${implementation.id}\" title=\"Hide in this view\">\u25C9</button>\n    </div>\n    ${expanded && detailsText(implementation) ? `<div class=\"impl-details\">${markdownToSafeHtml(detailsText(implementation))}</div>` : ''}\n  </article>`;\n}\n\nfunction renderBoard() {\n  const board = $('#board');\n  board.classList.toggle('compact-density', boardDensity === 'compact');\n  const v = view();\n  const display = state.displaySettings || {};\n  board.style.setProperty('--idea-title-size', `${display.ideaTitleSize || 18}px`);\n  board.style.setProperty('--idea-details-size', `${display.ideaDetailsSize || 14}px`);\n  board.style.setProperty('--implementation-title-size', `${display.implementationTitleSize || 14}px`);\n  board.style.setProperty('--implementation-details-size', `${display.implementationDetailsSize || 13}px`);\n  const effective = implementationsForTheme();\n  const effectiveById = new Map(effective.map((item) => [item.id, item]));\n  const allConflicts = conflictsForTheme();\n  const visible = new Set(v.visibleImplementationIds);\n  const search = v.search.trim().toLowerCase();\n  const selectedGroups = new Set(v.ideaGroupFilterIds || []);\n  const ideas = state.ideas\n    .filter((idea) => !selectedGroups.size || (selectedGroups.has('__ungrouped__') && !idea.groupIds.length) || idea.groupIds.some((id) => selectedGroups.has(id)))\n    .filter((idea) => {\n      if (!search) return true;\n      const linked = effective.filter((implementation) => implementation.ideaIds.includes(idea.id));\n      const linkedIds = new Set(linked.map((implementation) => implementation.id));\n      const groupNames = [\n        ...idea.groupIds.map((groupId) => byId(state.ideaGroups, groupId)?.name),\n        ...linked.flatMap((implementation) => implementation.groupIds.map((groupId) => byId(state.implementationGroups, groupId)?.name)),\n      ];\n      const themeNames = linked.flatMap((implementation) => implementation.themeIds.map((themeId) => byId(state.themes, themeId)?.name));\n      const conflictText = state.conflicts.filter((conflict) => conflict.implementationIds.some((implementationId) => linkedIds.has(implementationId))).flatMap((conflict) => [conflict.name, detailsText(conflict)]);\n      const requirementText = requirements().filter((requirement) => linkedIds.has(requirement.fromImplementationId) || linkedIds.has(requirement.toImplementationId)).flatMap((requirement) => [\n        byId(state.implementations, requirement.fromImplementationId)?.title,\n        byId(state.implementations, requirement.toImplementationId)?.title,\n        detailsText(requirement),\n      ]);\n      return [\n        idea.title,\n        detailsText(idea),\n        ...linked.flatMap((implementation) => [implementation.title, detailsText(implementation)]),\n        ...groupNames,\n        ...themeNames,\n        ...conflictText,\n        ...requirementText,\n      ].filter(Boolean).join(' ').toLowerCase().includes(search);\n    })\n    .sort((left, right) => {\n      if (v.ideaSort === 'manual') return numberSort(left, right);\n      const metric = (idea) => {\n        const linked = effective.filter((implementation) => implementation.ideaIds.includes(idea.id));\n        if (v.ideaSort === 'implementations') return linked.length;\n        if (v.ideaSort === 'locked') return linked.filter((implementation) => v.lockedImplementationIds.includes(implementation.id)).length;\n        return allConflicts.filter((conflict) => conflict.implementationIds.some((implementationId) => linked.some((implementation) => implementation.id === implementationId))).length;\n      };\n      const result = metric(left) - metric(right);\n      return (v.ideaSortDirection === 'desc' ? -result : result) || numberSort(left, right);\n    });\n\n  if (!ideas.length) {\n    board.innerHTML = state.ideas.length\n      ? '<div class=\"gate-card empty-workflow\"><h2>No ideas match this view</h2><p class=\"muted\">Clear search or filters to return to the board.</p><button class=\"button secondary\" data-action=\"open-mobile-filters\">Review filters</button></div>'\n      : `<div class=\"gate-card empty-workflow\"><p class=\"eyebrow\">A simple path from thought to decision</p><h2>Start with one idea</h2><p class=\"muted\">Capture what you are considering first. Implementations, constraints, and saved decisions can come later.</p><ol class=\"onboarding-steps\"><li class=\"active\"><strong>1. Add an idea</strong><span>Name the opportunity or question.</span></li><li><strong>2. Add implementations</strong><span>Describe possible ways to realize it.</span></li><li><strong>3. Test a decision</strong><span>Lock choices and explain any blockers.</span></li><li><strong>4. Save the view</strong><span>Keep a deliberate snapshot for comparison.</span></li></ol><button class=\"button primary\" data-action=\"add-idea\">+ Add first idea</button></div>`;\n  } else {\n    board.innerHTML = ideas.map((idea) => {\n      const groups = idea.groupIds.map((groupId) => byId(state.ideaGroups, groupId)).filter(Boolean);\n      const implementations = effective.filter((implementation) => implementation.ideaIds.includes(idea.id));\n      const visibleImplementations = implementations.filter((implementation) => visible.has(implementation.id));\n      const hiddenImplementations = implementations.filter((implementation) => !visible.has(implementation.id));\n      const allHidden = implementations.length > 0 && visibleImplementations.length === 0;\n      const sortedVisible = [...visibleImplementations].sort((a, b) => implementationOrderForIdea(a, idea.id) - implementationOrderForIdea(b, idea.id) || numberSort(a, b));\n      const expanded = v.expandedIdeaIds.includes(idea.id);\n      return `<section class=\"idea-card\" data-idea-id=\"${idea.id}\" style=\"${ideaCardStyle(idea)}\">\n        <header class=\"idea-header\">\n          <h2 class=\"idea-title\"><button class=\"idea-title-button\" data-action=\"open-idea-inspector\" data-id=\"${idea.id}\" title=\"Open idea details\">${escapeHtml(idea.title)}</button></h2>\n          <div class=\"idea-control-row\">\n            <div class=\"idea-group-dots\" aria-label=\"Idea groups\">${groups.map((group) => `<span class=\"color-dot\" title=\"${escapeHtml(group.name || 'Untitled group')}\" style=\"background:${group.color || '#d5dbe5'}\"></span>`).join('')}</div>\n            <div class=\"idea-actions\">\n              <button class=\"icon-button drag-handle\" data-reorder-kind=\"idea\" data-reorder-id=\"${idea.id}\" aria-label=\"Reorder idea ${escapeHtml(idea.title)}. Use the arrow keys.\" title=\"Drag or use arrow keys to reorder\">\u283F</button>\n              <button class=\"icon-button\" data-action=\"toggle-idea-details\" data-id=\"${idea.id}\" title=\"Toggle details\">${expanded ? '\u25B4' : '\u25BE'}</button>\n              <button class=\"icon-button\" data-action=\"edit-idea\" data-id=\"${idea.id}\" title=\"Edit idea\">\u270E</button>\n              <button class=\"icon-button\" data-action=\"add-implementation\" data-idea-id=\"${idea.id}\" title=\"Add implementation\">\uFF0B</button>\n            </div>\n          </div>\n        </header>\n        ${expanded && detailsText(idea) ? `<div class=\"idea-details\">${markdownToSafeHtml(detailsText(idea))}</div>` : ''}\n        ${allHidden ? `<div class=\"hidden-strip hidden-implementation-summary\" aria-label=\"Hidden implementations\">${hiddenImplementations.map((implementation) => `<span class=\"hidden-chip\">${escapeHtml(implementation.title)} <button data-action=\"show-implementation\" data-id=\"${implementation.id}\">show</button></span>`).join('')}</div>` : `<div class=\"implementation-list\">\n          ${sortedVisible.length ? sortedVisible.map((implementation) => renderImplementationRow(implementation, allConflicts, v)).join('') : `<div class=\"empty-impl\">${implementations.length ? 'All implementations are hidden.' : 'No implementation in this theme.'}</div>`}\n          ${hiddenImplementations.length ? `<div class=\"hidden-strip\">${hiddenImplementations.map((implementation) => `<span class=\"hidden-chip\">${escapeHtml(implementation.title)} <button data-action=\"show-implementation\" data-id=\"${implementation.id}\">show</button></span>`).join('')}</div>` : ''}\n        </div>`}\n      </section>`;\n    }).join('');\n  }\n\n  const focusBanner = $('#conflict-focus-banner');\n  const focused = focusedConflictId ? byId(allConflicts, focusedConflictId) : null;\n  if (focused) {\n    focusBanner.hidden = false;\n    focusBanner.innerHTML = `<strong>${escapeHtml(focused.name)}</strong>${detailsText(focused) ? ` \u2014 ${escapeHtml(detailsText(focused).slice(0, 180))}` : ''} <button class=\"link-button\" data-action=\"clear-conflict-focus\">Clear highlight</button>`;\n  } else focusBanner.hidden = true;\n}\n\nfunction draggableBoardItem(target) {\n  const handle = target.closest('.drag-handle');\n  if (!handle) return null;\n  const implementation = target.closest('.impl-row');\n  if (implementation) return { kind: 'implementation', source: implementation, id: implementation.dataset.implementationId, ideaId: implementation.closest('.idea-card')?.dataset.ideaId };\n  const idea = target.closest('.idea-card');\n  if (idea) return { kind: 'idea', source: idea, id: idea.dataset.ideaId };\n  return null;\n}\n\nfunction keyboardReorderBoardItem(target, delta) {\n  const item = draggableBoardItem(target);\n  if (!item?.id) return;\n  if (item.kind === 'idea') {\n    const orderedIds = [...state.ideas].sort(numberSort).map((idea) => idea.id);\n    const from = orderedIds.indexOf(item.id);\n    const to = Math.max(0, Math.min(orderedIds.length - 1, from + delta));\n    if (from === to) return;\n    [orderedIds[from], orderedIds[to]] = [orderedIds[to], orderedIds[from]];\n    ideaOrder(state.ideas, orderedIds);\n  } else {\n    const orderedIds = implementationsForTheme()\n      .filter((implementation) => implementation.ideaIds.includes(item.ideaId))\n      .sort((a, b) => implementationOrderForIdea(a, item.ideaId) - implementationOrderForIdea(b, item.ideaId) || numberSort(a, b))\n      .map((implementation) => implementation.id);\n    const from = orderedIds.indexOf(item.id);\n    const to = Math.max(0, Math.min(orderedIds.length - 1, from + delta));\n    if (from === to) return;\n    [orderedIds[from], orderedIds[to]] = [orderedIds[to], orderedIds[from]];\n    implementationOrder(state.implementations, item.ideaId, orderedIds);\n  }\n  renderBoard();\n  markDirty();\n  $(`.drag-handle[data-reorder-id=\"${CSS.escape(item.id)}\"]`, $('#board'))?.focus();\n  showToast(`${item.kind === 'idea' ? 'Idea' : 'Implementation'} moved ${delta < 0 ? 'up' : 'down'}.`);\n}\n\nfunction beginBoardPointer(event) {\n  if (activeDrag || (event.pointerType === 'mouse' && event.button !== 0)) return;\n  const item = draggableBoardItem(event.target);\n  if (!item?.id) return;\n  activeDrag = { ...item, handle: Boolean(event.target.closest('.drag-handle')), pointerId: event.pointerId, startX: event.clientX, startY: event.clientY, dragging: false, ghost: null };\n  item.source.setPointerCapture?.(event.pointerId);\n}\n\nfunction moveDragGhost(drag, event) {\n  if (!drag.ghost) return;\n  drag.ghost.style.transform = `translate(${event.clientX + 12}px, ${event.clientY + 12}px)`;\n}\n\nfunction startBoardDrag(drag, event) {\n  drag.dragging = true;\n  drag.source.classList.add('drag-origin');\n  const rect = drag.source.getBoundingClientRect();\n  drag.ghost = drag.source.cloneNode(true);\n  drag.ghost.classList.remove('drag-origin');\n  drag.ghost.className = `${drag.ghost.className} drag-ghost`;\n  drag.ghost.style.width = `${rect.width}px`;\n  drag.ghost.style.transform = `translate(${event.clientX + 12}px, ${event.clientY + 12}px)`;\n  document.body.append(drag.ghost);\n  document.body.classList.add('is-dragging-board');\n}\n\nfunction reorderDragSlot(drag, event) {\n  const target = document.elementFromPoint(event.clientX, event.clientY);\n  if (!target) return;\n  const candidate = drag.kind === 'idea' ? target.closest('.idea-card') : target.closest('.impl-row');\n  if (!candidate || candidate === drag.source) return;\n  if (drag.kind === 'implementation' && candidate.closest('.idea-card')?.dataset.ideaId !== drag.ideaId) return;\n  const rect = candidate.getBoundingClientRect();\n  const sameRow = drag.kind === 'idea' && Math.abs(event.clientY - (rect.top + rect.height / 2)) < rect.height / 3;\n  const before = sameRow ? event.clientX < rect.left + rect.width / 2 : event.clientY < rect.top + rect.height / 2;\n  candidate.parentElement.insertBefore(drag.source, before ? candidate : candidate.nextSibling);\n}\n\nfunction finishBoardDrag(event, cancelled = false) {\n  const drag = activeDrag;\n  if (!drag || event.pointerId !== drag.pointerId) return;\n  activeDrag = null;\n  drag.source.releasePointerCapture?.(event.pointerId);\n  if (drag.dragging) {\n    drag.ghost?.remove();\n    drag.source.classList.remove('drag-origin');\n    document.body.classList.remove('is-dragging-board');\n    if (!cancelled) {\n      if (drag.kind === 'idea') ideaOrder(state.ideas, $$('#board > .idea-card').map((item) => item.dataset.ideaId));\n      else {\n        const list = drag.source.closest('.implementation-list');\n        implementationOrder(state.implementations, drag.ideaId, $$('.impl-row', list).map((item) => item.dataset.implementationId));\n      }\n      renderBoard();\n      markDirty();\n    } else renderBoard();\n    event.preventDefault();\n    return;\n  }\n  if (drag.handle) return;\n  if (drag.kind === 'idea') {\n    const v = view();\n    v.expandedIdeaIds = v.expandedIdeaIds.includes(drag.id) ? v.expandedIdeaIds.filter((id) => id !== drag.id) : [...v.expandedIdeaIds, drag.id];\n    renderBoard();\n    markDirty();\n  } else {\n    currentInspectorId = drag.id;\n    renderInspector(true);\n  }\n}\n\nfunction moveBoardDrag(event) {\n  const drag = activeDrag;\n  if (!drag || event.pointerId !== drag.pointerId) return;\n  if (!drag.dragging && Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < 7) return;\n  if (!drag.dragging) startBoardDrag(drag, event);\n  moveDragGhost(drag, event);\n  reorderDragSlot(drag, event);\n  event.preventDefault();\n}\n\nfunction stripHtml(value = '') {\n  const doc = new DOMParser().parseFromString(value, 'text/html');\n  return doc.body.textContent || '';\n}\n\nfunction renderInspector(resetScroll = false) {\n  const workspace = $('.workspace');\n  const inspector = $('#inspector');\n  const idea = currentInspectorIdeaId ? byId(state.ideas, currentInspectorIdeaId) : null;\n  if (idea) {\n    workspace.classList.add('has-inspector');\n    inspector.hidden = false;\n    const groups = idea.groupIds.map((groupId) => byId(state.ideaGroups, groupId)).filter(Boolean);\n    const implementationCount = state.implementations.filter((implementation) => implementation.ideaIds.includes(idea.id)).length;\n    inspector.innerHTML = `<form id=\"idea-inspector-form\">\n      <div class=\"inspector-heading\"><h2>Idea details</h2><button type=\"button\" class=\"icon-button\" data-action=\"close-inspector\" aria-label=\"Close idea details\">\u00D7</button></div>\n      <label class=\"field\"><span>Title</span><input name=\"title\" value=\"${escapeHtml(idea.title)}\" required /></label>\n      <label class=\"field\"><span>Details / notes</span>${richEditor(detailsText(idea), 'Describe this idea\u2026')}</label>\n      <div class=\"inspector-actions\"><button type=\"submit\" class=\"button primary\">Save details</button><button type=\"button\" class=\"button ghost\" data-action=\"edit-idea\" data-id=\"${idea.id}\">Edit groups</button><button type=\"button\" class=\"button danger\" data-action=\"delete-idea\" data-id=\"${idea.id}\">Delete</button></div>\n    </form>\n    <section class=\"inspector-section\"><h3>At a glance</h3><div class=\"inspector-list\"><div class=\"inspector-item\"><span>Implementations</span><span>${implementationCount}</span></div><div class=\"inspector-item\"><span>Idea groups</span><span>${escapeHtml(groups.map((group) => group.name || 'Untitled group').join(', ') || 'None')}</span></div></div></section>`;\n    if (resetScroll) inspector.scrollTop = 0;\n    return;\n  }\n  const effective = implementationsForTheme();\n  const implementation = currentInspectorId ? byId(state.implementations, currentInspectorId) : null;\n  if (!implementation || !effective.some((item) => item.id === implementation.id)) {\n    currentInspectorId = null;\n    currentInspectorIdeaId = null;\n    workspace.classList.remove('has-inspector');\n    inspector.hidden = true;\n    inspector.innerHTML = '';\n    return;\n  }\n  workspace.classList.add('has-inspector');\n  inspector.hidden = false;\n  const effectiveItem = effective.find((item) => item.id === implementation.id);\n  const relatedConflicts = conflictsForTheme().filter((conflict) => conflict.implementationIds.includes(implementation.id));\n  const inherited = !implementation.themeIds.includes(state.activeThemeId);\n  inspector.innerHTML = `<form id=\"inspector-form\">\n    <div class=\"inspector-heading\"><h2>Implementation details</h2><button type=\"button\" class=\"icon-button\" data-action=\"close-inspector\" aria-label=\"Close implementation details\">\u00C3\u2014</button></div>\n    <p class=\"tiny muted\">One underlying implementation, repeated beneath every linked idea.</p>\n    <label class=\"field\"><span>Title</span><input name=\"title\" value=\"${escapeHtml(implementation.title)}\" required /></label>\n    <label class=\"field\"><span>Details / notes</span>${richEditor(detailsText(implementation), 'Markdown notes\u2026')}</label>\n    <div class=\"inspector-actions\"><button type=\"submit\" class=\"button primary\">Save details</button><button type=\"button\" class=\"button ghost\" data-action=\"edit-implementation\" data-id=\"${implementation.id}\">Edit relationships</button><button type=\"button\" class=\"button danger\" data-action=\"delete-implementation\" data-id=\"${implementation.id}\">Delete</button></div>\n  </form>\n  <section class=\"inspector-section\"><h3>Theme origin</h3><div class=\"inspector-list\">${effectiveItem.originThemeIds.map((themeId) => `<div class=\"inspector-item\"><span>${escapeHtml(themeName(themeId))}</span><span>${themeId === state.activeThemeId ? 'Direct' : 'Inherited'}</span></div>`).join('')}</div>\n    ${inherited ? `<div class=\"inspector-actions\"><button class=\"button secondary compact\" data-action=\"make-direct\" data-id=\"${implementation.id}\">Make direct here</button><button class=\"button ghost compact\" data-action=\"hide-inherited\" data-id=\"${implementation.id}\">Hide in this theme</button></div>` : ''}\n  </section>\n  <section class=\"inspector-section\"><h3>Ideas</h3><div class=\"inspector-list\">${implementation.ideaIds.map((ideaId) => byId(state.ideas, ideaId)).filter(Boolean).map((idea) => `<div class=\"inspector-item\"><span>${escapeHtml(idea.title)}</span></div>`).join('')}</div></section>\n  <section class=\"inspector-section\"><h3>Conflicts</h3>${relatedConflicts.length ? `<div class=\"inspector-list\">${relatedConflicts.map((conflict) => `<button type=\"button\" class=\"inspector-item\" data-action=\"focus-conflict\" data-id=\"${conflict.id}\"><span>${escapeHtml(conflict.name)}</span><span>${conflict.implementationIds.length} members</span></button>`).join('')}</div>` : '<p class=\"muted\">No conflicts in this theme.</p>'}</section>\n  <section class=\"inspector-section\"><h3>Attachments</h3>\n    <div class=\"attachment-list\">${(implementation.attachments || []).map((attachment) => `<div class=\"attachment-row\"><a href=\"${attachment.url}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(attachment.name)}</a><button class=\"link-button\" data-action=\"delete-attachment\" data-id=\"${implementation.id}\" data-storage=\"${escapeHtml(attachment.storageName)}\">remove</button></div>`).join('')}</div>\n    <label class=\"field\"><span>Add local file</span><input id=\"attachment-input\" type=\"file\" data-implementation-id=\"${implementation.id}\" /></label>\n  </section>`;\n  if (resetScroll) inspector.scrollTop = 0;\n}\n\nfunction renderStats() {\n  $('#project-title').textContent = state.meta.name;\n  $('#project-location').textContent = projectPath;\n  $('#project-stats').textContent = `${state.ideas.length} ideas \u00B7 ${state.implementations.length} implementations \u00B7 ${state.conflicts.length} conflicts`;\n}\n\nfunction render() {\n  if (!state) return;\n  renderThemePicker();\n  renderFilters();\n  renderBoard();\n  renderInspector();\n  renderStats();\n}\n\nfunction renderIncludedProjects() {\n  const section = $('#included-projects');\n  const select = $('#included-project-select');\n  if (!includedProjects.length) {\n    section.hidden = true;\n    select.innerHTML = '';\n    return;\n  }\n  section.hidden = false;\n  select.innerHTML = includedProjects.map((project) => `<option value=\"${escapeHtml(project.path)}\">${escapeHtml(project.name)} \u2014 ${escapeHtml(project.relativePath)}</option>`).join('');\n}\n\nasync function loadIncludedProjects() {\n  includedProjects = [];\n  renderIncludedProjects();\n}\n\nfunction openWorkbench(status) {\n  state = validateProjectDocument(status.state);\n  for (const item of [...state.ideas, ...state.implementations, ...state.conflicts, ...requirements()]) {\n    if (!item.detailsMarkdown && item.detailsHtml) item.detailsMarkdown = htmlToMarkdown(item.detailsHtml);\n    delete item.detailsHtml;\n  }\n  projectPath = status.path;\n  currentProjectId = status.projectId || state.meta.id || 'guest';\n  currentRevision = Number(status.revision || 0);\n  lastSavedSnapshot = projectContentFingerprint(state);\n  undoStack = [];\n  redoStack = [];\n  historyBaseline = JSON.stringify(state);\n  gate.hidden = true;\n  app.hidden = false;\n  configureSaveCoordinator();\n  render();\n  if (storageMode === 'guest') hydrateGuestAttachments(state).then(() => render()).catch(() => {});\n  renderStorageNotice();\n}\n\nasync function loadStatus() {\n  try {\n    const status = await api('/api/status');\n    if (status.open) return openWorkbench(status);\n    gate.hidden = false; app.hidden = true;\n    if (status.authenticated && !status.provisioned) $('#gate-error').textContent = 'Cloud storage is full for self-service accounts. You can continue in this browser or use an invitation.';\n  } catch (error) {\n    $('#gate-error').textContent = error.message;\n  }\n}\n\nasync function continueAsGuest() {\n  storageMode = 'guest'; currentProjectId = 'guest'; currentRevision = 0; guestState = readGuestState(); await loadStatus();\n}\n\nasync function connectSignedInUser() {\n  const browserProject = structuredClone(state || readGuestState());\n  storageMode = 'cloud';\n  const status = await api('/api/status');\n  if (!status.open) {\n    storageMode = 'guest';\n    guestState = browserProject;\n    cloudWorkspaceReady = false;\n    renderStorageNotice();\n    showToast('Your account is not provisioned for cloud storage yet. This browser project is unchanged.');\n    return;\n  }\n  cloudWorkspaceReady = true;\n  currentProjectId = status.projectId || currentProjectId;\n  currentRevision = Number(status.revision || 0);\n  const browserHasWork = guestHasWork(browserProject);\n  const cloudHasWork = guestHasWork(status.state);\n  if (browserHasWork && !cloudHasWork) {\n    await uploadBrowserProjectToCloud(browserProject, 'This browser project is now saved to your private account.');\n    return;\n  }\n  if (browserHasWork && cloudHasWork) {\n    storageMode = 'guest';\n    guestState = browserProject;\n    saveGuestState(browserProject);\n    pendingCloudConflict = status;\n    openWorkbench({ state: browserProject, path: 'This browser (not uploaded)' });\n    openCloudConflictModal();\n    return;\n  }\n  openWorkbench(status);\n}\n\nasync function retryCloudConnection() {\n  if (!clerk?.user) return;\n  try { await connectSignedInUser(); }\n  catch (error) { renderStorageNotice(); showToast(`Could not connect cloud storage: ${error.message}`); }\n}\n\nasync function uploadBrowserProjectToCloud(browserProject, successMessage) {\n  try {\n    storageMode = 'cloud';\n    const saved = await api('/api/state', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ state: browserProject, baseRevision: currentRevision }) });\n    localStorage.setItem(GUEST_BACKUP_KEY, JSON.stringify(browserProject));\n    localStorage.removeItem(GUEST_STORAGE_KEY);\n    guestState = null;\n    pendingCloudConflict = null;\n    openWorkbench({ state: saved.state, path: 'Private cloud workspace', projectId: saved.projectId || currentProjectId, revision: saved.revision });\n    showToast(successMessage);\n  } catch (error) {\n    storageMode = 'guest';\n    guestState = browserProject;\n    saveGuestState(browserProject);\n    renderStorageNotice();\n    showToast(`Your browser project was not moved: ${error.message}`);\n  }\n}\n\nasync function moveGuestProjectToCloud() {\n  if (!clerk?.user || !cloudWorkspaceReady || storageMode !== 'guest' || !state) return;\n  await uploadBrowserProjectToCloud(structuredClone(state), 'This browser project is now saved to your private account.');\n}\n\nfunction openCloudConflictModal() {\n  if (!pendingCloudConflict) return;\n  modalManager('Choose project to keep', `<p>Your account already has a cloud project, and this browser also has unsynced work.</p><p class=\"muted\">Nothing will be overwritten until you choose.</p><div class=\"manager-list\"><button class=\"button primary\" data-action=\"use-cloud-project\">Use the existing cloud project</button><button class=\"button secondary\" data-action=\"replace-cloud-project\">Replace cloud with this browser project</button><button class=\"button ghost\" data-action=\"close-modal\">Decide later</button></div>`);\n}\n\nfunction openProjectMenu() {\n  const accountAction = clerk?.user ? '<button class=\"button secondary\" data-action=\"open-sign-out-menu\">Sign out</button>' : '';\n  const addLibraryButton = storageMode === 'cloud';\n  modalManager('Project', `<p><strong>${escapeHtml(state.meta.name)}</strong></p><p class=\"muted\">${escapeHtml(projectPath)}</p><div class=\"manager-list\"><button class=\"button secondary\" data-action=\"open-share-menu\">Share project</button>${addLibraryButton ? '<button class=\"button secondary\" data-action=\"open-project-history\">History and checkpoints</button>' : ''}<button class=\"button secondary\" data-action=\"open-export-menu\">Export\u2026</button><button class=\"button secondary\" data-action=\"open-import-menu\">Import\u2026</button>${accountAction}<button class=\"button danger\" data-action=\"close-project\">Close project</button></div>`);\n  if (addLibraryButton) {\n    const button = document.createElement('button');\n    button.className = 'button primary';\n    button.dataset.action = 'open-project-library';\n    button.textContent = 'All projects';\n    $('.manager-list', modalBody)?.prepend(button);\n  }\n}\n\nasync function openProjectHistory() {\n  try {\n    const payload = await api(`/api/projects/${encodeURIComponent(currentProjectId)}/revisions`);\n    const rows = (payload.revisions || []).map((revision) => `<div class=\"manager-row\"><div><strong>${escapeHtml(revision.label || `Revision ${revision.revision}`)}</strong><div class=\"tiny muted\">Revision ${revision.revision} \u00B7 ${new Date(revision.createdAt || revision.created_at).toLocaleString()}</div></div><button class=\"button secondary compact\" data-action=\"restore-project-revision\" data-id=\"${revision.id}\">Restore</button></div>`).join('');\n    modalManager('History and checkpoints', `<div class=\"manager-heading\"><p class=\"muted\">Up to 100 revisions from the last 30 days are retained.</p><button class=\"button primary compact\" data-action=\"create-project-checkpoint\">Name current version</button></div><div class=\"manager-list\">${rows || '<p class=\"muted\">No earlier revisions yet.</p>'}<button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n  } catch (error) { showToast(`Could not load history: ${error.message}`); }\n}\n\nasync function checkpointBeforeImport(label = 'Before import') {\n  if (storageMode !== 'cloud') return;\n  await saveState();\n  await saveCoordinator?.flush();\n  await api(`/api/projects/${encodeURIComponent(currentProjectId)}/revisions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ label }) });\n}\n\nasync function openProjectLibrary() {\n  if (storageMode !== 'cloud') return;\n  try {\n    const [active, all] = await Promise.all([api('/api/projects'), api('/api/projects?archived=true')]);\n    const archived = (all.projects || []).filter((project) => project.archivedAt);\n    const row = (project, archivedProject = false) => `<div class=\"manager-row\"><div><strong>${escapeHtml(project.name)}</strong><div class=\"tiny muted\">${project.counts.ideas} ideas \u00B7 ${project.counts.implementations} implementations \u00B7 updated ${new Date(project.updatedAt).toLocaleDateString()}</div></div><div class=\"manager-row-actions\">${archivedProject ? `<button class=\"button secondary compact\" data-action=\"restore-project\" data-id=\"${project.id}\">Restore</button>` : `<button class=\"button secondary compact\" data-action=\"switch-project\" data-id=\"${project.id}\" ${project.id === currentProjectId ? 'disabled' : ''}>Open</button><button class=\"button ghost compact\" data-action=\"duplicate-project\" data-id=\"${project.id}\">Duplicate</button><button class=\"button danger compact\" data-action=\"archive-project\" data-id=\"${project.id}\">Archive</button>`}</div></div>`;\n    modalManager('Projects', `<div class=\"form-actions\"><button class=\"button ghost\" data-action=\"project-menu\">Back</button><button class=\"button primary\" data-action=\"new-project\">New project</button></div><div class=\"manager-list\">${(active.projects || []).map((project) => row(project)).join('') || '<p class=\"muted\">No active projects.</p>'}</div>${archived.length ? `<h3>Archived</h3><div class=\"manager-list\">${archived.map((project) => row(project, true)).join('')}</div>` : ''}`);\n  } catch (error) {\n    showToast(`Could not load projects: ${error.message}`);\n  }\n}\n\nfunction openNewProjectForm() {\n  modalForm('New project', '<label class=\"field\"><span>Project name</span><input name=\"name\" value=\"My Ideation Project\" required autofocus /></label>', async (form) => {\n    const name = String(new FormData(form).get('name') || '').trim();\n    if (!name) throw new Error('Project name is required.');\n    captureEvent('project_create_attempted', { storage_mode: 'cloud' });\n    const result = await api('/api/projects', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name }) });\n    captureEvent('project_created', { storage_mode: 'cloud' });\n    closeModal();\n    openWorkbench({ state: result.state, path: 'Private cloud workspace', projectId: result.project.id, revision: result.project.revision });\n    showToast('Project created.');\n  }, 'Create');\n}\n\nasync function switchProject(projectId) {\n  const result = await api(`/api/projects/${encodeURIComponent(projectId)}`);\n  closeModal();\n  openWorkbench({ state: result.state, path: 'Private cloud workspace', projectId: result.project.id, revision: result.project.revision });\n}\n\nasync function openShareMenu() {\n  if (storageMode !== 'cloud' && clerk?.user) {\n    await retryCloudConnection();\n    if (pendingCloudConflict) return;\n  }\n  if (storageMode !== 'cloud') {\n    modalManager('Share project', `<p>Public links are available after this project has been saved to your private cloud workspace.</p><p class=\"muted\">Sign in and save this browser project first, then return here to create a permanent read-only link.</p><div class=\"manager-list\"><button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n    return;\n  }\n  try {\n    const payload = await api(`/api/projects/${encodeURIComponent(currentProjectId)}/shares`);\n    const shares = payload.shares || [];\n    const rows = shares.length ? shares.map((share) => `<div class=\"manager-row\"><div><strong>${share.mode === 'live' ? 'Live link' : 'Snapshot'}</strong><div class=\"tiny muted\">${share.revokedAt ? 'Revoked' : share.expiresAt ? `Expires ${new Date(share.expiresAt).toLocaleDateString()}` : 'No expiry'} \u00B7 ${new Date(share.createdAt).toLocaleDateString()}</div>${share.revokedAt ? '' : `<a href=\"${escapeHtml(share.url)}\" target=\"_blank\" rel=\"noopener\">${escapeHtml(share.url)}</a>`}</div>${share.revokedAt ? '' : `<button class=\"button danger compact\" data-action=\"revoke-project-share\" data-id=\"${share.id}\">Revoke</button>`}</div>`).join('') : '<p class=\"muted\">No share links yet.</p>';\n    modalManager('Share project', `<p>Create a read-only link. Public pages are marked not to be indexed.</p><div class=\"manager-list\"><button class=\"button primary\" data-action=\"create-project-share\" data-share-mode=\"live\">Create live link</button><button class=\"button secondary compact\" data-action=\"create-project-share\" data-share-mode=\"live\" data-expiry-days=\"7\">Create live link \u00B7 expires in 7 days</button><p class=\"tiny muted\">Readers see future changes as you save them.</p><button class=\"button secondary\" data-action=\"create-project-share\" data-share-mode=\"snapshot\">Create snapshot link</button><button class=\"button secondary compact\" data-action=\"create-project-share\" data-share-mode=\"snapshot\" data-expiry-days=\"30\">Create snapshot \u00B7 expires in 30 days</button><p class=\"tiny muted\">Readers see exactly the project as it is now.</p><h3>Existing links</h3>${rows}<button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n  } catch (error) {\n    showToast(`Could not load share links: ${error.message}`);\n  }\n}\n\nfunction openExportMenu() {\n  modalManager('Export project', `<p class=\"muted\">Choose a format for a copy of this project.</p><div class=\"manager-list\"><button class=\"button primary\" data-action=\"export-project-zip\">Portable ZIP</button><button class=\"button secondary\" data-action=\"export-project-directory\">Project directory</button><button class=\"button secondary\" data-action=\"export-project\">Markdown summary</button><button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n}\n\nfunction openImportMenu() {\n  modalManager('Import project', `<p class=\"muted\">Import replaces the project currently open in this browser. Your private cloud project is not changed until the next save.</p><div class=\"manager-list\"><button class=\"button primary\" data-action=\"import-project-portable\">Portable ZIP or project file</button><button class=\"button secondary\" data-action=\"import-project-directory\">Project directory</button><button class=\"button secondary\" data-action=\"import-project\">Markdown</button><button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n}\n\nfunction openSignOutMenu(removeBrowserCopy) {\n  if (typeof removeBrowserCopy !== 'boolean') {\n    modalManager('Sign out', `<p>What should happen to this browser\u2019s copy of the project?</p><div class=\"manager-list\"><button class=\"button secondary\" data-action=\"choose-sign-out-copy\" data-remove-browser-copy=\"false\">Keep a browser copy</button><button class=\"button danger\" data-action=\"choose-sign-out-copy\" data-remove-browser-copy=\"true\">Remove the browser copy</button><button class=\"button ghost\" data-action=\"project-menu\">Back</button></div>`);\n    return;\n  }\n  const detail = removeBrowserCopy ? 'The browser copy will be removed. Your private cloud project remains safe.' : 'A browser copy will be kept so you can continue locally after signing out.';\n  modalManager('Confirm sign out', `<p>${detail}</p><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"open-sign-out-menu\">Back</button><button class=\"button danger\" data-action=\"confirm-sign-out\" data-remove-browser-copy=\"${removeBrowserCopy}\">Sign out</button></div>`);\n}\n\nasync function createProjectShare(mode, expiryDays = 0) {\n  try {\n    captureEvent('project_share_attempted', { share_mode: mode, has_expiry: Boolean(expiryDays) });\n    await saveState();\n    const expiresAt = expiryDays ? new Date(Date.now() + Number(expiryDays) * 86400000).toISOString() : null;\n    const share = await api(`/api/projects/${encodeURIComponent(currentProjectId)}/shares`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ mode, expiresAt, view: { ...captureRichView(), themeId: state.activeThemeId } }) });\n    captureEvent('project_shared', { share_mode: mode, has_expiry: Boolean(expiresAt) });\n    modalManager('Share link created', `<p>This ${share.expiresAt ? `expiring (${new Date(share.expiresAt).toLocaleDateString()})` : 'non-expiring'} ${share.mode === 'live' ? 'live' : 'snapshot'} link is read-only and marked not to be indexed.</p><label class=\"field\"><span>Share link</span><input id=\"share-link\" value=\"${escapeHtml(share.url)}\" readonly /></label><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"project-menu\">Done</button><button class=\"button primary\" data-action=\"copy-share-link\">Copy link</button></div>`);\n  } catch (error) { showToast(`Could not create the share link: ${error.message}`); }\n}\n\nasync function copyShareLink() {\n  const input = $('#share-link');\n  if (!input) return;\n  input.select();\n  try { await navigator.clipboard.writeText(input.value); showToast('Share link copied.'); }\n  catch { input.focus(); showToast('Share link selected\u2014copy it from the field.'); }\n}\n\nasync function signOutAndReturnToBrowser({ removeBrowserCopy = false } = {}) {\n  if (!clerk) return;\n  if (state && !removeBrowserCopy) saveGuestState(state);\n  if (removeBrowserCopy) localStorage.removeItem(GUEST_STORAGE_KEY);\n  analyticsClient?.reset();\n  analyticsClient = null;\n  clerk.signOut(() => location.reload());\n}\n\nfunction startProjectRename() {\n  const title = $('#project-title');\n  if (!title || !state || title.querySelector('input')) return;\n  const original = state.meta.name;\n  title.innerHTML = `<input id=\"project-title-input\" value=\"${escapeHtml(original)}\" aria-label=\"Project name\" />`;\n  const input = $('#project-title-input');\n  const commit = () => {\n    const next = input.value.trim();\n    if (next && next !== original) { state.meta.name = next; markDirty(); }\n    renderStats();\n  };\n  input.addEventListener('blur', commit, { once: true });\n  input.addEventListener('keydown', (event) => {\n    if (event.key === 'Enter') { event.preventDefault(); input.blur(); }\n    if (event.key === 'Escape') { input.value = original; input.blur(); }\n  });\n  input.focus();\n  input.select();\n}\n\nasync function initializeClerk() {\n  if (clerkInitialization) return clerkInitialization;\n  clerkStatus = 'loading';\n  renderAccountControl();\n  clerkInitialization = (async () => {\n  const response = await fetch('/api/config');\n  if (!response.ok) throw new Error('Authentication settings could not be loaded.');\n  const config = await response.json();\n  runtimeConfig = config;\n  if (config.selfHosted) {\n    selfHosted = true;\n    clerkStatus = 'ready';\n    return;\n  }\n  if (!config.clerkPublishableKey) throw new Error('Authentication is not configured yet.');\n  clerk = await loadClerkBrowserSdk(config.clerkPublishableKey);\n  await Promise.race([\n    clerk.load({ afterSignInUrl: window.location.href, afterSignUpUrl: window.location.href }),\n    new Promise((_, reject) => setTimeout(() => reject(new Error('Clerk took too long to initialize. Please try again.')), 15000)),\n  ]);\n  await ensureAnalytics();\n  clerkStatus = 'ready';\n  renderAccountControl();\n  renderAnalyticsConsentPrompt();\n  })();\n  try { return await clerkInitialization; }\n  catch (error) { clerkStatus = 'error'; throw error; }\n  finally { clerkInitialization = null; }\n}\n\nfunction renderAccountControl() {\n  const button = $('#account-button');\n  if (!button) return;\n  if (selfHosted) {\n    button.hidden = true;\n    return;\n  }\n  if (clerkStatus === 'loading') {\n    button.disabled = true;\n    button.innerHTML = '<span class=\"loading-spinner\" aria-hidden=\"true\"></span> Loading sign-in\u2026';\n    button.setAttribute('aria-busy', 'true');\n    return;\n  }\n  button.disabled = false;\n  button.removeAttribute('aria-busy');\n  const signedIn = Boolean(clerk?.user);\n  button.dataset.action = signedIn ? 'open-sign-out-menu' : 'sign-in';\n  button.textContent = signedIn ? 'Sign out' : 'Sign in';\n}\n\nfunction loadClerkBrowserSdk(publishableKey) {\n  if (window.Clerk) return Promise.resolve(window.Clerk);\n  return new Promise((resolve, reject) => {\n    const selector = 'script[data-ideation-clerk-sdk]';\n    const existing = document.querySelector(selector);\n    const script = existing || document.createElement('script');\n    const finish = () => window.Clerk ? resolve(window.Clerk) : reject(new Error('Clerk UI components did not load.'));\n    script.addEventListener('load', finish, { once: true });\n    script.addEventListener('error', () => reject(new Error('Clerk UI components could not be loaded.')), { once: true });\n    if (!existing) {\n      script.dataset.ideationClerkSdk = '';\n      script.dataset.clerkPublishableKey = publishableKey;\n      script.async = true;\n      script.crossOrigin = 'anonymous';\n      script.src = 'https://clerk.teleoflexuous.com/npm/@clerk/clerk-js@6.25.8/dist/clerk.browser.js';\n      document.head.append(script);\n    }\n  });\n}\n\nasync function boot() {\n  $('#project-path')?.closest('.field')?.setAttribute('hidden', '');\n  $('#project-name')?.closest('.field')?.setAttribute('hidden', '');\n  $('[data-action=\"open-project\"]')?.setAttribute('hidden', '');\n  $('#included-projects')?.setAttribute('hidden', '');\n  try {\n    await continueAsGuest();\n    await initializeClerk();\n    if (selfHosted) {\n      storageMode = 'cloud';\n      const status = await api('/api/status');\n      if (status.open) openWorkbench(status);\n      renderAccountControl();\n      return;\n    }\n    if (clerk.user) await connectSignedInUser();\n    else renderStorageNotice();\n    renderAccountControl();\n  } catch (error) {\n    authenticationError = error.message || 'Authentication could not be initialized.';\n    clerkStatus = 'error';\n    clerk = null;\n    renderStorageNotice();\n    renderAccountControl();\n    console.warn('Cloud account features are unavailable:', error);\n  }\n}\n\nfunction openIdeaForm(ideaId = null) {\n  const idea = ideaId ? byId(state.ideas, ideaId) : null;\n  modalForm(idea ? 'Edit idea' : 'Add idea', `\n    <div class=\"form-grid\">\n      <label class=\"field full\"><span>Succinct title</span><input name=\"title\" value=\"${escapeHtml(idea?.title || '')}\" required autofocus /></label>\n      <label class=\"field full\"><span>Idea groups</span>${checkboxGrid('groupIds', state.ideaGroups, idea?.groupIds || [])}</label>\n      <label class=\"field full\"><span>Details</span>${richEditor(detailsText(idea), 'Details for this idea\u2026')}</label>\n    </div>\n    ${idea ? `<button type=\"button\" class=\"button danger\" data-action=\"delete-idea\" data-id=\"${idea.id}\">Delete idea</button>` : ''}\n  `, async (form) => {\n    const formData = new FormData(form);\n    const title = String(formData.get('title') || '').trim();\n    if (!title) throw new Error('A title is required.');\n    const payload = {\n      id: idea?.id || id(), title, detailsMarkdown: getRichValue(), groupIds: formData.getAll('groupIds').map(String), sortOrder: idea?.sortOrder ?? state.ideas.length,\n    };\n    if (idea) Object.assign(idea, payload);\n    else {\n      state.ideas.push(payload);\n      recordPersistedEvent('idea_created', { group_count: payload.groupIds.length });\n    }\n    closeModal(); render(); markDirty();\n  });\n}\n\nfunction openImplementationForm(implementationId = null, preselectedIdeaId = null) {\n  const implementation = implementationId ? byId(state.implementations, implementationId) : null;\n  modalForm(implementation ? 'Edit implementation' : 'Add implementation', `\n    <div class=\"form-grid\">\n      <label class=\"field full\"><span>Succinct title</span><input name=\"title\" value=\"${escapeHtml(implementation?.title || '')}\" required autofocus /></label>\n      <label class=\"field full\"><span>Details / notes</span>${richEditor(detailsText(implementation), 'Describe this implementation\u2026')}</label>\n      <label class=\"field full\"><span>Themes</span>${checkboxGrid('themeIds', state.themes, implementation?.themeIds || [state.activeThemeId], (item) => item.name)}</label>\n      <label class=\"field full\"><span>Ideas</span>${checkboxGrid('ideaIds', state.ideas, implementation?.ideaIds || (preselectedIdeaId ? [preselectedIdeaId] : []), (item) => item.title)}</label>\n      <label class=\"field full\"><span>Implementation groups</span>${checkboxGrid('groupIds', state.implementationGroups, implementation?.groupIds || [])}</label>\n    </div>\n  `, async (form) => {\n    const formData = new FormData(form);\n    const title = String(formData.get('title') || '').trim();\n    const ideaIds = formData.getAll('ideaIds').map(String);\n    const themeIds = formData.getAll('themeIds').map(String);\n    if (!title) throw new Error('A title is required.');\n    if (!ideaIds.length) throw new Error('An implementation must link to at least one idea.');\n    if (!themeIds.length) throw new Error('Choose at least one theme.');\n    const payload = {\n      id: implementation?.id || id(), title, detailsMarkdown: getRichValue(), ideaIds, themeIds,\n      groupIds: formData.getAll('groupIds').map(String), sortOrder: implementation?.sortOrder ?? state.implementations.length,\n      attachments: implementation?.attachments || [],\n    };\n    if (implementation) Object.assign(implementation, payload);\n    else {\n      state.implementations.push(payload);\n      recordPersistedEvent('implementation_created', { idea_count: ideaIds.length, theme_count: themeIds.length, group_count: payload.groupIds.length });\n    }\n    currentInspectorId = payload.id;\n    closeModal(); render(); markDirty();\n  });\n}\n\nfunction openConflictForm(conflictId = null, overridesConflictId = null, preselectedImplementationId = null, returnToRelationshipsId = null) {\n  const conflict = conflictId ? byId(state.conflicts, conflictId) : null;\n  const base = overridesConflictId ? byId(state.conflicts, overridesConflictId) : null;\n  const selectedIds = conflict?.implementationIds || base?.implementationIds || (preselectedImplementationId ? [preselectedImplementationId] : []);\n  const selectedScope = conflict ? (conflict.themeId ?? 'global') : state.activeThemeId;\n  modalForm(conflict ? 'Edit conflict' : overridesConflictId ? 'Override inherited conflict' : 'Add conflict', `\n    <div class=\"form-grid\">\n      <label class=\"field full\"><span>Name</span><input name=\"name\" value=\"${escapeHtml(conflict?.name || base?.name || '')}\" required autofocus /></label>\n      <label class=\"field\"><span>Scope</span><select name=\"themeId\"><option value=\"global\" ${selectedScope === 'global' ? 'selected' : ''}>Global</option>${state.themes.map((theme) => `<option value=\"${theme.id}\" ${selectedScope === theme.id ? 'selected' : ''}>${escapeHtml(theme.name)}</option>`).join('')}</select></label>\n      <div></div>\n      <label class=\"field full\"><span>Members \u2014 the conflict activates only when every selected member is locked</span>${checkboxGrid('implementationIds', state.implementations, selectedIds, (item) => item.title)}</label>\n      <label class=\"field full\"><span>Explanation</span>${richEditor(detailsText(conflict) || detailsText(base), 'Why is the complete combination invalid?')}</label>\n    </div>\n  `, async (form) => {\n    const formData = new FormData(form);\n    const name = String(formData.get('name') || '').trim();\n    const implementationIds = formData.getAll('implementationIds').map(String);\n    if (!name) throw new Error('A conflict name is required.');\n    if (implementationIds.length < 2) throw new Error('A conflict needs at least two implementations.');\n    const rawThemeId = String(formData.get('themeId'));\n    const payload = {\n      id: conflict?.id || id(), name, detailsMarkdown: getRichValue(), themeId: rawThemeId === 'global' ? null : rawThemeId,\n      implementationIds, overridesConflictId: conflict?.overridesConflictId || overridesConflictId || null,\n    };\n    if (conflict) Object.assign(conflict, payload);\n    else {\n      state.conflicts.push(payload);\n      recordPersistedEvent('conflict_created', { member_count: implementationIds.length, scope: payload.themeId ? 'theme' : 'global', is_override: Boolean(payload.overridesConflictId) });\n    }\n    closeModal(); render(); markDirty();\n    if (returnToRelationshipsId) openImplementationRelationships(returnToRelationshipsId);\n  });\n}\n\nfunction descendantsOf(themeId) {\n  const result = [];\n  const walk = (parentId) => {\n    for (const theme of state.themes.filter((item) => item.parentId === parentId)) { result.push(theme.id); walk(theme.id); }\n  };\n  walk(themeId);\n  return result;\n}\n\nfunction openThemeForm(themeId = null, returnToStructure = true) {\n  const theme = themeId ? byId(state.themes, themeId) : null;\n  const excluded = theme ? [theme.id, ...descendantsOf(theme.id)] : [];\n  modalForm(theme ? 'Edit theme' : 'Add theme', `\n    <div class=\"form-grid\"><label class=\"field full\"><span>Name</span><input name=\"name\" value=\"${escapeHtml(theme?.name || '')}\" required autofocus /></label>\n    <label class=\"field full\"><span>Parent theme</span><select name=\"parentId\"><option value=\"\">No parent</option>${themeOptions(theme?.parentId || '', excluded)}</select></label></div>\n  `, async (form) => {\n    const data = new FormData(form);\n    const name = String(data.get('name') || '').trim();\n    if (!name) throw new Error('A name is required.');\n    if (theme) { theme.name = name; theme.parentId = String(data.get('parentId') || '') || null; }\n    else {\n      const newTheme = { id: id(), name, parentId: String(data.get('parentId') || '') || null, hiddenInheritedImplementationIds: [], hiddenInheritedConflictIds: [] };\n      state.themes.push(newTheme); state.uiByTheme[newTheme.id] = defaultView(); state.activeThemeId = newTheme.id;\n    }\n    closeModal(); render(); markDirty();\n    if (returnToStructure) openStructureManager(); else showToast(theme ? 'Theme updated.' : 'Theme created and selected.');\n  });\n}\n\nfunction openGroupForm(kind, groupId = null) {\n  const list = kind === 'idea' ? state.ideaGroups : state.implementationGroups;\n  const group = groupId ? byId(list, groupId) : null;\n  modalForm(`${group ? 'Edit' : 'Add'} ${kind === 'idea' ? 'idea' : 'implementation'} group`, `\n    <div class=\"form-grid\">\n      <label class=\"field full\"><span>Name <small>(optional)</small></span><input name=\"name\" value=\"${escapeHtml(group?.name || '')}\" autofocus /></label>\n      <label class=\"field\"><span>Color <small>(optional #RRGGBB)</small></span><input name=\"color\" type=\"text\" placeholder=\"#c7d7ff\" value=\"${escapeHtml(group?.color || '')}\" /></label><div></div>\n      <label class=\"field full\"><span>Description <small>(optional)</small></span><textarea name=\"description\" rows=\"3\">${escapeHtml(group?.description || '')}</textarea></label>\n    </div>\n  `, async (form) => {\n    const data = new FormData(form);\n    const name = String(data.get('name') || '').trim();\n    const color = String(data.get('color') || '').trim();\n    if (color && !/^#[0-9a-fA-F]{6}$/.test(color)) throw new Error('Use a six-digit hex color such as #c7d7ff, or leave it blank.');\n    const payload = { id: group?.id || id(), name, color, description: String(data.get('description') || '').trim() };\n    if (group) Object.assign(group, payload); else list.push(payload);\n    closeModal(); render(); markDirty(); openStructureManager();\n  });\n}\n\nfunction openGroupLinkForm(linkId = null) {\n  const link = linkId ? byId(state.groupLinks, linkId) : null;\n  modalForm(link ? 'Edit group connection' : 'Add group connection', `\n    <div class=\"form-grid\"><label class=\"field\"><span>Idea group</span><select name=\"ideaGroupId\">${state.ideaGroups.map((group) => `<option value=\"${group.id}\" ${link?.ideaGroupId === group.id ? 'selected' : ''}>${escapeHtml(group.name || 'Untitled group')}</option>`).join('')}</select></label>\n    <label class=\"field\"><span>Implementation group</span><select name=\"implementationGroupId\">${state.implementationGroups.map((group) => `<option value=\"${group.id}\" ${link?.implementationGroupId === group.id ? 'selected' : ''}>${escapeHtml(group.name || 'Untitled group')}</option>`).join('')}</select></label>\n    <label class=\"field full\"><span>Description <small>(semantic relationship only; it does not expand into individual links)</small></span><textarea name=\"description\" rows=\"3\">${escapeHtml(link?.description || '')}</textarea></label></div>\n  `, async (form) => {\n    const data = new FormData(form);\n    if (!state.ideaGroups.length || !state.implementationGroups.length) throw new Error('Create both kinds of groups first.');\n    const payload = { id: link?.id || id(), ideaGroupId: String(data.get('ideaGroupId')), implementationGroupId: String(data.get('implementationGroupId')), description: String(data.get('description') || '').trim() };\n    if (link) Object.assign(link, payload); else state.groupLinks.push(payload);\n    closeModal(); render(); markDirty(); openStructureManager();\n  });\n}\n\nfunction openStructureManager() {\n  const row = (label, actions) => `<div class=\"manager-row\"><div>${label}</div><div class=\"manager-row-actions\">${actions}</div></div>`;\n  modalManager('Structure', `\n    <section class=\"manager-section\"><div class=\"manager-heading\"><h3>Themes</h3><button class=\"button secondary compact\" data-action=\"add-theme\">+ Theme</button></div>\n      <div class=\"manager-list\">${state.themes.map((theme) => row(`<strong>${escapeHtml(theme.name)}</strong>${theme.parentId ? `<div class=\"tiny muted\">Child of ${escapeHtml(themeName(theme.parentId))}</div>` : ''}`, `<button class=\"button ghost\" data-action=\"edit-theme\" data-id=\"${theme.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-theme\" data-id=\"${theme.id}\">Delete</button>`)).join('')}</div></section>\n    <section class=\"manager-section\"><div class=\"manager-heading\"><h3>Idea groups</h3><button class=\"button secondary compact\" data-action=\"add-group\" data-kind=\"idea\">+ Group</button></div>\n      <div class=\"manager-list\">${state.ideaGroups.length ? state.ideaGroups.map((group) => row(`<span class=\"color-dot\" style=\"background:${group.color || '#d5dbe5'}\"></span><strong>${escapeHtml(group.name || 'Untitled group')}</strong>${group.description ? `<div class=\"tiny muted\">${escapeHtml(group.description)}</div>` : ''}`, `<button class=\"button ghost\" data-action=\"edit-group\" data-kind=\"idea\" data-id=\"${group.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-group\" data-kind=\"idea\" data-id=\"${group.id}\">Delete</button>`)).join('') : '<p class=\"muted\">No idea groups yet.</p>'}</div></section>\n    <section class=\"manager-section\"><div class=\"manager-heading\"><h3>Implementation groups</h3><button class=\"button secondary compact\" data-action=\"add-group\" data-kind=\"implementation\">+ Group</button></div>\n      <div class=\"manager-list\">${state.implementationGroups.length ? state.implementationGroups.map((group) => row(`<span class=\"color-dot\" style=\"background:${group.color || '#d5dbe5'}\"></span><strong>${escapeHtml(group.name || 'Untitled group')}</strong>${group.description ? `<div class=\"tiny muted\">${escapeHtml(group.description)}</div>` : ''}`, `<button class=\"button ghost\" data-action=\"edit-group\" data-kind=\"implementation\" data-id=\"${group.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-group\" data-kind=\"implementation\" data-id=\"${group.id}\">Delete</button>`)).join('') : '<p class=\"muted\">No implementation groups yet.</p>'}</div></section>\n    <section class=\"manager-section\"><div class=\"manager-heading\"><h3>Hidden inherited implementations in ${escapeHtml(activeTheme().name)}</h3></div>\n      <div class=\"manager-list\">${(activeTheme().hiddenInheritedImplementationIds || []).map((implementationId) => byId(state.implementations, implementationId)).filter(Boolean).map((implementation) => row(`<strong>${escapeHtml(implementation.title)}</strong>`, `<button class=\"button secondary\" data-action=\"unhide-inherited\" data-id=\"${implementation.id}\">Restore</button>`)).join('') || '<p class=\"muted\">Nothing hidden.</p>'}</div></section>\n    <section class=\"manager-section\"><div class=\"manager-heading\"><h3>Group-to-group connections</h3><button class=\"button secondary compact\" data-action=\"add-group-link\">+ Connection</button></div>\n      <p class=\"callout\">These are persistent semantic relationships. They never expand into every possible idea-to-implementation link.</p>\n      <div class=\"manager-list\">${state.groupLinks.length ? state.groupLinks.map((link) => {\n        const ideaGroup = byId(state.ideaGroups, link.ideaGroupId); const implGroup = byId(state.implementationGroups, link.implementationGroupId);\n        return row(`<strong>${escapeHtml(ideaGroup ? (ideaGroup.name || 'Untitled group') : 'Missing group')} \u2194 ${escapeHtml(implGroup ? (implGroup.name || 'Untitled group') : 'Missing group')}</strong>${link.description ? `<div class=\"tiny muted\">${escapeHtml(link.description)}</div>` : ''}`, `<button class=\"button ghost\" data-action=\"edit-group-link\" data-id=\"${link.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-group-link\" data-id=\"${link.id}\">Delete</button>`);\n      }).join('') : '<p class=\"muted\">No semantic group connections yet.</p>'}</div></section>\n  `);\n}\n\nfunction openConflictManager() {\n  const effectiveIds = new Set(conflictsForTheme().map((item) => item.id));\n  const rows = state.conflicts.filter((conflict) => effectiveIds.has(conflict.id)).map((conflict) => {\n    const local = conflict.themeId === state.activeThemeId;\n    const inherited = !local;\n    return `<div class=\"manager-row\"><div><strong>${escapeHtml(conflict.name)}</strong><div class=\"tiny muted\">${conflict.implementationIds.length} members \u00B7 ${conflict.themeId === null ? 'Global' : escapeHtml(themeName(conflict.themeId))}${conflict.overridesConflictId ? ' \u00B7 Override' : ''}</div>${detailsText(conflict) ? `<div class=\"tiny\">${escapeHtml(detailsText(conflict).slice(0, 150))}</div>` : ''}</div>\n      <div class=\"manager-row-actions\">${local ? `<button class=\"button ghost\" data-action=\"edit-conflict\" data-id=\"${conflict.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-conflict\" data-id=\"${conflict.id}\">Delete</button>` : `<button class=\"button ghost\" data-action=\"override-conflict\" data-id=\"${conflict.id}\">Override</button><button class=\"button ghost\" data-action=\"hide-conflict\" data-id=\"${conflict.id}\">Hide here</button>`}</div></div>`;\n  }).join('');\n  const chain = themeChain(state.themes, state.activeThemeId);\n  const hiddenRows = (activeTheme().hiddenInheritedConflictIds || [])\n    .map((conflictId) => byId(state.conflicts, conflictId))\n    .filter((conflict) => conflict && (conflict.themeId === null || chain.includes(conflict.themeId)))\n    .map((conflict) => `<div class=\"manager-row\"><div><strong>${escapeHtml(conflict.name)}</strong><div class=\"tiny muted\">Hidden inherited conflict</div></div><div class=\"manager-row-actions\"><button class=\"button secondary\" data-action=\"unhide-conflict\" data-id=\"${conflict.id}\">Restore</button></div></div>`).join('');\n  modalManager(`Conflicts in ${activeTheme().name}`, `<div class=\"manager-heading\"><p class=\"callout\">A conflict set becomes invalid only when every member is locked. Subsets remain valid.</p><button class=\"button primary\" data-action=\"add-conflict\">+ Conflict</button></div><div class=\"manager-list\">${rows || '<p class=\"muted\">No conflicts apply to this theme.</p>'}</div>${hiddenRows ? `<section class=\"manager-section\"><h3>Hidden inherited conflicts</h3><div class=\"manager-list\">${hiddenRows}</div></section>` : ''}`);\n}\n\nfunction openRequirementForm(requirementId = null, preselectedFromImplementationId = null, returnToRelationshipsId = null) {\n  const requirement = requirementId ? byId(requirements(), requirementId) : null;\n  if (state.implementations.length < 2) { showToast('Create at least two implementations first.'); return; }\n  modalForm(requirement ? 'Edit requirement' : 'Add requirement', `\n    <div class=\"form-grid\"><label class=\"field full\"><span>When this implementation is locked\u2026</span><select name=\"fromImplementationId\">${state.implementations.map((implementation) => `<option value=\"${implementation.id}\" ${requirement?.fromImplementationId === implementation.id ? 'selected' : ''}>${escapeHtml(implementation.title)}</option>`).join('')}</select></label>\n    <label class=\"field full\"><span>\u2026this implementation must also be locked</span><select name=\"toImplementationId\">${state.implementations.map((implementation) => `<option value=\"${implementation.id}\" ${requirement?.toImplementationId === implementation.id ? 'selected' : ''}>${escapeHtml(implementation.title)}</option>`).join('')}</select></label>\n    <p class=\"callout full\">Requirements are directional. Add both directions for a bidirectional requirement; cycles and multistep chains are supported.</p></div>\n  `, async (form) => {\n    const data = new FormData(form);\n    const fromImplementationId = String(data.get('fromImplementationId'));\n    const toImplementationId = String(data.get('toImplementationId'));\n    if (fromImplementationId === toImplementationId) throw new Error('Choose two different implementations.');\n    if (requirements().some((item) => item.id !== requirement?.id && item.fromImplementationId === fromImplementationId && item.toImplementationId === toImplementationId)) throw new Error('That directional requirement already exists.');\n    const payload = { id: requirement?.id || id(), fromImplementationId, toImplementationId };\n    if (requirement) Object.assign(requirement, payload);\n    else {\n      requirements().push(payload);\n      recordPersistedEvent('requirements_created', { requirement_count: 1, source: 'form' });\n    }\n    closeModal(); render(); markDirty();\n    if (returnToRelationshipsId) openImplementationRelationships(returnToRelationshipsId); else openRequirementsManager();\n  });\n  if (!requirement && preselectedFromImplementationId) modalBody.querySelector('[name=\"fromImplementationId\"]').value = preselectedFromImplementationId;\n}\n\nfunction openRequirementsManager() {\n  const rows = requirements().map((requirement) => {\n    const from = byId(state.implementations, requirement.fromImplementationId);\n    const to = byId(state.implementations, requirement.toImplementationId);\n    return `<div class=\"manager-row\"><div><strong>${escapeHtml(from?.title || 'Missing implementation')} \u2192 ${escapeHtml(to?.title || 'Missing implementation')}</strong><div class=\"tiny muted\">Locking the first automatically locks the second.</div></div><div class=\"manager-row-actions\"><button class=\"button ghost\" data-action=\"edit-requirement\" data-id=\"${requirement.id}\">Edit</button><button class=\"button danger\" data-action=\"delete-requirement\" data-id=\"${requirement.id}\">Delete</button></div></div>`;\n  }).join('');\n  modalManager('Requirements', `<div class=\"manager-heading\"><p class=\"callout\">A \u2192 B means choosing A also chooses B. Add reverse edges for bidirectional requirements; cycles and chains are valid.</p><button class=\"button primary\" data-action=\"add-requirement\">+ Requirement</button></div><div class=\"manager-list\">${rows || '<p class=\"muted\">No requirements yet.</p>'}</div>`);\n}\n\nfunction openImplementationRelationships(implementationId) {\n  const implementation = byId(state.implementations, implementationId);\n  if (!implementation) return;\n  const effectiveItem = implementationsForTheme().find((item) => item.id === implementationId);\n  const conflicts = state.conflicts.filter((item) => item.implementationIds.includes(implementationId));\n  const outgoing = requirements().filter((item) => item.fromImplementationId === implementationId);\n  const incoming = requirements().filter((item) => item.toImplementationId === implementationId);\n  const themeOrigins = (effectiveItem?.originThemeIds || implementation.themeIds).map((themeId) => `${escapeHtml(themeName(themeId))}${themeId === state.activeThemeId ? ' (direct)' : ' (inherited)'}`).join(', ');\n  const ideaNames = implementation.ideaIds.map((ideaId) => byId(state.ideas, ideaId)?.title).filter(Boolean);\n  const groupNames = implementation.groupIds.map((groupId) => byId(state.implementationGroups, groupId)?.name || 'Untitled group');\n  const requirementRow = (item, direction) => `<div class=\"manager-row\"><div><strong>${escapeHtml(direction === 'out' ? 'Requires' : 'Required by')} ${escapeHtml(byId(state.implementations, direction === 'out' ? item.toImplementationId : item.fromImplementationId)?.title || 'Missing implementation')}</strong></div><button class=\"button ghost\" data-action=\"edit-relationship-requirement\" data-id=\"${item.id}\" data-return-id=\"${implementationId}\">Edit</button></div>`;\n  modalManager(`Relationships: ${implementation.title}`, `<section class=\"manager-section\"><div class=\"manager-heading\"><h3>Implementation</h3><button class=\"button ghost compact\" data-action=\"open-implementation-form\" data-id=\"${implementationId}\">Edit details</button></div><div class=\"inspector-list\"><div class=\"inspector-item\"><span>Ideas</span><span>${escapeHtml(ideaNames.join(', ') || 'None')}</span></div><div class=\"inspector-item\"><span>Theme origin</span><span>${themeOrigins || 'None'}</span></div><div class=\"inspector-item\"><span>Groups</span><span>${escapeHtml(groupNames.join(', ') || 'None')}</span></div></div>${detailsText(implementation) ? `<div class=\"impl-details\">${markdownToSafeHtml(detailsText(implementation))}</div>` : ''}</section><section class=\"manager-section\"><div class=\"manager-heading\"><h3>Conflicts</h3><button class=\"button secondary compact\" data-action=\"add-conflict-for-implementation\" data-id=\"${implementationId}\">+ Conflict</button></div><div class=\"manager-list\">${conflicts.map((item) => `<div class=\"manager-row\"><div><strong>${escapeHtml(item.name)}</strong><div class=\"tiny muted\">${item.implementationIds.length} members</div></div><button class=\"button ghost\" data-action=\"edit-relationship-conflict\" data-id=\"${item.id}\" data-return-id=\"${implementationId}\">Edit</button></div>`).join('') || '<p class=\"muted\">No conflicts.</p>'}</div></section><section class=\"manager-section\"><div class=\"manager-heading\"><h3>Requirements</h3><button class=\"button secondary compact\" data-action=\"add-requirement-for-implementation\" data-id=\"${implementationId}\">+ Requirement</button></div><div class=\"manager-list\">${outgoing.map((item) => requirementRow(item, 'out')).join('') || ''}${incoming.map((item) => requirementRow(item, 'in')).join('') || ''}${!outgoing.length && !incoming.length ? '<p class=\"muted\">No requirements.</p>' : ''}</div></section><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"close-modal\">Close</button></div>`);\n}\n\nfunction relationshipPicker(preselectedIds, pickedIds, showAll, query, actionPrefix) {\n  const preselected = new Set(preselectedIds); const picked = new Set(pickedIds);\n  const top = state.implementations.filter((item) => preselected.has(item.id));\n  const additional = state.implementations.filter((item) => !preselected.has(item.id) && fuzzyMatches(item.title, query));\n  const option = (item) => `<button class=\"relationship-option ${picked.has(item.id) ? 'selected' : ''}\" data-action=\"${actionPrefix}-toggle\" data-id=\"${item.id}\">${escapeHtml(item.title)}</button>`;\n  if (!top.length) return `<div class=\"relationship-picker\"><input class=\"relationship-search\" data-relationship-search=\"${actionPrefix}\" placeholder=\"Search implementations\" value=\"${escapeHtml(query)}\" autofocus /><div class=\"relationship-options\">${additional.map(option).join('') || '<span class=\"muted tiny\">No matching implementations.</span>'}</div></div>`;\n  return `<div class=\"relationship-picker\"><div class=\"relationship-selected\">${top.map(option).join('') || '<span class=\"muted tiny\">No preselected implementations.</span>'}</div><button class=\"relationship-more\" data-action=\"${actionPrefix}-more\">Show other implementations <span>\u25BE</span></button>${showAll ? `<input class=\"relationship-search\" data-relationship-search=\"${actionPrefix}\" placeholder=\"Search implementations\u2026\" value=\"${escapeHtml(query)}\" autofocus /><div class=\"relationship-options\">${additional.map(option).join('') || '<span class=\"muted tiny\">No matching implementations.</span>'}</div>` : ''}</div>`;\n}\n\nfunction openRelationshipFlow(allowEmpty = false) {\n  const selected = view().selectedImplementationIds.filter((id) => byId(state.implementations, id));\n  if (selected.length < 2 && !allowEmpty) { showToast('Select at least two implementations first.'); return; }\n  relationshipDraft = { preselected: selected, picked: [], conflictMembers: [], showAll: allowEmpty, query: '', conflictMenuOpen: false, screen: 'flow' };\n  renderRelationshipFlow();\n}\n\nfunction renderRelationshipFlow() {\n  if (!relationshipDraft) return;\n  relationshipDraft.screen = 'flow';\n  modalManager('Conflict / requirement', `<div class=\"relationship-entry\"><div class=\"split-button\"><button class=\"button danger wide\" data-action=\"open-conflict-builder\">Mark conflict</button><button class=\"button danger split-chevron\" data-action=\"toggle-conflict-menu\" aria-label=\"Conflict options\">\u25BE</button><div class=\"split-menu\" ${relationshipDraft.conflictMenuOpen ? '' : 'hidden'}><button data-action=\"mark-preselected-conflict\" data-conflict-mode=\"all\">All preselected</button><button data-action=\"mark-preselected-conflict\" data-conflict-mode=\"any\">Any preselected pair</button></div></div><button class=\"button primary wide\" data-action=\"open-requirement-builder\">Build requirement</button></div>`);\n}\n\nfunction openConflictBuilder() {\n  if (!relationshipDraft) return;\n  relationshipDraft.screen = 'conflict';\n  relationshipDraft.picked = [];\n  relationshipDraft.conflictMembers = [];\n  relationshipDraft.conflictMenuOpen = false;\n  renderConflictBuilder();\n}\n\nfunction renderConflictBuilder() {\n  if (!relationshipDraft) return;\n  relationshipDraft.screen = 'conflict';\n  const picked = relationshipDraft.picked;\n  const members = relationshipDraft.conflictMembers;\n  const memberChips = members.map((itemId) => `<span class=\"relationship-chip\">${escapeHtml(byId(state.implementations, itemId)?.title || 'Missing')}<button class=\"remove-chip\" data-action=\"remove-conflict-member\" data-id=\"${itemId}\" title=\"Remove\">\u00D7</button></span>`).join('') || '<span class=\"muted tiny\">Select implementations above, then add them to this conflict.</span>';\n  modalManager('Mark conflict', `<p class=\"muted\">Nothing is selected yet. Your original selection is shown above the divider; select the implementations to add.</p>${relationshipPicker(relationshipDraft.preselected, picked, relationshipDraft.showAll, relationshipDraft.query, 'relationship')}<div class=\"relationship-add-row\"><button class=\"button secondary compact\" data-action=\"add-conflict-members\" ${picked.length ? '' : 'disabled'}>Add to conflict</button></div><div class=\"conflict-members\">${memberChips}</div><div class=\"relationship-actions\"><div class=\"split-button\"><button class=\"button danger\" data-action=\"mark-selected-conflict\" data-conflict-mode=\"all\" ${members.length < 2 ? 'disabled' : ''}>Mark conflict</button><button class=\"button danger split-chevron\" data-action=\"toggle-conflict-menu\" aria-label=\"Conflict options\">\u25BE</button><div class=\"split-menu\" ${relationshipDraft.conflictMenuOpen ? '' : 'hidden'}><button data-action=\"mark-selected-conflict\" data-conflict-mode=\"all\">All</button><button data-action=\"mark-selected-conflict\" data-conflict-mode=\"any\">Any</button><button data-action=\"open-more-conflict\">More\u2026</button></div></div></div><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"relationship-back\">Back</button></div>`);\n}\n\nfunction openMoreConflict() {\n  if (!relationshipDraft?.conflictMembers?.length) return;\n  relationshipDraft.conflictMenuOpen = false;\n  openSelectedConflictDetails(relationshipDraft.conflictMembers, renderConflictBuilder);\n}\n\nfunction openSelectedConflictDetails(ids, returnTo = renderConflictBuilder) {\n  const titles = ids.map((itemId) => byId(state.implementations, itemId)?.title || 'Implementation');\n  modalCloseReturn = returnTo;\n  modalForm('Conflict details', `<div class=\"form-grid\"><label class=\"field full\"><span>Name <small>(optional)</small></span><input name=\"name\" value=\"${escapeHtml(titles.join(' + '))}\" /></label><label class=\"field full\"><span>Explanation <small>(optional)</small></span>${richEditor('', 'Why is this combination invalid?')}</label></div>`, async (form) => {\n    const data = new FormData(form); const name = String(data.get('name') || '').trim() || titles.join(' + ');\n    state.conflicts.push({ id: id(), name, detailsMarkdown: getRichValue(), themeId: state.activeThemeId, implementationIds: ids, overridesConflictId: null });\n    recordPersistedEvent('conflict_created', { member_count: ids.length, scope: 'theme', is_override: false });\n    relationshipDraft.conflictMembers = relationshipDraft.conflictMembers.filter((itemId) => !ids.includes(itemId));\n    modalCloseReturn = null; closeModal(); render(); markDirty();\n    if (returnTo) returnTo();\n  });\n}\n\nfunction markSelectedConflict(mode) {\n  if (!relationshipDraft?.conflictMembers?.length || relationshipDraft.conflictMembers.length < 2) return;\n  const selected = relationshipDraft.conflictMembers;\n  if (mode === 'any') {\n    for (const pair of allPairs(selected)) state.conflicts.push({ id: id(), name: pair.map((itemId) => byId(state.implementations, itemId)?.title || 'Implementation').join(' \u2194 '), detailsMarkdown: '', themeId: state.activeThemeId, implementationIds: pair, overridesConflictId: null });\n    recordPersistedEvent('conflict_created', { member_count: selected.length, scope: 'theme', is_override: false, conflict_mode: 'any_pair' });\n    relationshipDraft.conflictMembers = [];\n    closeModal(); render(); markDirty(); renderConflictBuilder();\n    return;\n  }\n  openSelectedConflictDetails(selected);\n}\n\nfunction openRequirementBuilder() {\n  if (!relationshipDraft) return;\n  relationshipDraft.conflictMenuOpen = false;\n  requirementBuilder = { preselected: [...relationshipDraft.preselected], picked: [], showAll: false, query: '', sides: [[], []] };\n  renderRequirementBuilder();\n}\n\nfunction renderRequirementBuilder() {\n  if (!requirementBuilder) return;\n  const picked = requirementBuilder.picked; const sides = requirementBuilder.sides;\n  const side = (items, index) => `<div class=\"requirement-box\">${items.map((id) => `<span class=\"relationship-chip\">${escapeHtml(byId(state.implementations, id)?.title || 'Missing')}<button class=\"remove-chip\" data-action=\"builder-remove-side\" data-side-index=\"${index}\" data-id=\"${id}\" title=\"Remove\">\u00D7</button></span>`).join('') || '<span class=\"muted\">No implementations</span>'}<button data-action=\"builder-add-side\" data-side-index=\"${index}\" ${picked.length ? '' : 'disabled'}>Add</button></div>`;\n  const valid = sides.slice(0, -1).every((items, index) => items.length && sides[index + 1].length);\n  modalManager('Build requirements', `<p class=\"muted\">Select implementations, then add them to a side. Each arrow makes every implementation on its left require every implementation on its right.</p>${relationshipPicker(requirementBuilder.preselected, picked, requirementBuilder.showAll, requirementBuilder.query, 'builder')}<div class=\"requirement-chain\">${sides.map((items, index) => `${index ? '<strong>\u21D2</strong>' : ''}${side(items, index)}`).join('')}<button class=\"button secondary compact chain-add\" data-action=\"builder-add-side-chain\" ${sides.length >= 4 ? 'disabled' : ''}>+</button></div><div class=\"form-actions\"><button class=\"button ghost\" data-action=\"relationship-back\">Back</button><button class=\"button primary\" data-action=\"open-requirement-details\" ${valid ? '' : 'disabled'}>Save requirements</button></div>`);\n}\n\nfunction openRequirementDetails() {\n  modalCloseReturn = renderRequirementBuilder;\n  modalForm('Requirement details', `<div class=\"form-grid\"><label class=\"field full\"><span>Name <small>(optional)</small></span><input name=\"name\" /></label><label class=\"field full\"><span>Explanation <small>(optional)</small></span>${richEditor('', 'Why is this requirement needed?')}</label></div>`, async (form) => {\n    saveRequirementBuilder({ name: String(new FormData(form).get('name') || '').trim(), detailsMarkdown: getRichValue() });\n  });\n}\n\nfunction saveRequirementBuilder(details = {}) {\n  const chains = requirementBuilder?.sides?.slice(0, -1).map((from, index) => ({ from, to: requirementBuilder.sides[index + 1] })) || [];\n  const edges = requirementEdges(validRequirementChains(chains));\n  if (!edges.length) { showToast('Add at least one implementation on both sides of a requirement.'); return; }\n  const existing = new Set(requirements().map((item) => `${item.fromImplementationId}:${item.toImplementationId}`));\n  let createdCount = 0;\n  for (const edge of edges) {\n    if (existing.has(`${edge.fromImplementationId}:${edge.toImplementationId}`)) continue;\n    requirements().push({ id: id(), ...edge, ...details });\n    createdCount += 1;\n  }\n  if (createdCount) recordPersistedEvent('requirements_created', { requirement_count: createdCount, source: 'builder' });\n  const preselected = [...requirementBuilder.preselected];\n  requirementBuilder = { preselected, picked: [], showAll: false, query: '', sides: [[], []] };\n  modalCloseReturn = null; closeModal(); render(); markDirty(); renderRequirementBuilder();\n}\n\nfunction captureRichView() {\n  return structuredClone(view());\n}\n\nfunction openSaveViewForm() {\n  modalForm('Save current selection or view', `\n    <div class=\"form-grid\"><label class=\"field full\"><span>Name</span><input name=\"name\" required autofocus placeholder=\"Exploration A\" /></label>\n    <label class=\"field full\"><span>Save type</span><select name=\"kind\"><option value=\"rich\" selected>Rich view \u2014 locks, visibility, expansion, filters</option><option value=\"simple\">Simple selection \u2014 locked implementations only</option></select></label></div>\n  `, async (form) => {\n    const data = new FormData(form);\n    const name = String(data.get('name') || '').trim();\n    const kind = String(data.get('kind'));\n    if (!name) throw new Error('A name is required.');\n    state.savedViews.push({ id: id(), name, kind, themeId: state.activeThemeId, lockedImplementationIds: [...view().lockedImplementationIds], richView: kind === 'rich' ? captureRichView() : null, createdAt: new Date().toISOString() });\n    recordPersistedEvent('saved_view_created', { view_kind: kind, locked_implementation_count: view().lockedImplementationIds.length });\n    closeModal(); markDirty(); openSavesManager();\n  });\n}\n\nfunction openSavesManager() {\n  modalManager('Saved selections and views', `<div class=\"manager-heading\"><p class=\"callout\">Rich is the default. Simple saves only the lock set for future lightweight use.</p><button class=\"button primary\" data-action=\"save-current-view\">+ Save current</button></div>\n    <div class=\"manager-list\">${state.savedViews.length ? state.savedViews.map((saved) => `<div class=\"manager-row\"><div><strong>${escapeHtml(saved.name)}</strong><div class=\"tiny muted\">${saved.kind === 'rich' ? 'Rich view' : 'Simple selection'} \u00B7 ${escapeHtml(themeName(saved.themeId))} \u00B7 ${saved.lockedImplementationIds.length} locked</div></div><div class=\"manager-row-actions\"><button class=\"button secondary\" data-action=\"load-view\" data-id=\"${saved.id}\">Load</button><button class=\"button danger\" data-action=\"delete-view\" data-id=\"${saved.id}\">Delete</button></div></div>`).join('') : '<p class=\"muted\">No saved views yet.</p>'}</div>`);\n}\n\nfunction openCompareViews() {\n  const options = state.savedViews.map((saved) => `<option value=\"${saved.id}\">${escapeHtml(saved.name)}</option>`).join('');\n  modalForm('Compare saved views', `<div class=\"form-grid\"><label class=\"field\"><span>Earlier view</span><select name=\"left\">${options}</select></label><label class=\"field\"><span>Later view</span><select name=\"right\">${options}</select></label></div>`, async (form) => {\n    const data = new FormData(form);\n    const left = byId(state.savedViews, String(data.get('left')));\n    const right = byId(state.savedViews, String(data.get('right')));\n    if (!left || !right || left.id === right.id) throw new Error('Choose two different views.');\n    const additions = right.lockedImplementationIds.filter((itemId) => !left.lockedImplementationIds.includes(itemId));\n    const removals = left.lockedImplementationIds.filter((itemId) => !right.lockedImplementationIds.includes(itemId));\n    const titleList = (ids) => ids.map((itemId) => byId(state.implementations, itemId)?.title || 'Missing implementation');\n    const completed = state.conflicts.filter((conflict) => conflict.implementationIds.every((itemId) => right.lockedImplementationIds.includes(itemId)) && !conflict.implementationIds.every((itemId) => left.lockedImplementationIds.includes(itemId)));\n    modalManager(`${left.name} to ${right.name}`, `<div class=\"comparison-grid\"><section><h3>Added (${additions.length})</h3>${titleList(additions).map((title) => `<p>${escapeHtml(title)}</p>`).join('') || '<p class=\"muted\">Nothing added.</p>'}</section><section><h3>Removed (${removals.length})</h3>${titleList(removals).map((title) => `<p>${escapeHtml(title)}</p>`).join('') || '<p class=\"muted\">Nothing removed.</p>'}</section></div><section><h3>Newly completed conflicts (${completed.length})</h3>${completed.map((conflict) => `<p>${escapeHtml(conflict.name)}</p>`).join('') || '<p class=\"muted\">None.</p>'}</section><button class=\"button ghost\" data-action=\"manage-saves\">Back</button>`);\n  }, 'Compare');\n}\n\nfunction deleteIdea(ideaId) {\n  const idea = byId(state.ideas, ideaId);\n  if (!idea || !confirm(`Delete \u201C${idea.title}\u201D? Implementations linked only to this idea will also be deleted.`)) return;\n  const orphanIds = state.implementations.filter((implementation) => implementation.ideaIds.length === 1 && implementation.ideaIds[0] === ideaId).map((item) => item.id);\n  state.ideas = state.ideas.filter((item) => item.id !== ideaId);\n  state.implementations.forEach((implementation) => { implementation.ideaIds = implementation.ideaIds.filter((id) => id !== ideaId); });\n  for (const orphanId of orphanIds) removeImplementation(orphanId, false);\n  closeModal(); render(); markDirty();\n}\n\nasync function deleteImplementationAttachments(implementation) {\n  const attachments = implementation?.attachments || [];\n  await Promise.allSettled(attachments.map((attachment) => {\n    const storage = attachment.storageName || attachment.id;\n    if (!storage) return Promise.resolve();\n    const path = storageMode === 'cloud'\n      ? `/api/projects/${encodeURIComponent(currentProjectId)}/attachments/${encodeURIComponent(storage)}`\n      : `/api/attachments/${encodeURIComponent(storage)}`;\n    return api(path, { method: 'DELETE' });\n  }));\n}\n\nfunction removeImplementation(implementationId, ask = true) {\n  const implementation = byId(state.implementations, implementationId);\n  if (!implementation || (ask && !confirm(`Delete \u201C${implementation.title}\u201D everywhere?`))) return false;\n  void deleteImplementationAttachments(implementation);\n  state.implementations = state.implementations.filter((item) => item.id !== implementationId);\n  state.conflicts = state.conflicts.map((conflict) => ({ ...conflict, implementationIds: conflict.implementationIds.filter((id) => id !== implementationId) })).filter((conflict) => conflict.implementationIds.length >= 2);\n  state.requirements = requirements().filter((requirement) => requirement.fromImplementationId !== implementationId && requirement.toImplementationId !== implementationId);\n  state.savedViews.forEach((saved) => { saved.lockedImplementationIds = saved.lockedImplementationIds.filter((id) => id !== implementationId); if (saved.richView) saved.richView.lockedImplementationIds = saved.richView.lockedImplementationIds.filter((id) => id !== implementationId); });\n  Object.values(state.uiByTheme).forEach((item) => {\n    for (const key of ['lockedImplementationIds', 'manuallyLockedImplementationIds', 'selectedImplementationIds', 'visibleImplementationIds', 'previousVisibleImplementationIds', 'expandedImplementationIds', 'knownImplementationIds']) item[key] = (item[key] || []).filter((id) => id !== implementationId);\n  });\n  if (currentInspectorId === implementationId) currentInspectorId = null;\n  return true;\n}\n\nfunction deleteTheme(themeId) {\n  const theme = byId(state.themes, themeId);\n  if (!theme) return;\n  if (state.themes.length === 1) return showToast('At least one theme is required.');\n  if (state.themes.some((item) => item.parentId === themeId)) return showToast('Delete or reparent child themes first.');\n  if (!confirm(`Delete theme \u201C${theme.name}\u201D? Direct assignments in this theme will be removed.`)) return;\n  state.themes = state.themes.filter((item) => item.id !== themeId);\n  const orphanImplementationIds = [];\n  state.implementations.forEach((implementation) => {\n    implementation.themeIds = implementation.themeIds.filter((id) => id !== themeId);\n    if (!implementation.themeIds.length) orphanImplementationIds.push(implementation.id);\n  });\n  orphanImplementationIds.forEach((id) => removeImplementation(id, false));\n  state.conflicts = state.conflicts.filter((conflict) => conflict.themeId !== themeId);\n  delete state.uiByTheme[themeId];\n  if (state.activeThemeId === themeId) state.activeThemeId = state.themes[0].id;\n  render(); markDirty(); openStructureManager();\n}\n\nfunction deleteGroup(kind, groupId) {\n  const list = kind === 'idea' ? state.ideaGroups : state.implementationGroups;\n  const group = byId(list, groupId);\n  if (!group || !confirm(`Delete group \u201C${group.name}\u201D?`)) return;\n  if (kind === 'idea') {\n    state.ideaGroups = state.ideaGroups.filter((item) => item.id !== groupId);\n    state.ideas.forEach((idea) => { idea.groupIds = idea.groupIds.filter((id) => id !== groupId); });\n    state.groupLinks = state.groupLinks.filter((link) => link.ideaGroupId !== groupId);\n  } else {\n    state.implementationGroups = state.implementationGroups.filter((item) => item.id !== groupId);\n    state.implementations.forEach((implementation) => { implementation.groupIds = implementation.groupIds.filter((id) => id !== groupId); });\n    state.groupLinks = state.groupLinks.filter((link) => link.implementationGroupId !== groupId);\n  }\n  render(); markDirty(); openStructureManager();\n}\n\nfunction loadSavedView(savedId) {\n  const saved = byId(state.savedViews, savedId);\n  if (!saved) return;\n  state.activeThemeId = saved.themeId;\n  if (saved.kind === 'rich' && saved.richView) state.uiByTheme[saved.themeId] = structuredClone(saved.richView);\n  else view().lockedImplementationIds = normalizeLockedWithRequirements(conflictsForTheme(), requirements(), saved.lockedImplementationIds, implementationsForTheme().map((item) => item.id));\n  focusedConflictId = null; currentInspectorId = null;\n  closeModal(); render(); markDirty();\n}\n\nasync function uploadAttachment(input) {\n  const file = input.files?.[0];\n  const implementationId = input.dataset.implementationId;\n  if (!file || !implementationId) return;\n  const analyticsProperties = { storage_mode: storageMode, mime_type: file.type || 'application/octet-stream', size_bucket: file.size < 1024 * 1024 ? 'under_1mb' : file.size < 10 * 1024 * 1024 ? '1mb_to_10mb' : 'over_10mb' };\n  captureEvent('attachment_upload_attempted', analyticsProperties);\n  try {\n    setStatus('Uploading attachment\u2026');\n    const attachmentPath = storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/attachments` : '/api/attachments';\n    const attachment = await api(`${attachmentPath}?filename=${encodeURIComponent(file.name)}`, { method: 'POST', headers: { 'Content-Type': file.type || 'application/octet-stream' }, body: file });\n    const implementation = byId(state.implementations, implementationId);\n    implementation.attachments ||= [];\n    implementation.attachments.push(attachment);\n    recordPersistedEvent('attachment_uploaded', analyticsProperties, false);\n    render(); markDirty();\n  } catch (error) { showToast(error.message); }\n}\n\nasync function applyImportedArchive(imported, label) {\n  const candidate = validateProjectDocument(imported);\n  await checkpointBeforeImport(`Before importing ${label}`);\n  const archived = importedAttachments(imported);\n  const analyticsProperties = { import_format: label === 'project directory' ? 'directory' : 'archive', attachment_count: archived.length };\n  captureEvent('project_import_attempted', analyticsProperties);\n  const uploaded = [];\n  try {\n    for (const entry of archived) {\n      const file = new File([entry.blob], entry.name, { type: entry.mime || 'application/octet-stream' });\n      const attachmentPath = storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/attachments` : '/api/attachments';\n      const attachment = await api(`${attachmentPath}?filename=${encodeURIComponent(entry.name)}`, { method: 'POST', headers: { 'Content-Type': file.type }, body: file });\n      uploaded.push(attachment);\n      for (const implementation of candidate.implementations) {\n        implementation.attachments = (implementation.attachments || []).map((reference) => {\n          const referenceId = reference.id || reference.storageName;\n          return referenceId === entry.id ? attachment : reference;\n        });\n      }\n    }\n    state = candidate;\n    recordPersistedEvent('project_imported', analyticsProperties, false);\n    closeModal();\n    render();\n    markDirty();\n    showToast(`Imported ${label}.`);\n  } catch (error) {\n    await Promise.allSettled(uploaded.map((attachment) => api(storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/attachments/${encodeURIComponent(attachment.storageName)}` : `/api/attachments/${encodeURIComponent(attachment.storageName)}`, { method: 'DELETE' })));\n    throw error;\n  }\n}\n\nfunction restoreHistory(direction) {\n  const source = direction === 'undo' ? undoStack : redoStack;\n  const target = direction === 'undo' ? redoStack : undoStack;\n  const snapshot = source.pop();\n  if (!snapshot) return;\n  target.push(structuredClone(state));\n  state = validateProjectDocument(snapshot);\n  historyBaseline = JSON.stringify(state);\n  closeModal();\n  render();\n  markDirty(false);\n  showToast(direction === 'undo' ? 'Undid the last change.' : 'Redid the change.');\n}\n\nfunction handleAction(target) {\n  const action = target.dataset.action;\n  const itemId = target.dataset.id;\n  if (!action) return;\n  if (action === 'cycle-color-mode') { cycleColorMode(); return; }\n  if (action === 'undo') { restoreHistory('undo'); return; }\n  if (action === 'redo') { restoreHistory('redo'); return; }\n  if (action === 'continue-guest') { continueAsGuest(); return; }\n  if (action === 'sign-in') {\n    if (storageMode === 'guest' && state) saveGuestState(state);\n    if (!clerk) {\n      if (clerkStatus === 'error') {\n        authenticationError = '';\n        initializeClerk().then(() => handleAction(target)).catch((error) => showToast(`Sign-in is unavailable: ${error.message}`));\n        showToast('Retrying sign-in\u2026');\n        return;\n      }\n      showToast(authenticationError ? `Sign-in is unavailable: ${authenticationError}` : 'Sign-in is still loading. Please try again in a moment.');\n      return;\n    }\n    try {\n      // Redirecting does not require Clerk's optional in-page UI bundle. This\n      // also lets a brand-new production instance complete its first-user flow.\n      Promise.resolve(clerk.redirectToSignIn({ returnBackUrl: window.location.href }))\n        .catch((error) => showToast(`Sign-in is unavailable: ${error.message}`));\n      showToast('Redirecting to sign-in\u2026');\n    } catch (error) { showToast(`Sign-in is unavailable: ${error.message}`); }\n    return;\n  }\n  if (action === 'sync-guest') { moveGuestProjectToCloud(); return; }\n  if (action === 'retry-cloud-connection') { retryCloudConnection(); return; }\n  if (action === 'resolve-cloud-conflict') { openCloudConflictModal(); return; }\n  if (action === 'download-conflict-copy' && pendingSaveConflict) { downloadStateCopy(pendingSaveConflict.snapshot); return; }\n  if (action === 'use-server-copy' && pendingSaveConflict?.server) {\n    state = validateProjectDocument(pendingSaveConflict.server);\n    currentRevision = Number(pendingSaveConflict.error.payload?.revision || currentRevision);\n    lastSavedSnapshot = projectContentFingerprint(state);\n    pendingSaveConflict = null;\n    closeModal();\n    configureSaveCoordinator();\n    render();\n    return;\n  }\n  if (action === 'force-save-local' && pendingSaveConflict) {\n    const conflict = pendingSaveConflict;\n    api(storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/state` : '/api/state', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ state: conflict.snapshot, baseRevision: conflict.error.payload?.revision, force: true }) })\n      .then((saved) => {\n        pendingSaveConflict = null;\n        closeModal();\n        openWorkbench({ state: saved.state, path: projectPath, projectId: currentProjectId, revision: saved.revision });\n        showToast('Your local copy replaced the saved copy.');\n      })\n      .catch((error) => showToast(error.message));\n    return;\n  }\n  if (action === 'restore-draft' && pendingRecoveredDraft) {\n    state = validateProjectDocument(pendingRecoveredDraft);\n    pendingRecoveredDraft = null;\n    closeModal();\n    render();\n    markDirty();\n    return;\n  }\n  if (action === 'download-recovered-draft' && pendingRecoveredDraft) { downloadStateCopy(pendingRecoveredDraft, 'recovered-draft'); return; }\n  if (action === 'discard-recovered-draft') {\n    pendingRecoveredDraft = null;\n    saveCoordinator?.journal?.clear();\n    closeModal();\n    return;\n  }\n  if (action === 'sign-out') { openSignOutMenu(); return; }\n  if (action === 'open-sign-out-menu') { openSignOutMenu(); return; }\n  if (action === 'choose-sign-out-copy') { openSignOutMenu(target.dataset.removeBrowserCopy === 'true'); return; }\n  if (action === 'confirm-sign-out') { signOutAndReturnToBrowser({ removeBrowserCopy: target.dataset.removeBrowserCopy === 'true' }); return; }\n  if (!state) { showToast('The workbench has not finished starting. Please reload this page.'); return; }\n  const v = state ? view() : null;\n  if (action === 'browse-project') {\n    const originalText = target.textContent;\n    const gateError = $('#gate-error');\n    target.disabled = true;\n    target.textContent = 'Opening\u2026';\n    gateError.textContent = '';\n    const hintTimer = setTimeout(() => {\n      gateError.textContent = 'Waiting for the system folder picker \u2014 if it does not appear, check the taskbar or enter the path manually below.';\n    }, 4000);\n    api('/api/project/pick', { method: 'POST' })\n      .then((result) => { if (result.path) $('#project-path').value = result.path; })\n      .catch((error) => { gateError.textContent = error.message; })\n      .finally(() => { clearTimeout(hintTimer); target.disabled = false; target.textContent = originalText; });\n  } else if (action === 'open-project') openProjectFromGate();\n  else if (action === 'open-included-project') openIncludedProject();\n  else if (action === 'close-modal') dismissModal();\n  else if (action === 'create-menu') openCreateMenu();\n  else if (action === 'open-more-menu') openMoreMenu();\n  else if (action === 'set-analytics-consent') setAnalyticsConsent(target.dataset.enabled === 'true');\n  else if (action === 'open-command-palette') openCommandPalette();\n  else if (action === 'open-display-settings') openDisplaySettings();\n  else if (action === 'toggle-idea-sort-direction' || action === 'toggle-sort-direction') { v.ideaSortDirection = v.ideaSortDirection === 'desc' ? 'asc' : 'desc'; renderFilters(); renderBoard(); markDirty(); }\n  else if (action === 'toggle-board-density') {\n    boardDensity = boardDensity === 'compact' ? 'detailed' : 'compact';\n    localStorage.setItem('ideation-workbench:board-density', boardDensity);\n    closeModal();\n    renderBoard();\n    showToast(`${boardDensity === 'compact' ? 'Compact' : 'Detailed'} board density enabled.`);\n  }\n  else if (action === 'open-mobile-filters') openMobileFilters();\n  else if (action === 'clear-mobile-filters') { view().ideaGroupFilterIds = []; openMobileFilters(); }\n  else if (action === 'apply-mobile-filters') {\n    v.ideaGroupFilterIds = $$('[data-mobile-group-filter]:checked', modalBody).map((input) => input.value);\n    v.showExcluded = Boolean($('[data-mobile-show-excluded]', modalBody)?.checked);\n    v.ideaSort = String($('[data-mobile-idea-sort]', modalBody)?.value || v.ideaSort);\n    closeModal();\n    render();\n    markDirty();\n  }\n  else if (action === 'open-relationship-flow') openRelationshipFlow();\n  else if (action === 'open-empty-relationship-flow') openRelationshipFlow(true);\n  else if (action === 'open-conflict-builder') openConflictBuilder();\n  else if (action === 'relationship-toggle') { relationshipDraft.picked = relationshipDraft.picked.includes(itemId) ? relationshipDraft.picked.filter((id) => id !== itemId) : [...relationshipDraft.picked, itemId]; renderConflictBuilder(); }\n  else if (action === 'relationship-more') { relationshipDraft.showAll = !relationshipDraft.showAll; renderConflictBuilder(); }\n  else if (action === 'toggle-conflict-menu') { relationshipDraft.conflictMenuOpen = !relationshipDraft.conflictMenuOpen; relationshipDraft.screen === 'flow' ? renderRelationshipFlow() : renderConflictBuilder(); }\n  else if (action === 'add-conflict-members') { relationshipDraft.conflictMembers = unique([...relationshipDraft.conflictMembers, ...relationshipDraft.picked]); relationshipDraft.picked = []; renderConflictBuilder(); }\n  else if (action === 'remove-conflict-member') { relationshipDraft.conflictMembers = relationshipDraft.conflictMembers.filter((id) => id !== itemId); renderConflictBuilder(); }\n  else if (action === 'mark-selected-conflict') markSelectedConflict(target.dataset.conflictMode);\n  else if (action === 'mark-preselected-conflict') { relationshipDraft.conflictMembers = [...relationshipDraft.preselected]; relationshipDraft.conflictMenuOpen = false; markSelectedConflict(target.dataset.conflictMode); }\n  else if (action === 'open-more-conflict') openMoreConflict();\n  else if (action === 'relationship-back') renderRelationshipFlow();\n  else if (action === 'open-requirement-builder') openRequirementBuilder();\n  else if (action === 'builder-toggle') { requirementBuilder.picked = requirementBuilder.picked.includes(itemId) ? requirementBuilder.picked.filter((id) => id !== itemId) : [...requirementBuilder.picked, itemId]; renderRequirementBuilder(); }\n  else if (action === 'builder-more') { requirementBuilder.showAll = !requirementBuilder.showAll; renderRequirementBuilder(); }\n  else if (action === 'builder-add-side') { const side = requirementBuilder.sides[Number(target.dataset.sideIndex)]; if (side) { requirementBuilder.sides[Number(target.dataset.sideIndex)] = unique([...side, ...requirementBuilder.picked]); requirementBuilder.picked = []; renderRequirementBuilder(); } }\n  else if (action === 'builder-remove-side') { const index = Number(target.dataset.sideIndex); requirementBuilder.sides[index] = requirementBuilder.sides[index].filter((id) => id !== itemId); renderRequirementBuilder(); }\n  else if (action === 'builder-add-side-chain') { if (requirementBuilder.sides.length < 4) requirementBuilder.sides.push([]); renderRequirementBuilder(); }\n  else if (action === 'open-requirement-details') openRequirementDetails();\n  else if (action === 'create-idea') { closeModal(); openIdeaForm(); }\n  else if (action === 'create-implementation') { closeModal(); openImplementationForm(); }\n  else if (action === 'create-theme') { closeModal(); openThemeForm(null, false); }\n  else if (action === 'create-idea-group') { closeModal(); openGroupForm('idea'); }\n  else if (action === 'create-implementation-group') { closeModal(); openGroupForm('implementation'); }\n  else if (action === 'add-idea') { closeModal(); openIdeaForm(); }\n  else if (action === 'edit-idea') { closeModal(); openIdeaForm(itemId); }\n  else if (action === 'delete-idea') deleteIdea(itemId);\n  else if (action === 'add-implementation') { closeModal(); openImplementationForm(null, target.dataset.ideaId || null); }\n  else if (action === 'edit-implementation') openImplementationRelationships(itemId);\n  else if (action === 'open-implementation-form') { closeModal(); openImplementationForm(itemId); }\n  else if (action === 'delete-implementation') { if (removeImplementation(itemId)) { render(); markDirty(); } }\n  else if (action === 'toggle-idea-details') { v.expandedIdeaIds = v.expandedIdeaIds.includes(itemId) ? v.expandedIdeaIds.filter((id) => id !== itemId) : [...v.expandedIdeaIds, itemId]; render(); markDirty(); }\n  else if (action === 'toggle-impl-details') { v.expandedImplementationIds = v.expandedImplementationIds.includes(itemId) ? v.expandedImplementationIds.filter((id) => id !== itemId) : [...v.expandedImplementationIds, itemId]; render(); markDirty(); }\n  else if (action === 'hide-implementation') { v.previousVisibleImplementationIds = [...v.visibleImplementationIds]; v.visibleImplementationIds = v.visibleImplementationIds.filter((id) => id !== itemId); render(); markDirty(); }\n  else if (action === 'show-implementation') { v.previousVisibleImplementationIds = [...v.visibleImplementationIds]; v.visibleImplementationIds = unique([...v.visibleImplementationIds, itemId]); render(); markDirty(); }\n  else if (action === 'filter-idea-group-only' || action === 'group-only') { v.ideaGroupFilterIds = target.dataset.id === 'all' ? [] : [target.dataset.id]; render(); markDirty(); }\n  else if (action === 'toggle-idea-group-filter' || action === 'group-toggle') { const groupId = target.dataset.id; v.ideaGroupFilterIds = v.ideaGroupFilterIds.includes(groupId) ? v.ideaGroupFilterIds.filter((id) => id !== groupId) : [...v.ideaGroupFilterIds, groupId]; renderFilters(); $('#group-filter').open = true; renderBoard(); markDirty(); }\n  else if (action === 'show-all') { v.previousVisibleImplementationIds = [...v.visibleImplementationIds]; v.visibleImplementationIds = implementationsForTheme().map((item) => item.id); render(); markDirty(); }\n  else if (action === 'hide-all') { v.previousVisibleImplementationIds = [...v.visibleImplementationIds]; v.visibleImplementationIds = []; render(); markDirty(); }\n  else if (action === 'restore-visible') { const previous = [...v.previousVisibleImplementationIds]; v.previousVisibleImplementationIds = [...v.visibleImplementationIds]; v.visibleImplementationIds = previous; render(); markDirty(); }\n  else if (action === 'toggle-selection') { v.selectedImplementationIds = v.selectedImplementationIds.includes(itemId) ? v.selectedImplementationIds.filter((id) => id !== itemId) : [...v.selectedImplementationIds, itemId]; render(); markDirty(); }\n  else if (action === 'lock-selected') {\n    const selected = v.selectedImplementationIds;\n    const allManual = selected.length && selected.every((id) => v.manuallyLockedImplementationIds.includes(id));\n    let rejectedCount = 0;\n    if (allManual) {\n      v.manuallyLockedImplementationIds = v.manuallyLockedImplementationIds.filter((id) => !selected.includes(id));\n    } else {\n      const manual = [...v.manuallyLockedImplementationIds];\n      const rejected = [];\n      for (const candidateId of selected) {\n        if (manual.includes(candidateId)) continue;\n        const proposal = lockWithRequirements(conflictsForTheme(), requirements(), normalizeLockedWithRequirements(conflictsForTheme(), requirements(), manual, implementationsForTheme().map((item) => item.id)), candidateId, implementationsForTheme().map((item) => item.id));\n        if (proposal.missingIds.length || proposal.completedConflicts.length) rejected.push(byId(state.implementations, candidateId)?.title || 'Implementation');\n        else manual.push(candidateId);\n      }\n      v.manuallyLockedImplementationIds = manual;\n      rejectedCount = rejected.length;\n      if (rejected.length) showToast(`Could not lock: ${rejected.join(', ')}. Check its conflicts or requirements.`);\n    }\n    v.selectedImplementationIds = [];\n    syncViewWithTheme(v);\n    recordPersistedEvent('decision_lock_updated', { action: allManual ? 'unlock' : 'lock', locked_implementation_count: v.lockedImplementationIds.length, rejected_implementation_count: rejectedCount });\n    render(); markDirty();\n  }\n  else if (action === 'clear-locks') {\n    const hadLocks = v.lockedImplementationIds.length > 0;\n    if (hadLocks) recordPersistedEvent('decision_lock_updated', { action: 'clear', locked_implementation_count: 0, rejected_implementation_count: 0 });\n    else captureEvent('decision_lock_update_attempted', { action: 'clear', locked_implementation_count: 0, rejected_implementation_count: 0 });\n    v.manuallyLockedImplementationIds = []; v.lockedImplementationIds = []; v.selectedImplementationIds = []; render(); markDirty();\n  }\n  else if (action === 'clear-selection') { v.selectedImplementationIds = []; render(); markDirty(); }\n  else if (action === 'open-inspector') { currentInspectorIdeaId = null; currentInspectorId = itemId; renderInspector(true); }\n  else if (action === 'open-idea-inspector') { currentInspectorId = null; currentInspectorIdeaId = itemId; renderInspector(true); }\n  else if (action === 'close-inspector') { currentInspectorId = null; currentInspectorIdeaId = null; renderInspector(); }\n  else if (action === 'focus-conflict') { focusedConflictId = itemId; closeModal(); render(); }\n  else if (action === 'clear-conflict-focus') { focusedConflictId = null; renderBoard(); }\n  else if (action === 'choose-theme') openThemePicker();\n  else if (action === 'select-theme') { state.activeThemeId = itemId; currentInspectorId = null; focusedConflictId = null; closeModal(); render(); markDirty(); }\n  else if (action === 'use-cloud-project') {\n    const cloud = pendingCloudConflict;\n    pendingCloudConflict = null;\n    storageMode = 'cloud';\n    closeModal();\n    openWorkbench(cloud);\n    showToast('Using your existing private cloud project.');\n  }\n  else if (action === 'replace-cloud-project') { closeModal(); uploadBrowserProjectToCloud(structuredClone(state), 'This browser project replaced the cloud project.'); }\n  else if (action === 'manage-structure') openStructureManager();\n  else if (action === 'add-theme') { closeModal(); openThemeForm(); }\n  else if (action === 'edit-theme') { closeModal(); openThemeForm(itemId); }\n  else if (action === 'delete-theme') deleteTheme(itemId);\n  else if (action === 'add-group') { closeModal(); openGroupForm(target.dataset.kind); }\n  else if (action === 'edit-group') { closeModal(); openGroupForm(target.dataset.kind, itemId); }\n  else if (action === 'delete-group') deleteGroup(target.dataset.kind, itemId);\n  else if (action === 'add-group-link') { if (!state.ideaGroups.length || !state.implementationGroups.length) showToast('Create an idea group and an implementation group first.'); else { closeModal(); openGroupLinkForm(); } }\n  else if (action === 'edit-group-link') { closeModal(); openGroupLinkForm(itemId); }\n  else if (action === 'delete-group-link') { state.groupLinks = state.groupLinks.filter((item) => item.id !== itemId); render(); markDirty(); openStructureManager(); }\n  else if (action === 'manage-conflicts') openConflictManager();\n  else if (action === 'manage-requirements') openRequirementsManager();\n  else if (action === 'add-requirement') { closeModal(); openRequirementForm(); }\n  else if (action === 'edit-requirement') { closeModal(); openRequirementForm(itemId); }\n  else if (action === 'add-requirement-for-implementation') { closeModal(); openRequirementForm(null, itemId, itemId); }\n  else if (action === 'edit-relationship-requirement') { const returnId = target.dataset.returnId; closeModal(); openRequirementForm(itemId, null, returnId); }\n  else if (action === 'delete-requirement') { const requirement = byId(requirements(), itemId); if (requirement && confirm('Delete this requirement?')) { state.requirements = requirements().filter((item) => item.id !== itemId); render(); markDirty(); openRequirementsManager(); } }\n  else if (action === 'add-conflict') { closeModal(); openConflictForm(); }\n  else if (action === 'edit-conflict') { closeModal(); openConflictForm(itemId); }\n  else if (action === 'add-conflict-for-implementation') { closeModal(); openConflictForm(null, null, itemId, itemId); }\n  else if (action === 'edit-relationship-conflict') { const returnId = target.dataset.returnId; closeModal(); openConflictForm(itemId, null, null, returnId); }\n  else if (action === 'delete-conflict') { const conflict = byId(state.conflicts, itemId); if (conflict && confirm(`Delete conflict \u201C${conflict.name}\u201D?`)) { state.conflicts = state.conflicts.filter((item) => item.id !== itemId); render(); markDirty(); openConflictManager(); } }\n  else if (action === 'override-conflict') { closeModal(); openConflictForm(null, itemId); }\n  else if (action === 'hide-conflict') { const theme = activeTheme(); theme.hiddenInheritedConflictIds = unique([...(theme.hiddenInheritedConflictIds || []), itemId]); render(); markDirty(); openConflictManager(); }\n  else if (action === 'unhide-conflict') { const theme = activeTheme(); theme.hiddenInheritedConflictIds = (theme.hiddenInheritedConflictIds || []).filter((id) => id !== itemId); render(); markDirty(); openConflictManager(); }\n  else if (action === 'hide-inherited') { const theme = activeTheme(); theme.hiddenInheritedImplementationIds = unique([...(theme.hiddenInheritedImplementationIds || []), itemId]); currentInspectorId = null; render(); markDirty(); }\n  else if (action === 'unhide-inherited') { const theme = activeTheme(); theme.hiddenInheritedImplementationIds = (theme.hiddenInheritedImplementationIds || []).filter((id) => id !== itemId); render(); markDirty(); openStructureManager(); }\n  else if (action === 'make-direct') { const implementation = byId(state.implementations, itemId); implementation.themeIds = unique([...implementation.themeIds, state.activeThemeId]); activeTheme().hiddenInheritedImplementationIds = (activeTheme().hiddenInheritedImplementationIds || []).filter((id) => id !== itemId); render(); markDirty(); }\n  else if (action === 'manage-saves') openSavesManager();\n  else if (action === 'compare-views') openCompareViews();\n  else if (action === 'save-current-view') { closeModal(); openSaveViewForm(); }\n  else if (action === 'load-view') loadSavedView(itemId);\n  else if (action === 'delete-view') { state.savedViews = state.savedViews.filter((item) => item.id !== itemId); markDirty(); openSavesManager(); }\n  else if (action === 'open-share-menu') openShareMenu();\n  else if (action === 'create-project-share') createProjectShare(target.dataset.shareMode, Number(target.dataset.expiryDays || 0));\n  else if (action === 'revoke-project-share') {\n    if (!confirm('Revoke this share link? Anyone using it will immediately lose access.')) return;\n    api(`/api/projects/${encodeURIComponent(currentProjectId)}/shares/${encodeURIComponent(itemId)}`, { method: 'DELETE' })\n      .then(() => { showToast('Share link revoked.'); openShareMenu(); })\n      .catch((error) => showToast(error.message));\n  }\n  else if (action === 'copy-share-link') copyShareLink();\n  else if (action === 'open-export-menu') openExportMenu();\n  else if (action === 'open-import-menu') openImportMenu();\n  else if (action === 'export-project-zip') {\n    closeModal();\n    setStatus('Preparing complete archive\u00E2\u20AC\u00A6');\n    captureEvent('project_export_attempted', { export_format: 'zip' });\n    downloadProjectZip(state).then(() => { captureEvent('project_exported', { export_format: 'zip' }); setStatus('Saved'); showToast('Portable ZIP exported with attachments.'); }).catch((error) => { setStatus('Export failed'); showToast(error.message); });\n  }\n  else if (action === 'export-project-directory') {\n    closeModal(); captureEvent('project_export_attempted', { export_format: 'directory' }); exportProjectDirectory(state).then(() => { captureEvent('project_exported', { export_format: 'directory' }); showToast('Project directory exported.'); }).catch((error) => showToast(error.message));\n  }\n  else if (action === 'import-project-portable') {\n    const input = document.createElement('input'); input.type = 'file'; input.accept = '.zip,.json,application/zip,application/json';\n    input.onchange = async () => { const file = input.files?.[0]; if (!file) return; try { await applyImportedArchive(await importProjectFile(file), file.name); } catch (error) { showToast(error.message); } };\n    input.click();\n  }\n  else if (action === 'import-project-directory') {\n    importProjectDirectory().then((imported) => applyImportedArchive(imported, 'project directory')).catch((error) => showToast(error.message));\n  }\n  else if (action === 'export-project') {\n    closeModal();\n    captureEvent('project_export_attempted', { export_format: 'markdown' });\n    const md = generateExportMarkdown(state);\n    const blob = new Blob([md], { type: 'text/markdown' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = `${state.meta.name.replace(/[^a-zA-Z0-9 _-]/g, '_')}.md`;\n    a.click();\n    URL.revokeObjectURL(url);\n    captureEvent('project_exported', { export_format: 'markdown' });\n    showToast('Project exported as markdown.');\n  }\n  else if (action === 'project-menu') openProjectMenu();\n  else if (action === 'open-project-library') openProjectLibrary();\n  else if (action === 'open-project-history') openProjectHistory();\n  else if (action === 'create-project-checkpoint') {\n    const label = prompt('Checkpoint name', 'Checkpoint');\n    if (!label?.trim()) return;\n    saveState()\n      .then(() => saveCoordinator?.flush())\n      .then(() => api(`/api/projects/${encodeURIComponent(currentProjectId)}/revisions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ label: label.trim() }) }))\n      .then(() => { showToast('Checkpoint saved.'); openProjectHistory(); })\n      .catch((error) => showToast(error.message));\n  }\n  else if (action === 'restore-project-revision') {\n    if (!confirm('Restore this revision as the current project? The present version remains in history.')) return;\n    checkpointBeforeImport('Before history restore')\n      .then(() => api(`/api/projects/${encodeURIComponent(currentProjectId)}/revisions/${encodeURIComponent(itemId)}`))\n      .then((revision) => { state = validateProjectDocument(revision.state); closeModal(); render(); markDirty(); showToast(`Restored revision ${revision.revision}.`); })\n      .catch((error) => showToast(error.message));\n  }\n  else if (action === 'new-project') openNewProjectForm();\n  else if (action === 'switch-project') switchProject(itemId).catch((error) => showToast(error.message));\n  else if (action === 'duplicate-project') {\n    api(`/api/projects/${encodeURIComponent(itemId)}`).then((result) => {\n      const duplicate = structuredClone(result.state);\n      duplicate.meta.id = id();\n      duplicate.meta.name = `${result.project.name} copy`;\n      duplicate.meta.createdAt = new Date().toISOString();\n      duplicate.meta.updatedAt = duplicate.meta.createdAt;\n      return api('/api/projects', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ state: duplicate }) });\n    }).then(() => { showToast('Project duplicated.'); openProjectLibrary(); }).catch((error) => showToast(error.message));\n  }\n  else if (action === 'archive-project') {\n    if (!confirm('Archive this project? You can restore it later.')) return;\n    api(`/api/projects/${encodeURIComponent(itemId)}`, { method: 'DELETE' }).then(() => { showToast('Project archived.'); openProjectLibrary(); }).catch((error) => showToast(error.message));\n  }\n  else if (action === 'restore-project') {\n    api(`/api/projects/${encodeURIComponent(itemId)}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ archived: false }) }).then(() => { showToast('Project restored.'); openProjectLibrary(); }).catch((error) => showToast(error.message));\n  }\n  else if (action === 'import-project') {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = '.md,text/markdown';\n    input.onchange = async () => {\n      const file = input.files?.[0];\n      if (!file) return;\n      try {\n        captureEvent('project_import_attempted', { import_format: 'markdown', attachment_count: 0 });\n        const text = await file.text();\n        await checkpointBeforeImport(`Before importing ${file.name}`);\n        parseImportMarkdown(text, state);\n        recordPersistedEvent('project_imported', { import_format: 'markdown', attachment_count: 0 }, false);\n        closeModal();\n        render();\n        markDirty();\n        showToast(`Imported ${file.name}.`);\n      } catch (error) {\n        showToast(error.message);\n      }\n    };\n    input.click();\n  }\n  else if (action === 'rename-project-inline') startProjectRename();\n  else if (action === 'rename-project') {\n    const next = prompt('Project name', state.meta.name);\n    if (next?.trim()) { state.meta.name = next.trim(); closeModal(); render(); markDirty(); }\n  }\n  else if (action === 'close-project') {\n    if (confirm('Close this project? Unsaved changes will be saved first.')) {\n      saveState().finally(() => location.reload());\n    }\n  }\n  else if (action === 'delete-attachment') {\n    const implementation = byId(state.implementations, itemId);\n    const storage = target.dataset.storage;\n    if (implementation && storage && confirm('Remove this attachment?')) {\n      const deletePath = storageMode === 'cloud' ? `/api/projects/${encodeURIComponent(currentProjectId)}/attachments/${encodeURIComponent(storage)}` : `/api/attachments/${encodeURIComponent(storage)}`;\n      api(deletePath, { method: 'DELETE' }).then(() => {\n        implementation.attachments = (implementation.attachments || []).filter((item) => item.storageName !== storage);\n        render(); markDirty();\n      }).catch((error) => showToast(error.message));\n    }\n  }\n}\n\ndocument.addEventListener('click', (event) => {\n  const groupFilter = $('#group-filter');\n  if (groupFilter?.open && !event.target.closest('#group-filter')) groupFilter.open = false;\n  if (relationshipDraft?.conflictMenuOpen && !event.target.closest('.split-button')) {\n    relationshipDraft.conflictMenuOpen = false;\n    if (modal.open) (relationshipDraft.screen === 'flow' ? renderRelationshipFlow : renderConflictBuilder)();\n  }\n  const actionTarget = event.target.closest('[data-action]');\n  if (actionTarget) {\n    handleAction(actionTarget);\n    return;\n  }\n  if ((currentInspectorId || currentInspectorIdeaId) && !event.target.closest('#inspector') && !event.target.closest('.impl-row') && !event.target.closest('.idea-card') && !event.target.closest('#modal')) {\n    currentInspectorId = null;\n    currentInspectorIdeaId = null;\n    renderInspector();\n  }\n});\n\ndocument.addEventListener('keydown', (event) => {\n  if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'k') {\n    event.preventDefault();\n    openCommandPalette();\n    return;\n  }\n  if ((event.ctrlKey || event.metaKey) && !event.target.closest('input, textarea, [contenteditable=\"true\"]') && event.key.toLowerCase() === 'z') {\n    event.preventDefault();\n    restoreHistory(event.shiftKey ? 'redo' : 'undo');\n    return;\n  }\n  if ((event.ctrlKey || event.metaKey) && !event.target.closest('input, textarea, [contenteditable=\"true\"]') && event.key.toLowerCase() === 'y') {\n    event.preventDefault();\n    restoreHistory('redo');\n    return;\n  }\n  if (event.ctrlKey && event.key === 'Enter') {\n    const inspectorForm = $('#inspector-form');\n    const ideaInspectorForm = $('#idea-inspector-form');\n    const modalForm = modal.querySelector('form');\n    if (ideaInspectorForm && ideaInspectorForm.contains(event.target)) {\n      event.preventDefault();\n      const idea = byId(state.ideas, currentInspectorIdeaId);\n      if (!idea) return;\n      const formData = new FormData(ideaInspectorForm);\n      idea.title = String(formData.get('title') || '').trim() || idea.title;\n      idea.detailsMarkdown = getRichValue($('#inspector'));\n      render(); markDirty();\n    } else if (inspectorForm && inspectorForm.contains(event.target)) {\n      event.preventDefault();\n      const implementation = byId(state.implementations, currentInspectorId);\n      if (!implementation) return;\n      const formData = new FormData(inspectorForm);\n      implementation.title = String(formData.get('title') || '').trim() || implementation.title;\n      implementation.detailsMarkdown = getRichValue($('#inspector'));\n      render(); markDirty();\n    } else if (modalForm && modalForm.contains(event.target) && modalSubmitHandler) {\n      event.preventDefault();\n      modalForm.requestSubmit();\n    }\n  }\n});\n\nmodal.addEventListener('submit', async (event) => {\n  event.preventDefault();\n  if (!modalSubmitHandler) return;\n  try { await modalSubmitHandler(event.target); }\n  catch (error) { showToast(error.message); }\n});\n\nmodal.addEventListener('cancel', (event) => {\n  event.preventDefault();\n  dismissModal();\n});\n\n$('#board-controls').addEventListener('input', (event) => {\n  if (event.target.id === 'search-input') { view().search = event.target.value; renderBoard(); markDirty(); }\n  if (event.target.id === 'show-excluded') { view().showExcluded = event.target.checked; renderBoard(); markDirty(); }\n});\n$('#board-controls').addEventListener('change', (event) => {\n  if (event.target.id === 'show-excluded') { view().showExcluded = event.target.checked; renderBoard(); markDirty(); }\n  if (event.target.id === 'idea-sort') { view().ideaSort = event.target.value; renderBoard(); markDirty(); }\n});\n$('#inspector').addEventListener('submit', (event) => {\n  if (!['inspector-form', 'idea-inspector-form'].includes(event.target.id)) return;\n  event.preventDefault();\n  if (event.target.id === 'idea-inspector-form') {\n    const idea = byId(state.ideas, currentInspectorIdeaId);\n    if (!idea) return;\n    const formData = new FormData(event.target);\n    idea.title = String(formData.get('title') || '').trim() || idea.title;\n    idea.detailsMarkdown = getRichValue($('#inspector'));\n    render(); markDirty();\n    return;\n  }\n  const implementation = byId(state.implementations, currentInspectorId);\n  const formData = new FormData(event.target);\n  implementation.title = String(formData.get('title') || '').trim() || implementation.title;\n  implementation.detailsMarkdown = getRichValue($('#inspector'));\n  render(); markDirty();\n});\n$('#inspector').addEventListener('change', (event) => { if (event.target.id === 'attachment-input') uploadAttachment(event.target); });\nmodal.addEventListener('input', (event) => {\n  const kind = event.target.dataset.relationshipSearch;\n  if (kind === 'relationship' && relationshipDraft) { relationshipDraft.query = event.target.value; renderConflictBuilder(); }\n  if (kind === 'builder' && requirementBuilder) { requirementBuilder.query = event.target.value; renderRequirementBuilder(); }\n  if (event.target.matches('[data-command-search]')) {\n    const query = event.target.value.trim().toLowerCase();\n    $$('.command-list button', modalBody).forEach((button) => { button.hidden = Boolean(query && !button.textContent.toLowerCase().includes(query)); });\n  }\n  if (!kind && event.target.closest('#modal-form')) modalDirty = true;\n});\nmodal.addEventListener('click', (event) => { if (event.target === modal) dismissModal(); });\n$('#board').addEventListener('pointerdown', beginBoardPointer);\n$('#board').addEventListener('keydown', (event) => {\n  if (!event.target.closest('.drag-handle') || !['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) return;\n  event.preventDefault();\n  keyboardReorderBoardItem(event.target, ['ArrowUp', 'ArrowLeft'].includes(event.key) ? -1 : 1);\n});\ndocument.addEventListener('pointermove', moveBoardDrag, { passive: false });\ndocument.addEventListener('pointerup', (event) => finishBoardDrag(event));\ndocument.addEventListener('pointercancel', (event) => finishBoardDrag(event, true));\nwindow.addEventListener('beforeunload', () => { if (storageMode === 'guest' && state) saveGuestState(state); });\n\nboot();\n"],
  "mappings": "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",
  "names": ["byId", "state", "id", "requirements", "id", "id", "state", "i", "view", "id", "state", "i", "i", "l", "i", "i2", "_a", "_b", "i", "i", "_a", "_a", "fl", "_a", "i", "i", "_a", "state", "view", "id", "state", "document", "state", "id", "operation", "DATABASE", "STORE", "openDatabase", "id", "state", "escapeHtml", "view", "id", "filename", "escapeHtml", "byId", "prompt", "max", "id", "byId", "implementation", "escapeHtml", "idea", "escapeHtml", "byId", "id", "modalForm", "formData"]
}
