@2lab.ai/ui 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -2
- package/dist/agent-inbox.js +1061 -0
- package/dist/agent-inbox.js.map +1 -0
- package/dist/agent-queue.js +1610 -0
- package/dist/agent-queue.js.map +1 -0
- package/dist/agent-run.js +859 -0
- package/dist/agent-run.js.map +1 -0
- package/dist/ai-answer.js +687 -0
- package/dist/ai-answer.js.map +1 -0
- package/dist/components/agent-inbox/agent-inbox.d.ts +158 -0
- package/dist/components/agent-inbox/index.d.ts +2 -0
- package/dist/components/agent-inbox/styles.d.ts +6 -0
- package/dist/components/agent-queue/agent-queue.d.ts +41 -0
- package/dist/components/agent-queue/index.d.ts +6 -0
- package/dist/components/agent-queue/logic.d.ts +261 -0
- package/dist/components/agent-queue/strings.d.ts +473 -0
- package/dist/components/agent-queue/styles.d.ts +8 -0
- package/dist/components/agent-run/agent-run.d.ts +273 -0
- package/dist/components/agent-run/index.d.ts +2 -0
- package/dist/components/agent-run/styles.d.ts +6 -0
- package/dist/components/ai-answer/ai-answer.d.ts +92 -0
- package/dist/components/ai-answer/index.d.ts +2 -0
- package/dist/components/ai-answer/styles.d.ts +2 -0
- package/dist/components/context-window/context-window.d.ts +156 -0
- package/dist/components/context-window/index.d.ts +2 -0
- package/dist/components/context-window/styles.d.ts +2 -0
- package/dist/components/memory-panel/index.d.ts +2 -0
- package/dist/components/memory-panel/memory-panel.d.ts +101 -0
- package/dist/components/memory-panel/styles.d.ts +2 -0
- package/dist/components/model-picker/index.d.ts +2 -0
- package/dist/components/model-picker/model-picker.d.ts +136 -0
- package/dist/components/model-picker/morph.d.ts +9 -0
- package/dist/components/model-picker/styles.d.ts +6 -0
- package/dist/context-window.js +384 -0
- package/dist/context-window.js.map +1 -0
- package/dist/core/element.d.ts +39 -0
- package/dist/core/format.d.ts +14 -0
- package/dist/core/html.d.ts +10 -0
- package/dist/core/tokens.d.ts +14 -0
- package/dist/format-BBGWXPzk.js +51 -0
- package/dist/format-BBGWXPzk.js.map +1 -0
- package/dist/html-DZWnrdcg.js +167 -0
- package/dist/html-DZWnrdcg.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-panel.js +1255 -0
- package/dist/memory-panel.js.map +1 -0
- package/dist/model-picker.js +858 -0
- package/dist/model-picker.js.map +1 -0
- package/dist/tokens.css +4 -0
- package/package.json +75 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-panel.js","sources":["../src/components/memory-panel/styles.ts","../src/components/memory-panel/memory-panel.ts"],"sourcesContent":["/** Ported from the soma-work dashboard settings › 기억 › 개인 메모리 (.prd/affectui/re-memory-panel.md D1–D17, `.mm-*`). */\nexport const styles = `\n:host { --mm-fold: 320ms; --mm-warn: var(--yellow); --mm-danger-bg: color-mix(in srgb, var(--red) 11%, transparent);\n --mm-mark: color-mix(in srgb, var(--st-wait) 32%, transparent); --mm-well: var(--surface-raised); }\n.mm { container: mm / inline-size; position: relative; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); color: var(--text-secondary); font-size: 13px; }\n.mm h3, .mm p { margin: 0; }\n.mm ol { margin: 0; padding: 0; }\n.mm :is(button, input, textarea):focus-visible { outline: 2px solid var(--border-focus); outline-offset: 1px; }\n.mm-head { display: flex; align-items: center; gap: 8px; padding: 14px 16px 2px; }\n.mm-title { font-size: 13.5px; font-weight: 600; color: var(--text); }\n.mm-count { min-width: 20px; height: 20px; padding: 0 6px; border-radius: 5px; background: var(--mm-well); font-size: 12px; font-weight: 500; line-height: 20px; text-align: center; color: var(--text-tertiary); font-variant-numeric: tabular-nums; }\n.mm-count:empty { display: none; }\n\n/* filters: store chips (radiogroup) · search covering the chips */\n.mm-filters { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px; padding: 10px 10px 10px 14px; border-bottom: 1px solid var(--border); }\n.mm-chips, .mm-search { grid-area: 1 / 1; transition: opacity 220ms ease, filter 220ms ease; }\n.mm-chips { display: flex; gap: 4px; min-width: 0; margin: -3px -4px; padding: 3px 4px; overflow-x: auto; scrollbar-width: none; -webkit-mask-image: linear-gradient(90deg, black calc(100% - 14px), transparent); mask-image: linear-gradient(90deg, black calc(100% - 14px), transparent); }\n.mm-chips::-webkit-scrollbar { display: none; }\n.mm-chip { display: inline-flex; flex: none; align-items: center; gap: 5px; height: 28px; padding: 0 9px; font-size: 12.5px; color: var(--text-secondary); background: none; border: 0; border-radius: 8px; white-space: nowrap; transition: background-color var(--dur-press) ease, color var(--dur-press) ease, box-shadow var(--dur-press) ease; }\n.mm-chip[aria-checked=\"true\"] { background: var(--mm-well); color: var(--text); font-weight: 600; box-shadow: inset 0 0 0 1px var(--border); }\n.mm-chip-n { font-size: 11.5px; font-weight: 400; color: var(--text-tertiary); font-variant-numeric: tabular-nums; }\n.mm-search { display: flex; align-items: center; gap: 6px; min-width: 0; height: 30px; padding: 0 2px 0 9px; border-radius: 8px; background: var(--mm-well); color: var(--text-tertiary); opacity: 0; visibility: hidden; }\n.mm-search svg { flex: none; }\n.mm-search input { flex: 1; min-width: 0; height: 28px; padding: 0; font-size: 13px; color: var(--text); background: none; border: 0; outline: none; -webkit-appearance: none; appearance: none; }\n.mm-search input::placeholder { color: var(--text-tertiary); }\n.mm-search input::-webkit-search-cancel-button { display: none; }\n.mm .mm-search input:focus-visible { outline: none; }\n.mm-search:focus-within { box-shadow: inset 0 0 0 1px var(--border-focus); }\n.mm-filters[data-searching] .mm-chips { opacity: 0; filter: blur(2px); }\n.mm-filters[data-searching] .mm-search { grid-area: 1 / 1 / 2 / 3; opacity: 1; visibility: visible; }\n.mm-filters[data-searching] .mm-search-open { opacity: 0; visibility: hidden; }\n.mm-icon { display: grid; flex: none; place-items: center; width: 28px; height: 28px; padding: 0; font-size: 16px; line-height: 1; color: var(--text-tertiary); background: none; border: 0; border-radius: 8px; transition: background-color var(--dur-press) ease, color var(--dur-press) ease, opacity 200ms ease; }\n.mm-search-open { grid-area: 1 / 2; }\n.mm-note { padding: 9px 16px; border-bottom: 1px solid var(--border); background: color-mix(in srgb, var(--text) 3%, transparent); font-size: 12.5px; color: var(--text-secondary); }\n\n/* groups — one per store; folds are grid rows 0fr ↔ 1fr */\n.mm-list { padding: 2px 8px 6px; }\n.mm-fold { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows var(--mm-fold) var(--ease-out), opacity var(--dur-fade) ease; }\n.mm-fold[data-open] { grid-template-rows: 1fr; opacity: 1; transition: grid-template-rows var(--mm-fold) var(--ease-out), opacity 240ms ease 60ms; }\n.mm-fold[data-leaving] { transition: grid-template-rows var(--mm-fold) var(--ease-out), opacity 200ms ease, filter 200ms ease; filter: blur(2px); }\n.mm-clip { min-height: 0; overflow: hidden; }\n.mm-ghead { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 16px; padding: 12px 8px 4px; }\n.mm-ghead h3 { min-width: 0; font-size: 13px; font-weight: 600; color: var(--text); overflow-wrap: anywhere; }\n.mm-file { margin-left: 4px; font-size: 12px; font-weight: 400; color: var(--text-tertiary); }\n.mm-usage { display: flex; flex: 0 1 280px; align-items: center; gap: 8px; min-width: 0; font-size: 12px; color: var(--text-secondary); font-variant-numeric: tabular-nums; }\n.mm-bar { position: relative; flex: 1; min-width: 48px; height: 6px; border-radius: 3px; background: var(--ib-pill); overflow: hidden; }\n.mm-bar > i { position: absolute; inset: 0 auto 0 0; border-radius: inherit; background: var(--st-done); }\n.mm-usage[data-level=\"warn\"] .mm-bar > i { background: var(--st-wait); }\n.mm-usage[data-level=\"high\"] .mm-bar > i, .mm-usage[data-level=\"full\"] .mm-bar > i { background: var(--st-fail); }\n.mm-usage[data-level=\"warn\"], .mm-usage[data-level=\"high\"], .mm-over { color: var(--mm-warn); }\n.mm-usage[data-level=\"full\"] { color: var(--red); }\n.mm-uval { flex: none; white-space: nowrap; }\n.mm-items { list-style: none; }\n.mm-row { padding: 6px 8px 5px; border-radius: 8px; transition: background-color var(--dur-press) ease; }\n.mm-row:hover, .mm-row:focus-within, .mm-row[data-editing] { background: var(--mm-well); }\n.mm-text { font-size: 13px; line-height: 20px; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; }\n.mm-text mark { border-radius: 3px; background: var(--mm-mark); box-shadow: 0 0 0 1px var(--mm-mark); color: inherit; }\n.mm-meta { display: flex; align-items: center; gap: 6px; min-height: 26px; font-size: 12px; color: var(--text-tertiary); font-variant-numeric: tabular-nums; }\n.mm-src { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n.mm-acts { display: inline-flex; flex: none; align-items: center; gap: 2px; margin: -1px -4px -1px auto; opacity: 0; transition: opacity 180ms ease; }\n.mm-row:hover .mm-acts, .mm-row:focus-within .mm-acts, .mm-acts.is-on { opacity: 1; }\n.mm-act { height: 26px; padding: 0 9px; font-size: 12.5px; font-weight: 500; color: var(--text-secondary); background: none; border: 0; border-radius: 8px; white-space: nowrap; transition: background-color var(--dur-press) ease, color var(--dur-press) ease, opacity var(--dur-press) ease; }\n.mm-act-main { background: var(--text); color: var(--surface); }\n.mm-act:disabled { opacity: 0.4; cursor: default; }\n.mm textarea.mm-edit { display: block; width: 100%; min-height: 20px; margin: 0; padding: 0; font-size: 13px; line-height: 20px; color: var(--text); background: none; border: 0; border-radius: 0; resize: none; overflow: hidden; }\n.mm textarea.mm-edit:focus-visible { outline: none; }\n.mm-row[data-editing]:focus-within, .mm-new:focus-within { box-shadow: inset 0 0 0 1px var(--border-focus); }\n.mm-counter { font-size: 11.5px; color: var(--text-tertiary); font-variant-numeric: tabular-nums; }\n.mm-counter.is-over { color: var(--red); }\n.mm-empty { padding: 4px 8px 8px; font-size: 12.5px; color: var(--text-tertiary); }\n.mm-nomatch { padding: 18px 8px 12px; text-align: center; overflow-wrap: anywhere; }\n/* 3px of room so a focus ring is not clipped by the folding parent */\n.mm-addline { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 3px 3px 8px; }\n.mm-add { display: flex; align-items: center; gap: 6px; min-width: 0; height: 32px; padding: 0 8px; font-size: 13px; color: var(--text-tertiary); background: none; border: 0; border-radius: 8px; text-align: left; transition: background-color var(--dur-press) ease, color var(--dur-press) ease; }\n.mm-clear { flex: none; height: 28px; padding: 0 8px; font-size: 12px; color: var(--text-tertiary); background: none; border: 0; border-radius: 8px; white-space: nowrap; transition: background-color var(--dur-press) ease, color var(--dur-press) ease, box-shadow var(--dur-press) ease; }\n.mm-clear[data-armed] { background: var(--mm-danger-bg); color: var(--red); font-weight: 600; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--red) 40%, transparent); }\n.mm-new { margin: 3px 3px 8px; padding: 8px 8px 6px; border-radius: 8px; background: var(--mm-well); }\n.mm-label { display: block; margin-bottom: 4px; font-size: 12px; color: var(--text-tertiary); }\n.mm-line { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px; margin-top: 6px; }\n\n/* tray: caption (cross-fades) · polite status · Undo */\n.mm-foot { display: flex; align-items: center; gap: 8px; min-height: 40px; padding: 4px 8px 4px 16px; border-top: 1px solid var(--border); border-radius: 0 0 calc(var(--radius) - 1px) calc(var(--radius) - 1px); background: var(--bg); }\n.mm-caption { display: grid; flex: 1; min-width: 0; font-size: 12.5px; color: var(--text-tertiary); white-space: nowrap; font-variant-numeric: tabular-nums; }\n.mm-caption b { font-weight: 600; color: var(--text); }\n.mm-swap { grid-area: 1 / 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; animation: mm-swap-in 320ms ease both; }\n.mm-swap[data-out] { animation: mm-swap-out 220ms ease both; }\n.mm-swap.is-warn { color: var(--mm-warn); }\n.mm-swap.is-fail { color: var(--red); }\n.mm-forgot { display: flex; min-width: 0; }\n.mm-flat { flex: none; white-space: pre; }\n.mm-quote { min-width: 0; overflow: hidden; text-overflow: ellipsis; }\n.mm-undo { display: inline-flex; flex: none; align-items: center; height: 28px; padding: 0 10px; font-size: 12.5px; font-weight: 600; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 8px; animation: mm-swap-in 300ms ease both; transition: border-color var(--dur-press) ease; }\n.mm-undo[hidden] { display: none; }\n@keyframes mm-swap-in { from { opacity: 0; filter: blur(2px); } }\n@keyframes mm-swap-out { to { opacity: 0; filter: blur(2px); } }\n@media (hover: hover) and (pointer: fine) {\n .mm-chip:hover, .mm-icon:hover, .mm-add:hover { background: var(--mm-well); color: var(--text); }\n .mm-act:hover { background: var(--surface); color: var(--text); }\n .mm-act-main:hover { background: var(--text); color: var(--surface); opacity: 0.86; }\n .mm-act-del:hover, .mm-clear:hover { background: var(--mm-danger-bg); color: var(--red); }\n .mm-undo:hover { border-color: var(--accent); }\n}\n@container mm (max-width: 480px) { .mm-cap { display: none; } .mm-usage { flex-basis: 100%; } }\n@container mm (max-width: 340px) { .mm-chip-n { display: none; } .mm-chip { padding: 0 7px; } }\n@media (pointer: coarse) {\n .mm-acts { opacity: 1; }\n .mm-act, .mm-chip, .mm-clear, .mm-add, .mm-undo { min-height: 44px; }\n .mm-icon { width: 44px; height: 44px; }\n .mm-search { height: 44px; }\n .mm-search input { height: 42px; font-size: 16px; }\n .mm textarea.mm-edit { font-size: 16px; line-height: 22px; }\n .mm-meta { min-height: 44px; }\n}\n`;\n","import { define, prefersReducedMotion, UiElement } from '../../core/element';\nimport { fmtInt } from '../../core/format';\nimport { esc, escAttr } from '../../core/html';\nimport { styles } from './styles';\n\n/** One memory store (a file the agent reads at the start of every session). */\nexport interface MemoryStore {\n /** Stable id, sent back as `store` in every event. */\n id: string;\n /** Group title and chip label (e.g. `Agent notes`). */\n label: string;\n /** File or source shown next to the label (e.g. `MEMORY.md`). */\n file?: string;\n /** Character budget of the store — drives the usage bar. 0 / absent: no bar, just the count. */\n limit: number;\n /** The entries, in store order. Entry `#n` is `entries[n - 1]`. */\n entries: string[];\n /** Longest single entry. Longer entries are flagged; the editors count against it. */\n perEntryLimit?: number;\n /** What the store puts between entries when it counts its usage (e.g. `'\\n§\\n'`). Default `''`. */\n separator?: string;\n}\n\nexport interface MemoryPanelData {\n stores: MemoryStore[];\n /** `true` hides every write action (edit, delete, add, clear); a string also says why, above the list. */\n readOnly?: boolean | string;\n /** Heading with a rolling entry count. Default: none (the host page titles the panel). */\n title?: string;\n}\n\nexport interface MemoryAddDetail {\n store: string;\n /** As typed (the host decides whether to trim). */\n text: string;\n}\nexport interface MemoryEditDetail {\n store: string;\n index: number;\n /** As typed. A change that only adds or removes surrounding whitespace is never sent. */\n text: string;\n /** The entry text the edit replaces — check it against your copy before writing. */\n previous: string;\n}\nexport interface MemoryDeleteDetail {\n store: string;\n index: number;\n text: string;\n}\n/** The entry Undo brings back: `index` is where it was, `text` exactly what was deleted. */\nexport type MemoryRestoreDetail = MemoryDeleteDetail;\nexport interface MemoryClearDetail {\n store: string;\n}\n\n/** ok < 80% ≤ warn (amber) < 95% ≤ high (red bar) < 100% ≤ full (red text). */\nexport type UsageLevel = 'ok' | 'warn' | 'high' | 'full';\n\nexport const UNDO_MS = 5000;\nexport const FOLD_MS = 320;\nconst NOTICE_MS = 3000;\nconst ARM_MS = 4000;\nconst ROLL_MS = 520;\nconst SWAP_OUT_MS = 260;\nconst REVEAL_SCROLL_MS = 120;\nconst SHORT = 40;\n\nconst STRINGS = {\n en: {\n panel: 'Personal memory',\n stores: 'Stores',\n all: 'All',\n search: 'Search memories',\n searchPh: 'Search entries',\n closeSearch: 'Close search',\n usage: (l: string) => `${l} usage`,\n of: (u: string, l: string) => `${u} / ${l} chars`,\n chars: (n: string) => `${n} chars`,\n full: ' · full',\n empty: 'Empty — add an entry below.',\n emptyRo: 'Empty.',\n noMatch: (q: string) => `No entries match “${q}”`,\n over: 'over the per-entry limit',\n edit: 'Edit',\n del: 'Delete',\n editName: (s: string) => `Edit “${s}”`,\n delName: (s: string) => `Delete “${s}”`,\n editField: (l: string, n: number) => `Edit ${l} #${n}`,\n cancel: 'Cancel',\n save: 'Save',\n add: 'Add',\n addTo: (l: string) => `Add to ${l}`,\n clear: 'Clear all',\n clearN: (n: number) => `Clear ${n} ${n === 1 ? 'entry' : 'entries'}`,\n armed: 'This cannot be undone — press again to clear',\n armedSr: (l: string, n: number) =>\n `Clear all ${n} ${n === 1 ? 'entry' : 'entries'} in ${l}? This cannot be undone — press again to clear`,\n newLabel: (cap: string) => (cap ? `New entry (up to ${cap} chars)` : 'New entry'),\n after: (total: string, limit: string) =>\n limit ? `After adding: ${total} / ${limit} chars` : `After adding: ${total} chars`,\n overBy: (n: string) => ` — ${n} over`,\n tooLong: ' — over the per-entry limit',\n deleted: ['Deleted “', '”'],\n deletedSr: (s: string) => `Deleted “${s}” — Undo brings it back`,\n undo: 'Undo',\n saved: 'Saved',\n added: 'Added',\n restored: 'Restored',\n cleared: 'Cleared',\n emptyEntry: 'An entry cannot be empty — use Delete to remove it',\n editHint: 'Enter to save · Shift+Enter for a new line · Esc to cancel',\n addHint: 'Enter to add · Shift+Enter for a new line · Esc to close',\n entries: (n: number): string => (n === 1 ? ' entry' : ' entries'),\n },\n ko: {\n panel: '개인 메모리',\n stores: '저장소',\n all: '전체',\n search: '개인 메모리 검색',\n searchPh: '항목 검색',\n closeSearch: '검색 닫기',\n usage: (l: string) => `${l} 사용량`,\n of: (u: string, l: string) => `${u} / ${l}자`,\n chars: (n: string) => `${n}자`,\n full: ' · 가득 참',\n empty: '비어 있음 — 아래에서 추가하세요.',\n emptyRo: '비어 있음.',\n noMatch: (q: string) => `“${q}” 검색 결과가 없습니다`,\n over: '한 항목 한도 초과',\n edit: '수정',\n del: '삭제',\n editName: (s: string) => `수정: “${s}”`,\n delName: (s: string) => `삭제: “${s}”`,\n editField: (l: string, n: number) => `${l} ${n}번 수정`,\n cancel: '취소',\n save: '저장',\n add: '추가',\n addTo: (l: string) => `${l}에 추가`,\n clear: '모두 지우기',\n clearN: (n: number) => `${n}개 모두 지우기`,\n armed: '되돌릴 수 없습니다 — 한 번 더 누르면 지웁니다',\n armedSr: (l: string, n: number) =>\n `${l} 항목 ${n}개를 모두 지울까요? 되돌릴 수 없습니다 — 한 번 더 누르면 지웁니다`,\n newLabel: (cap: string) => (cap ? `새 항목 (한 항목 최대 ${cap}자)` : '새 항목'),\n after: (total: string, limit: string) => (limit ? `추가하면 ${total} / ${limit}자` : `추가하면 ${total}자`),\n overBy: (n: string) => ` — ${n}자 초과`,\n tooLong: ' — 한 항목 한도 초과',\n deleted: ['삭제함 “', '”'],\n deletedSr: (s: string) => `삭제함 “${s}” — 되돌리기로 되돌릴 수 있습니다`,\n undo: '되돌리기',\n saved: '저장했습니다',\n added: '추가했습니다',\n restored: '되돌렸습니다',\n cleared: '모두 지웠습니다',\n emptyEntry: '비어 있는 항목은 저장할 수 없습니다 — 지우려면 삭제를 쓰세요',\n editHint: 'Enter 저장 · Shift+Enter 줄바꿈 · Esc 취소',\n addHint: 'Enter 추가 · Shift+Enter 줄바꿈 · Esc 닫기',\n entries: (_n: number) => '개 항목',\n },\n};\ntype Strings = (typeof STRINGS)['en'];\n\nconst SEARCH_SVG =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"4.25\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M9.25 9.25 12 12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>';\n\n// ── pure helpers (exported, unit-tested) ──\n\nconst num = (v: unknown): number => {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? n : 0;\n};\n\n/** Characters a store uses: its entries joined with its separator (what the store itself counts). */\nexport function storeUsed(entries: readonly string[], separator = ''): number {\n if (!entries.length) return 0;\n let n = separator.length * (entries.length - 1);\n for (const e of entries) n += String(e).length;\n return n;\n}\n\n/** The usage band against the store's limit. */\nexport function usageLevel(used: number, limit: number): UsageLevel {\n if (!(limit > 0)) return 'ok';\n const r = used / limit;\n return r >= 1 ? 'full' : r >= 0.95 ? 'high' : r >= 0.8 ? 'warn' : 'ok';\n}\n\n/** The store's usage once `text` is added — trimmed, as the store saves it, plus one separator. */\nexport function usageAfterAdd(entries: readonly string[], separator: string, text: string): number {\n const n = String(text ?? '').trim().length;\n return storeUsed(entries, separator) + (n ? n + (entries.length ? separator.length : 0) : 0);\n}\n\n/** An edit is \"the same\" when both sides match once trimmed — the store trims what it saves, so no write is needed. */\nexport function isSameEdit(next: string, previous: string): boolean {\n return String(next ?? '').trim() === String(previous ?? '').trim();\n}\n\n/** `text` cut to `max` characters with an ellipsis (spoken names, the undo sentence). */\nexport function shortText(text: string, max = SHORT): string {\n const s = String(text ?? '');\n return s.length > max ? `${s.slice(0, max)}…` : s;\n}\n\n/** Search: the trimmed query, case-insensitive, inside the entry — or inside the store's label / file name. */\nexport function entryMatches(text: string, q: string, store?: { label?: string; file?: string }): boolean {\n const needle = String(q ?? '')\n .trim()\n .toLowerCase();\n if (!needle) return true;\n if (\n String(text ?? '')\n .toLowerCase()\n .includes(needle)\n )\n return true;\n return !!store && `${store.label ?? ''} ${store.file ?? ''}`.toLowerCase().includes(needle);\n}\n\n/** Escaped `text` with each case-insensitive occurrence of the trimmed query wrapped in `<mark>`. */\nexport function highlight(text: string, q: string): string {\n const s = String(text ?? '');\n const needle = String(q ?? '')\n .trim()\n .toLowerCase();\n const lower = s.toLowerCase();\n // (a lower-casing that changes the length — rare Unicode — would misplace the marks: no marks then)\n if (!needle || lower.length !== s.length) return esc(s);\n let out = '';\n let at = 0;\n for (let i = lower.indexOf(needle); i >= 0; i = lower.indexOf(needle, at)) {\n out += `${esc(s.slice(at, i))}<mark>${esc(s.slice(i, i + needle.length))}</mark>`;\n at = i + needle.length;\n }\n return out + esc(s.slice(at));\n}\n\nfunction hash(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * Stable row keys: a content hash plus the occurrence. A row keeps its key when rows above it are deleted or\n * restored, so focus stays on the same entry when the host's next `data` shifts the indices.\n */\nexport function entryKeys(entries: readonly string[]): string[] {\n const seen = new Map<string, number>();\n return entries.map((e) => {\n const h = hash(String(e));\n const n = seen.get(h) ?? 0;\n seen.set(h, n + 1);\n return n ? `${h}.${n}` : h;\n });\n}\n\n// ── element ──\n\ninterface WorkStore {\n id: string;\n label: string;\n file: string;\n limit: number;\n per: number;\n sep: string;\n entries: string[];\n}\ninterface View {\n store: string | null;\n q: string;\n searching: boolean;\n}\ninterface Editing {\n store: string;\n index: number;\n orig: string;\n draft: string;\n}\ninterface Undo {\n store: string;\n index: number;\n text: string;\n seq: number;\n left: number;\n started: number;\n timer: number;\n}\ninterface Notice {\n text: string;\n seq: number;\n fail: boolean;\n}\ninterface TrayState {\n key: string;\n html: string;\n live: string;\n tone?: string;\n total?: number;\n cap?: string;\n}\n\nfunction fold(el: Element | null | undefined, open: boolean): void {\n if (!el) return;\n el.toggleAttribute('data-open', open);\n el.toggleAttribute('inert', !open);\n}\n\nfunction grow(el: HTMLTextAreaElement | null | undefined): void {\n if (!el) return;\n el.style.height = 'auto';\n const h = el.scrollHeight;\n if (h > 0) el.style.height = `${h}px`;\n}\n\n/**\n * `<ui-memory-panel>` — the agent's personal memory stores in one panel: store chips (a radiogroup), search with\n * highlight, one group per store with its usage bar, in-place edit, a delete that folds away at once with a 5 s\n * Undo on the tray, add per store, a two-press \"Clear all\". Every write leaves as a cancelable `ui-*` event and\n * shows optimistically until the host's next `data`, which is always the truth.\n */\nexport class UiMemoryPanel extends UiElement<MemoryPanelData> {\n static override styles = [styles];\n static get observedAttributes() {\n return ['lang'];\n }\n\n #work: WorkStore[] = [];\n /** Entry texts as the DOM shows them (a delete's fold can outlive the working copy by FOLD_MS). */\n #painted = new Map<string, string[]>();\n #view: View = { store: null, q: '', searching: false };\n #editing: Editing | null = null;\n #adding: Record<string, boolean> = {};\n #drafts: Record<string, string> = {};\n #undo: Undo | null = null;\n #notice: Notice | null = null;\n #armed: { store: string; n: number; seq: number } | null = null;\n #holds = { hover: false, panel: false };\n #seq = 0;\n #chrome = '';\n #trayKey = '';\n #trayItem: HTMLElement | null = null;\n #rolls = new Map<Element, { n: number; raf: number }>();\n #timers = { notice: 0, armed: 0, settle: 0, scroll: 0 };\n #swaps = new Set<number>();\n\n constructor() {\n super();\n const r = this.root;\n r.addEventListener('click', (e) => this.#onClick(e));\n r.addEventListener('keydown', (e) => this.#onKey(e as KeyboardEvent));\n r.addEventListener('input', (e) => this.#onInput(e));\n r.addEventListener('focusin', () => this.#hold('panel', true));\n r.addEventListener('focusout', (e) => {\n const to = (e as FocusEvent).relatedTarget as Node | null;\n this.#hold('panel', !!to && this.content.contains(to));\n });\n }\n\n override get data(): MemoryPanelData | undefined {\n return super.data;\n }\n\n /** Setting data ends every optimistic change: the panel shows exactly the stores you pass. */\n override set data(value: MemoryPanelData | undefined) {\n this.#adopt(value);\n super.data = value;\n }\n\n attributeChangedCallback(): void {\n this.#chrome = '';\n this.requestRender();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.#undo && !this.#undo.timer) this.#armUndo();\n }\n\n override disconnectedCallback(): void {\n for (const k of ['notice', 'armed', 'settle', 'scroll'] as const) {\n clearTimeout(this.#timers[k]);\n this.#timers[k] = 0;\n }\n const u = this.#undo;\n if (u?.timer) {\n clearTimeout(u.timer);\n u.timer = 0;\n u.left = Math.max(0, u.left - (Date.now() - u.started));\n }\n for (const id of this.#swaps) clearTimeout(id);\n this.#swaps.clear();\n for (const st of this.#rolls.values()) cancelAnimationFrame(st.raf);\n this.#rolls.clear();\n this.#notice = null;\n this.#armed = null;\n this.#holds = { hover: false, panel: false };\n }\n\n get #t(): Strings {\n return (this.getAttribute('lang') ?? '').toLowerCase().startsWith('ko') ? STRINGS.ko : STRINGS.en;\n }\n\n get #ro(): boolean {\n const r = this.data?.readOnly;\n return r === true || typeof r === 'string';\n }\n\n #store(id: string | null | undefined): WorkStore | undefined {\n return id == null ? undefined : this.#work.find((s) => s.id === id);\n }\n\n // ── data ──\n\n #adopt(d: MemoryPanelData | undefined): void {\n const list = Array.isArray(d?.stores) ? d.stores : [];\n this.#work = list\n .filter((s) => s && s.id != null)\n .map((s) => ({\n id: String(s.id),\n label: String(s.label ?? s.id),\n file: s.file ? String(s.file) : '',\n limit: num(s.limit),\n per: num(s.perEntryLimit),\n sep: typeof s.separator === 'string' ? s.separator : '',\n entries: (Array.isArray(s.entries) ? s.entries : []).map((e) => String(e ?? '')),\n }));\n const ro = d?.readOnly === true || typeof d?.readOnly === 'string';\n // An open editor is re-attached to its entry (found by its text, only when unique); else a changed draft\n // moves to that store's add box — nothing typed is lost.\n const e = this.#editing;\n if (e) {\n const s = this.#store(e.store);\n const at = s ? s.entries.indexOf(e.orig) : -1;\n if (!ro && s && at >= 0 && s.entries.lastIndexOf(e.orig) === at) e.index = at;\n else {\n this.#editing = null;\n if (s && !ro && e.draft !== e.orig) this.#keepDraft(s.id, e.draft);\n }\n }\n if (ro) {\n this.#adding = {};\n this.#armed = null;\n this.#dropUndo();\n }\n if (this.#view.store && !this.#store(this.#view.store)) this.#view = { ...this.#view, store: null };\n if (this.#undo && !this.#store(this.#undo.store)) this.#dropUndo();\n const a = this.#armed;\n if (a && this.#store(a.store)?.entries.length !== a.n) this.#armed = null;\n }\n\n // ── rendering ──\n\n /** The static chrome: chips, search, tray. The groups are painted into `.mm-list`. */\n protected render(): string {\n const d = this.data;\n const t = this.#t;\n const title = d?.title ? String(d.title) : '';\n const reason = typeof d?.readOnly === 'string' ? d.readOnly : '';\n let chips = `<button type=\"button\" class=\"mm-chip\" role=\"radio\" data-act=\"chip\" data-all data-key=\"chip-all\" aria-checked=\"false\" tabindex=\"-1\">${esc(t.all)} <span class=\"mm-chip-n\"></span></button>`;\n for (const s of this.#work)\n chips += `<button type=\"button\" class=\"mm-chip\" role=\"radio\" data-act=\"chip\" data-pick=\"${escAttr(s.id)}\" data-key=\"${escAttr(`chip|${s.id}`)}\" aria-checked=\"false\" tabindex=\"-1\">${esc(s.label)} <span class=\"mm-chip-n\"></span></button>`;\n return `<section class=\"mm\" role=\"group\" ${title ? 'aria-labelledby=\"mm-title\"' : `aria-label=\"${escAttr(t.panel)}\"`}>\n${title ? `<div class=\"mm-head\"><span class=\"mm-title\" id=\"mm-title\">${esc(title)}</span><span class=\"mm-count\" aria-hidden=\"true\"></span></div>` : ''}<div class=\"mm-filters\">\n<div class=\"mm-chips\" role=\"radiogroup\" aria-label=\"${escAttr(t.stores)}\">${chips}</div>\n<div class=\"mm-search\" id=\"mm-search\" inert>${SEARCH_SVG}<input type=\"search\" class=\"mm-q\" data-key=\"q\" placeholder=\"${escAttr(t.searchPh)}\" aria-label=\"${escAttr(t.search)}\" autocomplete=\"off\" spellcheck=\"false\"><button type=\"button\" class=\"mm-icon\" data-act=\"search-close\" data-key=\"search-close\" aria-label=\"${escAttr(t.closeSearch)}\"><span aria-hidden=\"true\">×</span></button></div>\n<button type=\"button\" class=\"mm-icon mm-search-open\" data-act=\"search-open\" data-key=\"search-open\" aria-label=\"${escAttr(t.search)}\" aria-expanded=\"false\" aria-controls=\"mm-search\">${SEARCH_SVG}</button>\n</div>${reason ? `<p class=\"mm-note\">${esc(reason)}</p>` : ''}\n<div class=\"mm-list\"></div>\n<div class=\"mm-foot\"><span class=\"mm-caption\" aria-hidden=\"true\"></span><span class=\"sr-only mm-live\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">${esc(this.#trayState().live)}</span><button type=\"button\" class=\"mm-undo\" data-act=\"undo\" data-key=\"undo\" hidden>${esc(t.undo)}</button></div>\n</section>`;\n }\n\n /** Renders are deferred while a deleted row folds away, so the host's answer never cuts the fold short. */\n protected override update(): void {\n if (this.#timers.settle) return;\n this.#paintAll();\n }\n\n #sig(): string {\n const d = this.data;\n return JSON.stringify([\n this.#t.all,\n d?.title ?? '',\n typeof d?.readOnly === 'string' ? d.readOnly : '',\n this.#work.map((s) => [s.id, s.label]),\n ]);\n }\n\n #paintAll(): void {\n if (this.#timers.settle) {\n clearTimeout(this.#timers.settle);\n this.#timers.settle = 0;\n }\n if (!this.data || !Array.isArray(this.data.stores)) {\n this.content.innerHTML = '';\n this.#chrome = '';\n this.#trayItem = null;\n return;\n }\n this.#keepFocus(() => {\n const sig = this.#sig();\n if (sig !== this.#chrome) this.#buildChrome(sig);\n this.#paintList();\n });\n this.#applyView();\n }\n\n #buildChrome(sig: string): void {\n for (const st of this.#rolls.values()) cancelAnimationFrame(st.raf);\n this.#rolls.clear();\n this.#trayKey = '';\n this.#trayItem = null;\n this.#holds.hover = false;\n this.content.innerHTML = this.render();\n this.#chrome = sig;\n const q = this.$<HTMLInputElement>('.mm-q');\n if (q) q.value = this.#view.q;\n const foot = this.$('.mm-foot');\n foot?.addEventListener('pointerenter', (e) => {\n if ((e as PointerEvent).pointerType !== 'touch') this.#hold('hover', true);\n });\n foot?.addEventListener('pointerleave', () => this.#hold('hover', false));\n }\n\n #paintList(): void {\n const list = this.$('.mm-list');\n if (!list) return;\n const t = this.#t;\n const ro = this.#ro;\n let html = '';\n this.#work.forEach((s, si) => {\n html += this.#groupHtml(s, si, t, ro);\n });\n html +=\n '<div class=\"mm-fold mm-nomatch-f\" inert><div class=\"mm-clip\"><p class=\"mm-empty mm-nomatch\"></p></div></div>';\n list.innerHTML = html;\n this.#painted = new Map(this.#work.map((s) => [s.id, s.entries.slice()]));\n // Values are set, not rendered: a textarea's leading newline would not survive the parser.\n for (const s of this.#work) {\n const box = this.#byKey(`new|${s.id}`) as HTMLTextAreaElement | null;\n if (box) {\n box.value = this.#drafts[s.id] ?? '';\n this.#paintCount(s);\n if (this.#adding[s.id]) grow(box);\n }\n }\n const e = this.#editing;\n if (e) {\n const ta = this.#byKey(`edit|${e.store}`) as HTMLTextAreaElement | null;\n if (ta) {\n ta.value = e.draft;\n grow(ta);\n }\n }\n }\n\n #groupHtml(s: WorkStore, si: number, t: Strings, ro: boolean): string {\n const v = this.#view;\n const q = v.q.trim();\n const keys = entryKeys(s.entries);\n const used = storeUsed(s.entries, s.sep);\n const level = usageLevel(used, s.limit);\n let rows = '';\n let shown = 0;\n s.entries.forEach((text, i) => {\n const show = this.#rowShown(s, i, text);\n if (show) shown++;\n const editing = !ro && this.#editing?.store === s.id && this.#editing.index === i;\n rows += `<li><div class=\"mm-fold mm-rowf\" data-row=\"${keys[i]}\" data-i=\"${i}\"${show ? ' data-open' : ' inert'}><div class=\"mm-clip\">${\n editing ? this.#editorHtml(s, i, t) : this.#rowHtml(s, i, text, keys[i], t, ro)\n }</div></div></li>`;\n });\n const open = (!v.store || v.store === s.id) && (shown > 0 || !q);\n const val =\n s.limit > 0 ? t.of(fmtInt(used), fmtInt(s.limit)) + (level === 'full' ? t.full : '') : t.chars(fmtInt(used));\n const bar =\n s.limit > 0\n ? `<span class=\"mm-bar\" role=\"meter\" aria-valuemin=\"0\" aria-valuemax=\"${s.limit}\" aria-valuenow=\"${Math.min(used, s.limit)}\" aria-valuetext=\"${escAttr(val)}\" aria-label=\"${escAttr(t.usage(s.label))}\"><i style=\"width:${Math.min(100, (used / s.limit) * 100).toFixed(2)}%\"></i></span>`\n : '';\n let html = `<section class=\"mm-group mm-fold\" data-store=\"${escAttr(s.id)}\"${open ? ' data-open' : ' inert'} aria-labelledby=\"mm-h-${si}\"><div class=\"mm-clip\">\n<div class=\"mm-ghead\"><h3 id=\"mm-h-${si}\">${esc(s.label)}${s.file ? ` <span class=\"mm-file\">${esc(s.file)}</span>` : ''}</h3><div class=\"mm-usage\" data-level=\"${level}\">${bar}<span class=\"mm-uval\"${bar ? ' aria-hidden=\"true\"' : ''}>${esc(val)}</span></div></div>`;\n if (!s.entries.length) html += `<p class=\"mm-empty\">${esc(ro ? t.emptyRo : t.empty)}</p>`;\n html += `<ol class=\"mm-items\">${rows}</ol>`;\n if (!ro) {\n const adding = !!this.#adding[s.id];\n const armed = this.#armed?.store === s.id;\n html += `<div class=\"mm-fold mm-addf\" data-addline${adding ? ' inert' : ' data-open'}><div class=\"mm-clip\"><div class=\"mm-addline\"><button type=\"button\" class=\"mm-add\" data-act=\"add-open\" data-key=\"${escAttr(`add|${s.id}`)}\" aria-expanded=\"${adding}\" aria-controls=\"mm-new-${si}\"><span aria-hidden=\"true\">+</span> ${esc(t.addTo(s.label))}</button>${\n s.entries.length\n ? `<button type=\"button\" class=\"mm-clear\" data-act=\"clear\" data-key=\"${escAttr(`clear|${s.id}`)}\"${armed ? ' data-armed' : ''}>${esc(armed ? t.clearN(s.entries.length) : t.clear)}</button>`\n : ''\n }</div></div></div>\n<div class=\"mm-fold mm-newf\" id=\"mm-new-${si}\" data-newbox${adding ? ' data-open' : ' inert'}><div class=\"mm-clip\"><div class=\"mm-new\"><label class=\"mm-label\" for=\"mm-ta-${si}\">${esc(\n t.newLabel(s.per > 0 ? fmtInt(s.per) : ''),\n )}</label><textarea id=\"mm-ta-${si}\" class=\"mm-edit\" data-key=\"${escAttr(`new|${s.id}`)}\" rows=\"2\"></textarea><div class=\"mm-line\"><span class=\"mm-counter\" data-count></span><span class=\"mm-acts is-on\"><button type=\"button\" class=\"mm-act\" data-act=\"add-close\" data-key=\"${escAttr(`addc|${s.id}`)}\">${esc(t.cancel)}</button><button type=\"button\" class=\"mm-act mm-act-main\" data-act=\"add-save\" data-key=\"${escAttr(`adds|${s.id}`)}\">${esc(t.add)}</button></span></div></div></div></div>`;\n }\n return `${html}</div></section>`;\n }\n\n #rowHtml(s: WorkStore, i: number, text: string, key: string, t: Strings, ro: boolean): string {\n const len = text.length;\n const short = shortText(text);\n const acts = ro\n ? ''\n : `<span class=\"mm-acts\"><button type=\"button\" class=\"mm-act\" data-act=\"edit\" data-key=\"${escAttr(`ed|${s.id}|${key}`)}\" aria-label=\"${escAttr(t.editName(short))}\">${esc(t.edit)}</button><button type=\"button\" class=\"mm-act mm-act-del\" data-act=\"delete\" data-key=\"${escAttr(`del|${s.id}|${key}`)}\" aria-label=\"${escAttr(t.delName(short))}\">${esc(t.del)}</button></span>`;\n return `<div class=\"mm-row\"><p class=\"mm-text\">${esc(text)}</p><div class=\"mm-meta\"><span class=\"mm-src\">#${i + 1} · ${esc(t.chars(fmtInt(len)))}${\n s.per > 0 && len > s.per ? ` · <span class=\"mm-over\">${esc(t.over)}</span>` : ''\n }</span>${acts}</div></div>`;\n }\n\n #editorHtml(s: WorkStore, i: number, t: Strings): string {\n const c = this.#editCount(s, this.#editing?.draft ?? '');\n return `<div class=\"mm-row\" data-editing><textarea class=\"mm-edit\" data-key=\"${escAttr(`edit|${s.id}`)}\" rows=\"1\" aria-label=\"${escAttr(t.editField(s.label, i + 1))}\"></textarea><div class=\"mm-meta\"><span class=\"mm-counter${c.over ? ' is-over' : ''}\" data-ecount>${esc(c.text)}</span><span class=\"mm-acts is-on\"><button type=\"button\" class=\"mm-act\" data-act=\"cancel\" data-key=\"${escAttr(`cancel|${s.id}`)}\">${esc(t.cancel)}</button><button type=\"button\" class=\"mm-act mm-act-main\" data-act=\"save\" data-key=\"${escAttr(`save|${s.id}`)}\">${esc(t.save)}</button></span></div></div>`;\n }\n\n #editCount(s: WorkStore, draft: string): { text: string; over: boolean } {\n const n = draft.trim().length;\n return {\n text: s.per > 0 ? `${fmtInt(n)} / ${this.#t.chars(fmtInt(s.per))}` : this.#t.chars(fmtInt(n)),\n over: s.per > 0 && n > s.per,\n };\n }\n\n #paintCount(s: WorkStore): void {\n const el = this.#group(s.id)?.querySelector<HTMLElement>('[data-count]');\n if (!el) return;\n const t = this.#t;\n const draft = this.#drafts[s.id] ?? '';\n const total = usageAfterAdd(s.entries, s.sep, draft);\n const over = s.limit > 0 && total > s.limit ? total - s.limit : 0;\n const long = s.per > 0 && draft.trim().length > s.per;\n el.textContent =\n t.after(fmtInt(total), s.limit > 0 ? fmtInt(s.limit) : '') +\n (over ? t.overBy(fmtInt(over)) : '') +\n (long ? t.tooLong : '');\n el.classList.toggle('is-over', !!over || long);\n }\n\n #rowShown(s: WorkStore, i: number, text: string): boolean {\n const v = this.#view;\n if (v.store && v.store !== s.id) return false;\n if (this.#editing?.store === s.id && this.#editing.index === i) return true;\n return entryMatches(text, v.q, s);\n }\n\n /** Fold rows and groups to the chip + search without repainting (what is typed stays put). */\n #applyView(): void {\n const v = this.#view;\n const q = v.q.trim();\n let any = false;\n for (const g of this.$$('.mm-group')) {\n const s = this.#store(g.dataset.store);\n if (!s) continue;\n const texts = this.#painted.get(s.id) ?? [];\n let shown = 0;\n for (const f of Array.from(g.querySelectorAll<HTMLElement>('.mm-rowf'))) {\n if (f.hasAttribute('data-leaving')) continue;\n const i = Number(f.dataset.i);\n const text = texts[i] ?? '';\n const show = this.#rowShown(s, i, text);\n if (show) shown++;\n fold(f, show);\n const p = f.querySelector('.mm-text');\n const hl = show ? q : '';\n if (p && (f.dataset.hl ?? '') !== hl) {\n p.innerHTML = hl ? highlight(text, hl) : esc(text);\n f.dataset.hl = hl;\n }\n }\n if (shown) any = true;\n fold(g, (!v.store || v.store === s.id) && (shown > 0 || !q));\n }\n fold(this.$('.mm-nomatch-f'), !!q && !any);\n const nm = this.$('.mm-nomatch');\n if (nm && q) nm.textContent = this.#t.noMatch(q);\n this.#sync();\n }\n\n /** Chrome after any change: chip state (one tab stop) and counts, search state, head count, tray. */\n #sync(): void {\n if (!this.$('.mm')) return;\n const v = this.#view;\n const total = this.#work.reduce((n, s) => n + s.entries.length, 0);\n for (const chip of this.$$('.mm-chip')) {\n const id = chip.hasAttribute('data-all') ? null : (chip.dataset.pick ?? null);\n const on = id === v.store;\n chip.setAttribute('aria-checked', on ? 'true' : 'false');\n chip.tabIndex = on ? 0 : -1;\n const n = chip.querySelector('.mm-chip-n');\n if (n) n.textContent = fmtInt(id === null ? total : (this.#store(id)?.entries.length ?? 0));\n }\n this.$('.mm-filters')?.toggleAttribute('data-searching', v.searching);\n this.$('.mm-chips')?.toggleAttribute('inert', v.searching);\n this.$('.mm-search')?.toggleAttribute('inert', !v.searching);\n const opener = this.$('.mm-search-open');\n if (opener) {\n opener.setAttribute('aria-expanded', v.searching ? 'true' : 'false');\n opener.toggleAttribute('inert', v.searching);\n }\n this.#roll(this.$('.mm-count'), total);\n this.#paintTray();\n }\n\n // ── focus ──\n\n #byKey(key: string): HTMLElement | null {\n return this.$$('[data-key]').find((el) => el.dataset.key === key) ?? null;\n }\n\n #group(id: string): HTMLElement | null {\n return this.$$('.mm-group').find((g) => g.dataset.store === id) ?? null;\n }\n\n #chip(id: string | null): HTMLElement | null {\n return id === null ? this.#byKey('chip-all') : this.#byKey(`chip|${id}`);\n }\n\n #focus(el: Element | null | undefined): boolean {\n const h = el as HTMLElement | null | undefined;\n if (!h || h.closest('[inert]') || (h as HTMLButtonElement).disabled) return false;\n h.focus({ preventScroll: true });\n return true;\n }\n\n #focusKey(key: string): boolean {\n return this.#focus(this.#byKey(key));\n }\n\n #focusRow(kind: 'ed' | 'del', s: WorkStore, i: number): void {\n const key = entryKeys(s.entries)[i];\n if (!key || !this.#focusKey(`${kind}|${s.id}|${key}`))\n this.#focusKey(`add|${s.id}`) || this.#focus(this.#chip(this.#view.store));\n }\n\n /**\n * Repaint without losing focus: the focused key comes back (rows are keyed by content, so a host answer that\n * shifts indices keeps focus on the same entry); a key that is gone falls back to the same action on the row\n * now at that place, then the store's add button, then the selected chip.\n */\n #keepFocus(fn: () => void): void {\n // (asked of the host's root first: focus inside another shadow tree is not ours)\n const a =\n (this.getRootNode() as Document | ShadowRoot).activeElement === this\n ? (this.root.activeElement as HTMLElement | null)\n : null;\n const key = a?.dataset?.key ?? '';\n const field = a as HTMLInputElement | null;\n const sel = a && 'selectionStart' in a ? [field!.selectionStart, field!.selectionEnd] : null;\n const store = a?.closest<HTMLElement>('.mm-group')?.dataset.store;\n const at = Number(a?.closest<HTMLElement>('.mm-rowf')?.dataset.i ?? 0);\n fn();\n if (!a || a.isConnected || !key) return;\n let next = this.#byKey(key);\n if (!next || next.closest('[inert]')) {\n next = null;\n const kind = key.split('|')[0];\n const s = this.#store(store);\n if (s && (kind === 'ed' || kind === 'del')) {\n const keys = entryKeys(s.entries);\n for (let j = Math.min(at, s.entries.length - 1); j >= 0 && !next; j--) {\n const el = this.#byKey(`${kind}|${s.id}|${keys[j]}`);\n if (el && !el.closest('[inert]')) next = el;\n }\n }\n if (!next && s) {\n const add = this.#byKey(`add|${s.id}`);\n if (add && !add.closest('[inert]')) next = add;\n }\n next ??= this.#chip(this.#view.store);\n }\n if (!next) return;\n next.focus({ preventScroll: true });\n if (sel && sel[0] != null && 'setSelectionRange' in next) {\n try {\n (next as HTMLInputElement).setSelectionRange(sel[0], sel[1]);\n } catch {\n /* not a text field */\n }\n }\n }\n\n // ── events from the shadow tree ──\n\n #onClick(e: Event): void {\n const b = (e.target as Element | null)?.closest?.<HTMLElement>('[data-act]');\n if (!b || (b as HTMLButtonElement).disabled) return;\n const sid = b.closest<HTMLElement>('.mm-group')?.dataset.store ?? '';\n const row = b.closest<HTMLElement>('.mm-rowf')?.dataset.row ?? '';\n switch (b.dataset.act) {\n case 'chip':\n this.#pick(b.hasAttribute('data-all') ? null : (b.dataset.pick ?? null));\n break;\n case 'search-open':\n this.#searchOpen();\n break;\n case 'search-close':\n this.#searchClose();\n break;\n case 'edit':\n this.#editStart(sid, row);\n break;\n case 'delete':\n this.#delete(sid, row);\n break;\n case 'cancel':\n this.#editCancel();\n break;\n case 'save':\n this.#editSave();\n break;\n case 'add-open':\n this.#addOpen(sid);\n break;\n case 'add-close':\n this.#addClose(sid);\n break;\n case 'add-save':\n this.#add(sid);\n break;\n case 'clear':\n this.#clear(sid);\n break;\n case 'undo':\n this.#restore();\n break;\n }\n }\n\n #onKey(e: KeyboardEvent): void {\n const el = e.target as HTMLElement;\n // Key guard: a held Enter repeats the click — on a Delete that the next row's Delete replaces, that would\n // delete row after row. Repeats never activate a button.\n if (e.repeat && e.key === 'Enter' && el.tagName === 'BUTTON') {\n e.preventDefault();\n return;\n }\n if (el.closest('.mm-chips')) {\n this.#chipKey(e);\n return;\n }\n if (el.closest('.mm-search')) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n this.#searchClose();\n }\n return;\n }\n const key = el.dataset?.key ?? '';\n const isEdit = key.startsWith('edit|');\n if (isEdit || key.startsWith('new|')) {\n // Never while an IME is composing: Korean input commits its syllable with Enter.\n if (e.isComposing || e.keyCode === 229) return;\n const sid = el.closest<HTMLElement>('.mm-group')?.dataset.store ?? '';\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (isEdit) this.#editSave();\n else this.#add(sid);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n if (isEdit) this.#editCancel();\n else this.#addClose(sid);\n }\n return;\n }\n if (e.key === 'Escape' && this.#armed) {\n e.stopPropagation();\n this.#disarm();\n }\n }\n\n #onInput(e: Event): void {\n const el = e.target as HTMLInputElement | HTMLTextAreaElement;\n const key = el.dataset?.key ?? '';\n if (key === 'q') {\n this.#view = { store: null, q: el.value, searching: true };\n this.#applyView();\n return;\n }\n const sid = el.closest<HTMLElement>('.mm-group')?.dataset.store ?? '';\n const s = this.#store(sid);\n if (!s) return;\n if (key.startsWith('edit|') && this.#editing?.store === sid) {\n this.#editing.draft = el.value;\n grow(el as HTMLTextAreaElement);\n const c = this.#editCount(s, el.value);\n const out = el.closest('.mm-row')?.querySelector<HTMLElement>('[data-ecount]');\n if (out) {\n out.textContent = c.text;\n out.classList.toggle('is-over', c.over);\n }\n } else if (key.startsWith('new|')) {\n this.#drafts[sid] = el.value;\n grow(el as HTMLTextAreaElement);\n this.#paintCount(s);\n }\n }\n\n // ── chips + search ──\n\n #pick(id: string | null): void {\n this.#view = { ...this.#view, store: id && this.#store(id) ? id : null };\n this.#applyView();\n }\n\n /** One tab stop; arrows move and select (wrapping), Home / End. */\n #chipKey(e: KeyboardEvent): void {\n const keys = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End'];\n if (!keys.includes(e.key)) return;\n e.preventDefault();\n const order: Array<string | null> = [null, ...this.#work.map((s) => s.id)];\n const cur = Math.max(0, order.indexOf(this.#view.store));\n const step = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : -1;\n const next = e.key === 'Home' ? 0 : e.key === 'End' ? order.length - 1 : (cur + step + order.length) % order.length;\n this.#pick(order[next]);\n const chip = this.#chip(order[next]);\n if (chip) {\n chip.focus();\n chip.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n }\n\n #searchOpen(): void {\n this.#view = { store: null, q: '', searching: true };\n const q = this.$<HTMLInputElement>('.mm-q');\n if (q) q.value = '';\n this.#applyView();\n q?.focus();\n }\n\n #searchClose(): void {\n this.#view = { store: null, q: '', searching: false };\n const q = this.$<HTMLInputElement>('.mm-q');\n if (q) q.value = '';\n this.#applyView();\n this.#focusKey('search-open');\n }\n\n // ── edit ──\n\n /** The open editor's index, re-checked against its text (rows above may have moved). */\n #editIndex(s: WorkStore, e: Editing): number {\n if (s.entries[e.index] === e.orig) return e.index;\n return s.entries.indexOf(e.orig);\n }\n\n #editStart(sid: string, key: string): void {\n const s = this.#store(sid);\n if (!s || this.#ro) return;\n const i = entryKeys(s.entries).indexOf(key);\n if (i < 0) return;\n const prev = this.#editing;\n if (prev && prev.draft !== prev.orig && !(prev.store === sid && prev.index === i))\n this.#keepDraft(prev.store, prev.draft);\n this.#editing = { store: sid, index: i, orig: s.entries[i], draft: s.entries[i] };\n this.#disarm(false);\n this.#paintAll();\n const ta = this.#byKey(`edit|${sid}`) as HTMLTextAreaElement | null;\n if (ta) {\n ta.focus();\n ta.setSelectionRange?.(ta.value.length, ta.value.length);\n grow(ta);\n }\n }\n\n #editCancel(): void {\n const e = this.#editing;\n if (!e) return;\n this.#editing = null;\n const s = this.#store(e.store);\n this.#paintAll();\n if (s) this.#focusRow('ed', s, Math.max(0, this.#indexOfText(s, e.orig, e.index)));\n }\n\n #indexOfText(s: WorkStore, text: string, near: number): number {\n return s.entries[near] === text ? near : s.entries.indexOf(text);\n }\n\n #editSave(): void {\n const e = this.#editing;\n const s = e ? this.#store(e.store) : undefined;\n if (!e || !s) return;\n const ta = this.#byKey(`edit|${s.id}`) as HTMLTextAreaElement | null;\n const text = ta ? ta.value : e.draft;\n const t = this.#t;\n if (!text.trim()) {\n this.#say(t.emptyEntry, true);\n return;\n }\n const i = this.#editIndex(s, e);\n if (i < 0) return;\n // Unchanged once both sides are trimmed (the store trims what it saves): close without an event.\n if (isSameEdit(text, e.orig)) {\n this.#editing = null;\n this.#paintAll();\n this.#focusRow('ed', s, i);\n return;\n }\n if (!this.emit<MemoryEditDetail>('ui-edit', { store: s.id, index: i, text, previous: e.orig })) return;\n s.entries[i] = text;\n this.#editing = null;\n this.#say(t.saved);\n this.#paintAll();\n this.#focusRow('ed', s, i);\n }\n\n // ── delete + undo ──\n\n #delete(sid: string, key: string): void {\n if (this.#ro) return;\n if (this.#timers.settle) this.#paintAll(); // a previous fold still running: finish it first\n const s = this.#store(sid);\n if (!s) return;\n const i = entryKeys(s.entries).indexOf(key);\n if (i < 0) return;\n const text = s.entries[i];\n if (!this.emit<MemoryDeleteDetail>('ui-delete', { store: sid, index: i, text })) return;\n const g = this.#group(sid);\n const row = g?.querySelector<HTMLElement>(`.mm-rowf[data-i=\"${i}\"]`) ?? null;\n if (row) {\n row.setAttribute('data-leaving', '');\n fold(row, false);\n }\n if (g && row) this.#focusAfterDelete(g, row);\n s.entries.splice(i, 1);\n const e = this.#editing;\n if (e?.store === sid && e.index > i) e.index--;\n this.#dropUndo();\n this.#undo = { store: sid, index: i, text, seq: ++this.#seq, left: UNDO_MS, started: 0, timer: 0 };\n this.#armUndo();\n this.#disarm(false);\n this.#sync();\n // The row folds away (rows 320 ms, opacity + blur 200 ms); the groups repaint after the fold.\n if (row && !prefersReducedMotion())\n this.#timers.settle = window.setTimeout(() => {\n this.#timers.settle = 0;\n this.#paintAll();\n }, FOLD_MS);\n else this.#paintAll();\n }\n\n /**\n * Focus after a delete: the next row the view shows, else the nearest shown row before it, else the store's add\n * button, else the search box / the selected chip.\n */\n #focusAfterDelete(g: HTMLElement, row: HTMLElement): void {\n const rows = Array.from(g.querySelectorAll<HTMLElement>('.mm-rowf'));\n const at = rows.indexOf(row);\n const del = (f: HTMLElement) =>\n f !== row && !f.hasAttribute('data-leaving') && this.#focus(f.querySelector('[data-act=\"delete\"]'));\n for (let j = at + 1; j < rows.length; j++) if (del(rows[j])) return;\n for (let j = at - 1; j >= 0; j--) if (del(rows[j])) return;\n if (!g.hasAttribute('inert')) {\n if (this.#focus(g.querySelector('[data-act=\"add-open\"]'))) return;\n if (this.#focus(g.querySelector('textarea[data-key^=\"new|\"]'))) return;\n }\n if (this.#view.searching && this.#focus(this.$('.mm-q'))) return;\n this.#focus(this.#chip(this.#view.store));\n }\n\n #held(): boolean {\n return this.#holds.hover || this.#holds.panel;\n }\n\n /** The undo window: 5 s, paused while the pointer rests on the tray or focus is anywhere in the panel. */\n #armUndo(): void {\n const u = this.#undo;\n if (!u) return;\n clearTimeout(u.timer);\n u.timer = 0;\n u.started = Date.now();\n if (this.#held() || !this.isConnected) return;\n u.timer = window.setTimeout(\n () => {\n u.timer = 0;\n if (this.#undo !== u) return;\n this.#undo = null;\n this.#paintTray();\n },\n Math.max(0, u.left),\n );\n }\n\n #hold(kind: 'hover' | 'panel', on: boolean): void {\n const was = this.#held();\n this.#holds[kind] = on;\n const held = this.#held();\n const u = this.#undo;\n if (held === was || !u) return;\n if (!held) this.#armUndo();\n else if (u.timer) {\n clearTimeout(u.timer);\n u.timer = 0;\n u.left = Math.max(0, u.left - (Date.now() - u.started));\n }\n }\n\n #dropUndo(): void {\n if (this.#undo?.timer) clearTimeout(this.#undo.timer);\n this.#undo = null;\n }\n\n #restore(): void {\n const u = this.#undo;\n if (!u || this.#ro) return;\n const s = this.#store(u.store);\n this.#dropUndo();\n if (!s) return;\n if (!this.emit<MemoryRestoreDetail>('ui-restore', { store: u.store, index: u.index, text: u.text })) {\n // refused: the text is not lost — it waits in the store's add box\n this.#keepDraft(s.id, u.text);\n this.#paintAll();\n this.#focusKey(`new|${s.id}`);\n return;\n }\n const at = Math.min(u.index, s.entries.length);\n s.entries.splice(at, 0, u.text);\n const e = this.#editing;\n if (e?.store === s.id && e.index >= at) e.index++;\n this.#say(this.#t.restored);\n this.#paintAll();\n this.#reveal(s, at, true);\n }\n\n /** A row that came back or was added: shown under the view (else the view resets), unfolded, scrolled to. */\n #reveal(s: WorkStore, i: number, focusEdit: boolean): void {\n const text = s.entries[i];\n if (text === undefined) return;\n const v = this.#view;\n if ((v.store && v.store !== s.id) || !entryMatches(text, v.q, s)) {\n this.#view = { store: null, q: '', searching: false };\n const q = this.$<HTMLInputElement>('.mm-q');\n if (q) q.value = '';\n this.#applyView();\n }\n const key = entryKeys(s.entries)[i];\n const f = this.#group(s.id)?.querySelector<HTMLElement>(`.mm-rowf[data-i=\"${i}\"]`);\n const reduced = prefersReducedMotion();\n if (f && !reduced) {\n f.removeAttribute('data-open');\n void f.offsetHeight; // start the unfold from closed\n f.setAttribute('data-open', '');\n }\n clearTimeout(this.#timers.scroll);\n if (f)\n this.#timers.scroll = window.setTimeout(() => {\n this.#timers.scroll = 0;\n f.scrollIntoView?.({ block: 'nearest', behavior: reduced ? 'auto' : 'smooth' });\n }, REVEAL_SCROLL_MS);\n if (focusEdit) this.#focusKey(`ed|${s.id}|${key}`);\n }\n\n // ── add + clear ──\n\n /** A draft that has to leave its editor waits in the store's add box (appended when the box has text). */\n #keepDraft(sid: string, text: string): void {\n if (!text.trim()) return;\n const cur = this.#drafts[sid] ?? '';\n if (cur === text) return;\n this.#drafts[sid] = cur.trim() ? `${cur}\\n\\n${text}` : text;\n this.#adding[sid] = true;\n }\n\n #addOpen(sid: string): void {\n const s = this.#store(sid);\n const g = this.#group(sid);\n if (!s || !g || this.#ro) return;\n this.#adding[sid] = true;\n fold(g.querySelector('[data-addline]'), false);\n fold(g.querySelector('[data-newbox]'), true);\n g.querySelector('[data-act=\"add-open\"]')?.setAttribute('aria-expanded', 'true');\n const ta = g.querySelector<HTMLTextAreaElement>('textarea[data-key^=\"new|\"]');\n grow(ta);\n ta?.focus();\n this.#disarm(false);\n this.#paintTray();\n }\n\n /** Closing keeps the draft in the box. */\n #addClose(sid: string): void {\n const g = this.#group(sid);\n this.#adding[sid] = false;\n if (!g) return;\n fold(g.querySelector('[data-newbox]'), false);\n fold(g.querySelector('[data-addline]'), true);\n const b = g.querySelector<HTMLElement>('[data-act=\"add-open\"]');\n b?.setAttribute('aria-expanded', 'false');\n b?.focus();\n this.#paintTray();\n }\n\n #add(sid: string): void {\n const s = this.#store(sid);\n if (!s || this.#ro) return;\n const ta = this.#byKey(`new|${sid}`) as HTMLTextAreaElement | null;\n const text = ta ? ta.value : (this.#drafts[sid] ?? '');\n if (!text.trim()) return;\n if (!this.emit<MemoryAddDetail>('ui-add', { store: sid, text })) return;\n s.entries.push(text);\n this.#drafts[sid] = '';\n this.#adding[sid] = false;\n this.#say(this.#t.added);\n this.#paintAll();\n this.#reveal(s, s.entries.length - 1, false);\n this.#focusKey(`add|${sid}`);\n }\n\n /** Two presses within 4 s: the first names the count, the second sends `ui-clear`. No undo. */\n #clear(sid: string): void {\n const s = this.#store(sid);\n if (!s || this.#ro || !s.entries.length) return;\n const a = this.#armed;\n if (!a || a.store !== sid || a.n !== s.entries.length) {\n this.#armed = { store: sid, n: s.entries.length, seq: ++this.#seq };\n clearTimeout(this.#timers.armed);\n this.#timers.armed = window.setTimeout(() => {\n this.#timers.armed = 0;\n this.#disarm();\n }, ARM_MS);\n this.#paintClear();\n this.#paintTray();\n return;\n }\n this.#disarm(false);\n if (!this.emit<MemoryClearDetail>('ui-clear', { store: sid })) {\n this.#paintClear();\n this.#paintTray();\n return;\n }\n const e = this.#editing;\n if (e?.store === sid) {\n this.#editing = null;\n if (e.draft !== e.orig) this.#keepDraft(sid, e.draft);\n }\n s.entries = [];\n this.#say(this.#t.cleared);\n this.#paintAll();\n if (!this.#focusKey(`add|${sid}`)) this.#focusKey(`new|${sid}`);\n }\n\n #disarm(paint = true): void {\n clearTimeout(this.#timers.armed);\n this.#timers.armed = 0;\n if (!this.#armed) return;\n this.#armed = null;\n if (paint) {\n this.#paintClear();\n this.#paintTray();\n }\n }\n\n #paintClear(): void {\n const t = this.#t;\n for (const b of this.$$('.mm-clear')) {\n const s = this.#store(b.closest<HTMLElement>('.mm-group')?.dataset.store);\n const armed = !!s && this.#armed?.store === s.id;\n b.toggleAttribute('data-armed', armed);\n b.textContent = armed && s ? t.clearN(s.entries.length) : t.clear;\n }\n }\n\n // ── tray ──\n\n #say(text: string, fail = false): void {\n const n: Notice = { text, seq: ++this.#seq, fail };\n this.#notice = n;\n clearTimeout(this.#timers.notice);\n this.#timers.notice = window.setTimeout(() => {\n this.#timers.notice = 0;\n if (this.#notice !== n) return;\n this.#notice = null;\n this.#paintTray();\n }, NOTICE_MS);\n this.#paintTray();\n }\n\n /** The tray line by priority: Clear armed > Deleted + Undo > a 3 s notice > editing / adding hints > counts. */\n #trayState(): TrayState {\n const t = this.#t;\n const a = this.#armed;\n const as = a ? this.#store(a.store) : undefined;\n if (a && as) return { key: `armed-${a.seq}`, html: esc(t.armed), live: t.armedSr(as.label, a.n), tone: 'warn' };\n const u = this.#undo;\n if (u)\n return {\n key: `undo-${u.seq}`,\n html: `<span class=\"mm-forgot\"><span class=\"mm-flat\">${esc(t.deleted[0])}</span><b class=\"mm-quote\">${esc(u.text)}</b><span class=\"mm-flat\">${esc(t.deleted[1])}</span></span>`,\n live: t.deletedSr(shortText(u.text)),\n };\n const n = this.#notice;\n if (n) return { key: `notice-${n.seq}`, html: esc(n.text), live: n.text, tone: n.fail ? 'fail' : '' };\n if (this.#editing) return { key: 'editing', html: esc(t.editHint), live: t.editHint };\n if (!this.#ro && this.#work.some((s) => this.#adding[s.id]))\n return { key: 'adding', html: esc(t.addHint), live: t.addHint };\n const total = this.#work.reduce((sum, s) => sum + s.entries.length, 0);\n const cap = this.#work\n .map((s) => {\n const used = fmtInt(storeUsed(s.entries, s.sep));\n return ` · ${s.label} ${s.limit > 0 ? t.of(used, fmtInt(s.limit)) : t.chars(used)}`;\n })\n .join('');\n return {\n key: 'rest',\n total,\n cap,\n html: `<b class=\"mm-n\">${fmtInt(total)}</b>${esc(t.entries(total))}<span class=\"mm-cap\">${esc(cap)}</span>`,\n live: `${fmtInt(total)}${t.entries(total)}${cap}`,\n };\n }\n\n /** Swap the caption only when the state changes (in 320 ms / out 220 ms); the same state rolls its count. */\n #paintTray(): void {\n const cap = this.$('.mm-caption');\n if (!cap) return;\n const s = this.#trayState();\n const undo = this.$<HTMLButtonElement>('.mm-undo');\n if (undo) undo.hidden = !s.key.startsWith('undo-');\n const live = this.$('.mm-live');\n if (live && live.textContent !== s.live) live.textContent = s.live;\n const cur = this.#trayItem;\n if (cur && cur.isConnected && this.#trayKey === s.key) {\n if (s.key === 'rest') {\n this.#roll(cur.querySelector('.mm-n'), s.total ?? 0);\n const c = cur.querySelector('.mm-cap');\n if (c && c.textContent !== s.cap) c.textContent = s.cap ?? '';\n }\n return;\n }\n this.#trayKey = s.key;\n if (cur) {\n cur.setAttribute('data-out', '');\n const id = window.setTimeout(\n () => {\n this.#swaps.delete(id);\n cur.remove();\n },\n prefersReducedMotion() ? 0 : SWAP_OUT_MS,\n );\n this.#swaps.add(id);\n }\n const item = document.createElement('span');\n item.className = `mm-swap${s.tone ? ` is-${s.tone}` : ''}`;\n item.innerHTML = s.html;\n cap.append(item);\n this.#trayItem = item;\n // Drop roll state of count nodes that left the DOM (each tray swap replaces its node).\n for (const [node, st] of this.#rolls) {\n if (!node.isConnected) {\n cancelAnimationFrame(st.raf);\n this.#rolls.delete(node);\n }\n }\n const nb = item.querySelector('.mm-n');\n if (nb) this.#rolls.set(nb, { n: s.total ?? 0, raf: 0 });\n }\n\n /** Counts roll to their new value: 520 ms, ease-out quart; at once on first paint and with reduced motion. */\n #roll(el: Element | null, to: number): void {\n if (!el) return;\n const st = this.#rolls.get(el) ?? { n: Number.NaN, raf: 0 };\n if (st.raf && st.n === to) return; // already rolling there: a second repaint must not cut it short\n const from = Number.isFinite(st.n) ? st.n : to;\n st.n = to;\n if (st.raf) cancelAnimationFrame(st.raf);\n st.raf = 0;\n this.#rolls.set(el, st);\n if (from === to || prefersReducedMotion() || typeof requestAnimationFrame !== 'function') {\n el.textContent = fmtInt(to);\n return;\n }\n let t0 = 0;\n const step = (now: number) => {\n if (!t0) t0 = now;\n const p = Math.min(1, (now - t0) / ROLL_MS);\n el.textContent = fmtInt(Math.round(from + (to - from) * (1 - (1 - p) ** 4)));\n st.raf = p < 1 ? requestAnimationFrame(step) : 0;\n };\n st.raf = requestAnimationFrame(step);\n }\n}\n\ndefine('ui-memory-panel', UiMemoryPanel);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-memory-panel': UiMemoryPanel;\n }\n}\n"],"names":["e"],"mappings":"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"}
|