@mushi-mushi/web 0.5.0 → 0.7.0
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/CONTRIBUTING.md +4 -0
- package/README.md +41 -0
- package/SECURITY.md +74 -0
- package/dist/index.cjs +389 -79
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +389 -79
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/capture/console.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/mushi.ts"],"names":["MAX_ENTRIES","handleClick","handleError","handleUnhandledRejection","createLogger","noopLogger","createApiClient","createPreFilter","createOfflineQueue","createRateLimiter","createPiiScrubber","getDeviceFingerprintHash","captureEnvironment","getSessionId","getReporterToken"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached',\n elementButton: 'Select Element',\n elementSelected: 'Element selected',\n optional: '(optional)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み',\n optional: '(任意)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว',\n optional: '(ไม่บังคับ)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado',\n optional: '(opcional)',\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n if (!code) return en;\n const base = code.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n /* ── Trigger ─────────────────────────────────────────────────────\n A small \"stamp card\" — soft rounded square (4px radius), paper\n background, vermillion bottom edge that reads as the inked face\n of a real 印鑑. A pulsing dot in the top-right hints there's a\n channel here without needing a notification badge. */\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-trigger.bottom-right { bottom: 24px; right: 24px; }\n .mushi-trigger.bottom-left { bottom: 24px; left: 24px; }\n .mushi-trigger.top-right { top: 24px; right: 24px; }\n .mushi-trigger.top-left { top: 24px; left: 24px; }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n /* ── Panel ──────────────────────────────────────────────────────\n Paper-card. Sharper corners (6px) than typical SaaS modals\n (which default to 12-16px and read as plastic). Two-layer shadow:\n one hairline that sells the paper edge, one diffuse that lifts\n the panel off the underlying app. No backdrop-filter — we want\n the widget to feel like it sits ON the page, not blur INTO it. */\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right { bottom: 88px; right: 24px; --mushi-origin: bottom right; }\n .mushi-panel.bottom-left { bottom: 88px; left: 24px; --mushi-origin: bottom left; }\n .mushi-panel.top-right { top: 88px; right: 24px; --mushi-origin: top right; }\n .mushi-panel.top-left { top: 88px; left: 24px; --mushi-origin: top left; }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n /* ── Header ─────────────────────────────────────────────────────\n Editorial masthead: small mono eyebrow (\"MUSHI / REPORT\") on top,\n serif display headline below, mono step counter on the far right.\n A single hairline separates header from body — no card stacking. */\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n /* ── Step 1: Categories as a contents-page list ─────────────────\n No boxes. Hairline rules between rows. Hovering a row pulls a\n vermillion arrow in from the right and tints the row label —\n reads like flipping through an index card. */\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n\n /* ── Step 2: Selected-category breadcrumb + intent text-buttons ─\n Breadcrumb is a thin chip with the kanji-stamp aesthetic carried\n over (vermillion left rule). Intents are inline TEXT buttons\n with vermillion underlines on hover — not pill-shaped chips,\n which is the SaaS default and not what we are. */\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n /* ── Step 3: Borderless textarea + minimal attach pills ─────────\n The textarea has no box around it — just a hairline underline\n that turns vermillion on focus. Encourages writing rather than\n form-filling. */\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Footer + submit (vermillion stamp) ─────────────────────────\n Submit button is the heaviest visual moment in the widget —\n vermillion fill, mono-caps label, send arrow. Holds an ink-\n bloom pseudo-element that animates outward when pressed. */\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n /* ── Step indicator (numeral ledger) ────────────────────────────\n Replaces the generic three-dots with a typographic series:\n \"01 — 02 — 03\". The active step uses serif numerals, the\n others use mono so the active one literally reads heavier. */\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n /* ── Success: 朱印 stamp animation ──────────────────────────────\n The success state is the signature moment. A vermillion ring\n scribes itself, then a \"RECEIVED\" mono-caps label fades in at\n the centre, evoking a hanko being pressed onto the form. */\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n /* ── Error ──────────────────────────────────────────────────────\n Inline editorial note rather than a red box. Vermillion left\n rule keeps the same accent language. */\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n /* ── Reduced motion ─────────────────────────────────────────────\n Honour the OS preference: kill every transition + animation\n except the focus underline (which is critical feedback). */\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type { MushiReportCategory, MushiWidgetConfig } from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nexport interface WidgetCallbacks {\n onSubmit(data: { category: MushiReportCategory; description: string; intent?: string }): void;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onElementSelectorRequest?(): void;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n private screenshotAttached = false;\n private elementSelected = false;\n private submitting = false;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks) {\n this.config = {\n position: config.position ?? 'bottom-right',\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n };\n this.callbacks = callbacks;\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n document.body.appendChild(this.host);\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.elementSelected = false;\n this.submitting = false;\n this.submittedAt = null;\n\n if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n this.host.remove();\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n trigger.addEventListener('click', () => {\n if (this.isOpen) this.close();\n else this.open();\n });\n this.shadow.appendChild(trigger);\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n\n if (this.isOpen) {\n panel.innerHTML = this.renderStep();\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n }\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n ${categories}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"mushi-attach-btn${this.screenshotAttached ? ' active' : ''}\" data-action=\"screenshot\">\n \\uD83D\\uDCF8 ${this.screenshotAttached ? t.step3.screenshotAttached : t.step3.screenshotButton}\n </button>\n <button type=\"button\" class=\"mushi-attach-btn${this.elementSelected ? ' active' : ''}\" data-action=\"element\">\n \\uD83C\\uDFAF ${this.elementSelected ? t.step3.elementSelected : t.step3.elementButton}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n </div>\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') { this.step = 'intent'; this.selectedIntent = null; }\n this.render();\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n // V5.3 §2.1: increased from 5 to 20 to filter low-value \"doesn't work\"\n // submissions that the LLM cannot meaningfully classify. Empirically this\n // removed ~30% of unactionable reports without measurable drop in valid ones.\n const MIN_DESCRIPTION_LENGTH = 20;\n if (description.length < MIN_DESCRIPTION_LENGTH) {\n if (errorEl) {\n errorEl.textContent = `${t.widget.error} (${description.length}/${MIN_DESCRIPTION_LENGTH})`;\n errorEl.style.display = 'block';\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.render();\n\n this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, 2800);\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n}\n","import type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import type { MushiNetworkEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createNetworkCapture(): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n\n return response;\n } catch (error) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","export interface ScreenshotCapture {\n take(): Promise<string | null>;\n}\n\nexport function createScreenshotCapture(): ScreenshotCapture {\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(document.documentElement)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return { take };\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiSentryConfig } from '@mushi-mushi/core';\n\nexport interface SentryContext {\n eventId?: string;\n replayId?: string;\n traceId?: string;\n release?: string;\n environment?: string;\n}\n\ninterface SentryHub {\n getClient?(): { getOptions?(): { release?: string; environment?: string } } | undefined;\n getScope?(): { getLastEventId?(): string | undefined } | undefined;\n}\n\ninterface SentryReplayIntegration {\n getReplayId?(): string | undefined;\n}\n\nfunction getSentryGlobal(): SentryHub | undefined {\n try {\n const win = globalThis as Record<string, unknown>;\n if (win.__SENTRY__) {\n const sentry = win.__SENTRY__ as Record<string, unknown>;\n const hub = sentry.hub as SentryHub | undefined;\n return hub;\n }\n\n if (win.Sentry) {\n return win.Sentry as SentryHub;\n }\n } catch {\n // Sentry not available\n }\n return undefined;\n}\n\nexport function captureSentryContext(_config: MushiSentryConfig): SentryContext {\n const context: SentryContext = {};\n\n try {\n const hub = getSentryGlobal();\n if (!hub) return context;\n\n const scope = hub.getScope?.();\n if (scope) {\n context.eventId = scope.getLastEventId?.() ?? undefined;\n }\n\n const client = hub.getClient?.();\n if (client) {\n const options = client.getOptions?.();\n context.release = options?.release;\n context.environment = options?.environment;\n }\n\n const win = globalThis as Record<string, unknown>;\n if (win.__SENTRY_REPLAY__) {\n const replay = win.__SENTRY_REPLAY__ as SentryReplayIntegration;\n context.replayId = replay.getReplayId?.() ?? undefined;\n }\n } catch {\n // Sentry access failed silently\n }\n\n return context;\n}\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: formData.get('message') as string ?? '',\n email: formData.get('email') as string ?? undefined,\n name: formData.get('name') as string ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","export interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean\n errorBoundary?: boolean\n}\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n if (config.apiCascade !== false) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n try {\n const res = await origFetch.apply(this, args)\n if (!res.ok && res.status >= 400) {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n }\n return res\n } catch (err) {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","import {\n type MushiConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n} from './capture';\nimport { captureSentryContext } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: config.projectId,\n apiKey: config.apiKey,\n ...(config.apiEndpoint ? { apiEndpoint: config.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(config.preFilter);\n const offlineQueue = createOfflineQueue(config.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n const consoleCap = config.capture?.console !== false ? createConsoleCapture() : null;\n const networkCap = config.capture?.network !== false ? createNetworkCapture() : null;\n const perfCap = config.capture?.performance !== false ? createPerformanceCapture() : null;\n const screenshotCap = config.capture?.screenshot !== 'off' ? createScreenshotCapture() : null;\n const elementSelector = config.capture?.elementSelector !== false ? createElementSelector() : null;\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n\n const widget = new MushiWidget(config.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n await submitReport(category, description, intent);\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap) return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector) return;\n log.debug('Element selector activated');\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n }\n },\n });\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = config.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true);\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n widget.open();\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n errorBoundary: proactiveCfg?.errorBoundary,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function submitReport(category: MushiReportCategory, description: string, intent?: string) {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs: consoleCap?.getEntries(),\n networkLogs: networkCap?.getEntries(),\n performanceMetrics: perfCap?.getMetrics(),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n emit('report:submitted', { reportId: report.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n return;\n }\n\n const result = await apiClient.submitReport(report);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n } else {\n log.warn('Report failed, queuing for retry', { reportId: report.id, error: result.error });\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: result.error });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n close() {\n widget.close();\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n offlineQueue.stopAutoSync();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.tags ? { tags: input.tags } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n },\n };\n\n return sdk;\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n identify: () => {},\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/capture/console.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/mushi.ts"],"names":["MAX_ENTRIES","handleClick","handleError","handleUnhandledRejection","createLogger","noopLogger","createApiClient","createPreFilter","createOfflineQueue","createRateLimiter","createPiiScrubber","getDeviceFingerprintHash","captureEnvironment","getSessionId","getReporterToken"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached',\n elementButton: 'Select Element',\n elementSelected: 'Element selected',\n optional: '(optional)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み',\n optional: '(任意)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว',\n optional: '(ไม่บังคับ)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado',\n optional: '(opcional)',\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n if (!code) return en;\n const base = code.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-trigger.bottom-right {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.bottom-left {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.top-right {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.top-left {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.edge-tab {\n width: 32px;\n height: 88px;\n border-radius: 4px 0 0 4px;\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-size: 16px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset -3px 0 0 ${vermillion};\n }\n .mushi-trigger.edge-tab.bottom-right,\n .mushi-trigger.edge-tab.top-right {\n right: var(--mushi-right, 0);\n }\n .mushi-trigger.edge-tab.bottom-left,\n .mushi-trigger.edge-tab.top-left {\n left: var(--mushi-left, 0);\n border-radius: 0 4px 4px 0;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset 3px 0 0 ${vermillion};\n }\n .mushi-trigger.shrunk {\n width: 36px;\n height: 36px;\n opacity: 0.82;\n transform: scale(0.92);\n }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: bottom right;\n }\n .mushi-panel.bottom-left {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: bottom left;\n }\n .mushi-panel.top-right {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: top right;\n }\n .mushi-panel.top-left {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: top left;\n }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type { MushiReportCategory, MushiWidgetConfig } from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nexport interface WidgetCallbacks {\n onSubmit(data: { category: MushiReportCategory; description: string; intent?: string }): void;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onElementSelectorRequest?(): void;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n private screenshotAttached = false;\n private elementSelected = false;\n private submitting = false;\n private triggerVisible = true;\n private triggerShrunk = false;\n private triggerHiddenByScroll = false;\n private attachedLaunchers: Array<() => void> = [];\n private smartHideCleanup: (() => void) | null = null;\n private smartHideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks) {\n this.config = {\n position: config.position ?? 'bottom-right',\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n trigger: config.trigger ?? 'auto',\n attachToSelector: config.attachToSelector ?? '',\n inset: config.inset ?? {},\n respectSafeArea: config.respectSafeArea ?? true,\n hideOnSelector: config.hideOnSelector ?? '',\n hideOnRoutes: config.hideOnRoutes ?? [],\n environments: config.environments ?? {},\n smartHide: config.smartHide ?? false,\n draggable: config.draggable ?? false,\n };\n this.callbacks = callbacks;\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n document.body.appendChild(this.host);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n updateConfig(config: MushiWidgetConfig = {}): void {\n this.config = {\n ...this.config,\n ...(config.position ? { position: config.position } : {}),\n ...(config.theme ? { theme: config.theme } : {}),\n ...(config.triggerText !== undefined ? { triggerText: config.triggerText || '\\uD83D\\uDC1B' } : {}),\n ...(config.expandedTitle !== undefined ? { expandedTitle: config.expandedTitle } : {}),\n ...(config.mode ? { mode: config.mode } : {}),\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.zIndex !== undefined ? { zIndex: config.zIndex } : {}),\n ...(config.trigger ? { trigger: config.trigger } : {}),\n ...(config.attachToSelector !== undefined ? { attachToSelector: config.attachToSelector } : {}),\n ...(config.inset !== undefined ? { inset: config.inset } : {}),\n ...(config.respectSafeArea !== undefined ? { respectSafeArea: config.respectSafeArea } : {}),\n ...(config.hideOnSelector !== undefined ? { hideOnSelector: config.hideOnSelector } : {}),\n ...(config.hideOnRoutes !== undefined ? { hideOnRoutes: config.hideOnRoutes } : {}),\n ...(config.environments !== undefined ? { environments: config.environments } : {}),\n ...(config.smartHide !== undefined ? { smartHide: config.smartHide } : {}),\n ...(config.draggable !== undefined ? { draggable: config.draggable } : {}),\n };\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.elementSelected = false;\n this.submitting = false;\n this.submittedAt = null;\n\n if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n showTrigger(): void {\n this.triggerVisible = true;\n this.render();\n }\n\n hideTrigger(): void {\n this.triggerVisible = false;\n this.render();\n }\n\n setTrigger(trigger: NonNullable<MushiWidgetConfig['trigger']>): void {\n this.updateConfig({ trigger });\n }\n\n attachTo(selectorOrElement: string | Element, options: MushiWidgetConfig = {}): () => void {\n const elements = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n : [selectorOrElement];\n const cleanups = elements.map((el) => {\n const onClick = (event: Event) => {\n event.preventDefault();\n this.updateConfig(options);\n this.open();\n };\n el.addEventListener('click', onClick);\n return () => el.removeEventListener('click', onClick);\n });\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n if (this.smartHideTimer !== null) {\n clearTimeout(this.smartHideTimer);\n this.smartHideTimer = null;\n }\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n this.host.remove();\n }\n\n private syncAttachedLaunchers(): void {\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n if (this.config.trigger !== 'attach' || !this.config.attachToSelector) return;\n if (typeof document === 'undefined') return;\n this.attachedLaunchers.push(this.attachTo(this.config.attachToSelector));\n }\n\n private syncSmartHide(): void {\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.triggerShrunk = false;\n this.triggerHiddenByScroll = false;\n if (!this.config.smartHide || typeof window === 'undefined') return;\n\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const, onScroll: 'shrink' as const, onIdleMs: 900 }\n : this.config.smartHide;\n if (!smart.onScroll) return;\n\n const onScroll = () => {\n if (smart.onScroll === 'hide') {\n this.triggerHiddenByScroll = true;\n } else {\n this.triggerShrunk = true;\n }\n this.render();\n if (this.smartHideTimer !== null) clearTimeout(this.smartHideTimer);\n this.smartHideTimer = setTimeout(() => {\n this.triggerHiddenByScroll = false;\n this.triggerShrunk = false;\n this.render();\n }, smart.onIdleMs ?? 900);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this.smartHideCleanup = () => window.removeEventListener('scroll', onScroll);\n }\n\n private shouldRenderTrigger(): boolean {\n if (!this.triggerVisible) return false;\n if (this.triggerHiddenByScroll) return false;\n if (this.config.trigger === 'manual' || this.config.trigger === 'hidden' || this.config.trigger === 'attach') {\n return false;\n }\n if (this.isMobileSmartHidden()) return false;\n if (this.isRouteHidden()) return false;\n if (this.config.hideOnSelector && document.querySelector(this.config.hideOnSelector)) return false;\n const action = this.config.environments[this.detectEnvironment()];\n return action !== 'never' && action !== 'manual';\n }\n\n private effectiveTrigger(): NonNullable<MushiWidgetConfig['trigger']> {\n if (!this.config.smartHide || typeof window === 'undefined') return this.config.trigger;\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const }\n : this.config.smartHide;\n if (window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'edge-tab') {\n return 'edge-tab';\n }\n return this.config.trigger;\n }\n\n private isMobileSmartHidden(): boolean {\n if (!this.config.smartHide || typeof window === 'undefined') return false;\n const smart = this.config.smartHide === true ? { onMobile: 'edge-tab' as const } : this.config.smartHide;\n return window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'hide';\n }\n\n private detectEnvironment(): 'production' | 'staging' | 'development' {\n const host = typeof location !== 'undefined' ? location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (/\\b(staging|stage|preview|dev)\\b/i.test(host)) return 'staging';\n return 'production';\n }\n\n private isRouteHidden(): boolean {\n if (!this.config.hideOnRoutes.length || typeof location === 'undefined') return false;\n return this.config.hideOnRoutes.some((route) => location.pathname.includes(route));\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n if (this.shouldRenderTrigger()) {\n const effectiveTrigger = this.effectiveTrigger();\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}${effectiveTrigger === 'edge-tab' ? ' edge-tab' : ''}${this.triggerShrunk ? ' shrunk' : ''}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n this.applyInsetVars(trigger);\n trigger.addEventListener('click', () => {\n if (this.isOpen) this.close();\n else this.open();\n });\n this.shadow.appendChild(trigger);\n }\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n this.applyInsetVars(panel);\n\n if (this.isOpen) {\n panel.innerHTML = this.renderStep();\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private applyInsetVars(el: HTMLElement): void {\n const { inset } = this.config;\n if (!this.config.respectSafeArea) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n if (inset[edge] === undefined) el.style.setProperty(`--mushi-${edge}`, '24px');\n });\n }\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = inset[edge];\n if (value === undefined) return;\n el.style.setProperty(`--mushi-${edge}`, value === 'auto' ? 'auto' : `${value}px`);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n }\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n ${categories}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"mushi-attach-btn${this.screenshotAttached ? ' active' : ''}\" data-action=\"screenshot\">\n \\uD83D\\uDCF8 ${this.screenshotAttached ? t.step3.screenshotAttached : t.step3.screenshotButton}\n </button>\n <button type=\"button\" class=\"mushi-attach-btn${this.elementSelected ? ' active' : ''}\" data-action=\"element\">\n \\uD83C\\uDFAF ${this.elementSelected ? t.step3.elementSelected : t.step3.elementButton}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n </div>\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') { this.step = 'intent'; this.selectedIntent = null; }\n this.render();\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n // V5.3 §2.1: increased from 5 to 20 to filter low-value \"doesn't work\"\n // submissions that the LLM cannot meaningfully classify. Empirically this\n // removed ~30% of unactionable reports without measurable drop in valid ones.\n const MIN_DESCRIPTION_LENGTH = 20;\n if (description.length < MIN_DESCRIPTION_LENGTH) {\n if (errorEl) {\n errorEl.textContent = `${t.widget.error} (${description.length}/${MIN_DESCRIPTION_LENGTH})`;\n errorEl.style.display = 'block';\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.render();\n\n this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, 2800);\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n}\n","import type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import type { MushiNetworkEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createNetworkCapture(): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n\n return response;\n } catch (error) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","export interface ScreenshotCapture {\n take(): Promise<string | null>;\n}\n\nexport function createScreenshotCapture(): ScreenshotCapture {\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(document.documentElement)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return { take };\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiSentryConfig } from '@mushi-mushi/core';\n\nexport interface SentryContext {\n eventId?: string;\n replayId?: string;\n traceId?: string;\n release?: string;\n environment?: string;\n}\n\ninterface SentryHub {\n getClient?(): { getOptions?(): { release?: string; environment?: string } } | undefined;\n getScope?(): { getLastEventId?(): string | undefined } | undefined;\n}\n\ninterface SentryReplayIntegration {\n getReplayId?(): string | undefined;\n}\n\nfunction getSentryGlobal(): SentryHub | undefined {\n try {\n const win = globalThis as Record<string, unknown>;\n if (win.__SENTRY__) {\n const sentry = win.__SENTRY__ as Record<string, unknown>;\n const hub = sentry.hub as SentryHub | undefined;\n return hub;\n }\n\n if (win.Sentry) {\n return win.Sentry as SentryHub;\n }\n } catch {\n // Sentry not available\n }\n return undefined;\n}\n\nexport function captureSentryContext(_config: MushiSentryConfig): SentryContext {\n const context: SentryContext = {};\n\n try {\n const hub = getSentryGlobal();\n if (!hub) return context;\n\n const scope = hub.getScope?.();\n if (scope) {\n context.eventId = scope.getLastEventId?.() ?? undefined;\n }\n\n const client = hub.getClient?.();\n if (client) {\n const options = client.getOptions?.();\n context.release = options?.release;\n context.environment = options?.environment;\n }\n\n const win = globalThis as Record<string, unknown>;\n if (win.__SENTRY_REPLAY__) {\n const replay = win.__SENTRY_REPLAY__ as SentryReplayIntegration;\n context.replayId = replay.getReplayId?.() ?? undefined;\n }\n } catch {\n // Sentry access failed silently\n }\n\n return context;\n}\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: formData.get('message') as string ?? '',\n email: formData.get('email') as string ?? undefined,\n name: formData.get('name') as string ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","export interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean\n errorBoundary?: boolean\n}\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n if (config.apiCascade !== false) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n try {\n const res = await origFetch.apply(this, args)\n if (!res.ok && res.status >= 400) {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n }\n return res\n } catch (err) {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","import {\n type MushiConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiRuntimeSdkConfig,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n} from './capture';\nimport { captureSentryContext } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const bootstrapConfig: MushiConfig = config;\n let activeConfig: MushiConfig = config;\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: config.projectId,\n apiKey: config.apiKey,\n ...(config.apiEndpoint ? { apiEndpoint: config.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(config.preFilter);\n const offlineQueue = createOfflineQueue(config.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n let consoleCap: ReturnType<typeof createConsoleCapture> | null = null;\n let networkCap: ReturnType<typeof createNetworkCapture> | null = null;\n let perfCap: ReturnType<typeof createPerformanceCapture> | null = null;\n let screenshotCap: ReturnType<typeof createScreenshotCapture> | null = null;\n let elementSelector: ReturnType<typeof createElementSelector> | null = null;\n\n function syncCaptureModules() {\n if (activeConfig.capture?.console !== false) {\n consoleCap ??= createConsoleCapture();\n } else {\n consoleCap?.destroy();\n consoleCap = null;\n }\n\n if (activeConfig.capture?.network !== false) {\n networkCap ??= createNetworkCapture();\n } else {\n networkCap?.destroy();\n networkCap = null;\n }\n\n if (activeConfig.capture?.performance !== false) {\n perfCap ??= createPerformanceCapture();\n } else {\n perfCap?.destroy();\n perfCap = null;\n }\n\n screenshotCap = activeConfig.capture?.screenshot !== 'off'\n ? (screenshotCap ?? createScreenshotCapture())\n : null;\n if (!screenshotCap) pendingScreenshot = null;\n\n if (activeConfig.capture?.elementSelector !== false) {\n elementSelector ??= createElementSelector();\n } else {\n elementSelector?.deactivate();\n elementSelector = null;\n pendingElement = null;\n }\n }\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n syncCaptureModules();\n\n const widget = new MushiWidget(config.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n await submitReport(category, description, intent);\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap || activeConfig.capture?.screenshot === 'off') return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector || activeConfig.capture?.elementSelector === false) return;\n log.debug('Element selector activated');\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n }\n },\n });\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = config.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true);\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n widget.open();\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n errorBoundary: proactiveCfg?.errorBoundary,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n function applyRuntimeConfig(runtime: MushiRuntimeSdkConfig) {\n if (runtime.enabled === false) {\n activeConfig = bootstrapConfig;\n clearCachedRuntimeConfig(config.projectId);\n syncCaptureModules();\n widget.updateConfig(activeConfig.widget);\n log.debug('Runtime SDK config disabled; using bootstrap config', { version: runtime.version });\n return;\n }\n activeConfig = mergeRuntimeConfig(activeConfig, runtime);\n syncCaptureModules();\n if (runtime.widget) widget.updateConfig(activeConfig.widget);\n log.debug('Applied runtime SDK config', { version: runtime.version });\n }\n\n if (config.runtimeConfig !== false) {\n const cached = readCachedRuntimeConfig(config.projectId);\n if (cached) applyRuntimeConfig(cached);\n apiClient.getSdkConfig().then((result) => {\n if (result.ok && result.data) {\n cacheRuntimeConfig(config.projectId, result.data);\n applyRuntimeConfig(result.data);\n } else if (result.error) {\n log.debug('Runtime SDK config unavailable', result.error);\n }\n }).catch((err) => {\n log.debug('Runtime SDK config fetch failed', { error: err instanceof Error ? err.message : String(err) });\n });\n }\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function submitReport(category: MushiReportCategory, description: string, intent?: string) {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs: activeConfig.capture?.console === false ? undefined : consoleCap?.getEntries(),\n networkLogs: activeConfig.capture?.network === false ? undefined : networkCap?.getEntries(),\n performanceMetrics: activeConfig.capture?.performance === false ? undefined : perfCap?.getMetrics(),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n emit('report:submitted', { reportId: report.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n return;\n }\n\n const result = await apiClient.submitReport(report);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n } else {\n log.warn('Report failed, queuing for retry', { reportId: report.id, error: result.error });\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: result.error });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n openWith(category) {\n widget.open({ category });\n },\n\n show() {\n widget.showTrigger();\n },\n\n hide() {\n widget.hideTrigger();\n },\n\n attachTo(selectorOrElement, options) {\n return widget.attachTo(selectorOrElement, options);\n },\n\n setTrigger(trigger) {\n widget.setTrigger(trigger);\n },\n\n close() {\n widget.close();\n },\n\n updateConfig(runtimeConfig) {\n applyRuntimeConfig(runtimeConfig);\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n offlineQueue.stopAutoSync();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.tags ? { tags: input.tags } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n },\n };\n\n return sdk;\n}\n\nfunction mergeRuntimeConfig(config: MushiConfig, runtime: MushiRuntimeSdkConfig): MushiConfig {\n const nativeTrigger = runtime.native?.triggerMode;\n const widgetTrigger = runtime.widget?.trigger\n ?? (nativeTrigger === 'none' || nativeTrigger === 'shake' ? 'manual' : undefined);\n return {\n ...config,\n widget: {\n ...config.widget,\n ...runtime.widget,\n ...(widgetTrigger ? { trigger: widgetTrigger } : {}),\n },\n capture: {\n ...config.capture,\n ...runtime.capture,\n },\n };\n}\n\nfunction runtimeConfigCacheKey(projectId: string): string {\n return `mushi:sdk-config:${projectId}`;\n}\n\nfunction readCachedRuntimeConfig(projectId: string): MushiRuntimeSdkConfig | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(runtimeConfigCacheKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { config?: MushiRuntimeSdkConfig };\n return parsed.config ?? null;\n } catch {\n return null;\n }\n}\n\nfunction cacheRuntimeConfig(projectId: string, config: MushiRuntimeSdkConfig): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(runtimeConfigCacheKey(projectId), JSON.stringify({\n cachedAt: Date.now(),\n config,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction clearCachedRuntimeConfig(projectId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(runtimeConfigCacheKey(projectId));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n updateConfig: () => {},\n openWith: () => {},\n show: () => {},\n hide: () => {},\n attachTo: () => () => {},\n setTrigger: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n identify: () => {},\n };\n}\n"]}
|