@casualoffice/sheets 0.13.0 → 0.14.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chrome/index.ts","../src/chrome/Toolbar.tsx","../src/chrome/Icon.tsx","../src/chrome/fonts.ts","../src/chrome/ColorPicker.tsx","../src/chrome/BordersPicker.tsx","../src/chrome/AutoSumPicker.tsx","../src/chrome/FormulaBar.tsx","../src/chrome/NameBox.tsx","../src/chrome/StatusBar.tsx","../src/chrome/MenuBar.tsx","../src/chrome/SheetTabs.tsx","../src/chrome/FindReplace.tsx","../src/chrome/ChromeTop.tsx","../src/chrome/ChromeBottom.tsx"],"sourcesContent":["/**\n * Chrome — the Office shell as slot components for `<CasualSheets chrome>`.\n *\n * First slice (SDK_MIGRATION_PIPELINE Phase 1 step 2): a minimal built-in\n * `Toolbar`. The rich shell (FormulaBar, MenuBar, TitleBar, StatusBar) lifts\n * from `apps/web/src/shell/` here in later slices, behind `chrome=\"full\"`.\n */\nexport { Toolbar, type ToolbarProps } from './Toolbar';\nexport { FormulaBar, type FormulaBarProps } from './FormulaBar';\nexport { StatusBar, type StatusBarProps } from './StatusBar';\nexport { Icon, type IconProps } from './Icon';\nexport { ensureChromeFonts } from './fonts';\nexport { ColorPicker, type ColorPickerProps } from './ColorPicker';\nexport { BordersPicker, type BordersPickerProps } from './BordersPicker';\nexport { AutoSumPicker, type AutoSumPickerProps } from './AutoSumPicker';\nexport { MenuBar, type MenuBarProps } from './MenuBar';\nexport { NameBox, type NameBoxProps } from './NameBox';\nexport { SheetTabs, type SheetTabsProps } from './SheetTabs';\nexport { FindReplace, type FindReplaceProps } from './FindReplace';\n// Lazy-loaded shells: chrome above (ChromeTop) and below (ChromeBottom) the grid,\n// imported on demand by `<CasualSheets>` via the `@casualoffice/sheets/chrome`\n// subpath so `chrome=\"none\"` consumers don't bundle the chrome JS.\nexport { ChromeTop } from './ChromeTop';\nexport { ChromeBottom } from './ChromeBottom';\n","/**\n * Toolbar — the rich built-in formatting toolbar for `<CasualSheets chrome>`.\n *\n * Drives the editor purely through `CasualSheetsAPI.executeCommand`, with\n * Material Symbols icons + design-system tokens. No app context, no title/logo\n * row (the host frames the editor with its own bar). Commands grouped with\n * dividers, Office-style.\n *\n * Covered: font family/size · undo/redo · bold/italic/underline/strikethrough ·\n * horizontal align · merge/unmerge · number formats (currency/percent/decimals).\n * Reflects the active cell — toggles light up, dropdowns show the current font —\n * via a command-execution subscription. Follow-up: text/fill colour pickers\n * (need a swatch popover).\n */\n\nimport { useEffect, useState, type CSSProperties } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\nimport { ensureChromeFonts } from './fonts';\nimport { ColorPicker } from './ColorPicker';\nimport { BordersPicker } from './BordersPicker';\nimport { AutoSumPicker } from './AutoSumPicker';\n\ninterface ActiveStyle {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n ht: number; // HorizontalAlign of the active cell (0 = unset)\n vt: number; // VerticalAlign of the active cell (0 = unset)\n tb: number; // WrapStrategy of the active cell (0 = unset, 3 = wrap)\n ff: string;\n fs: number;\n}\n\nconst NO_STYLE: ActiveStyle = {\n bold: false,\n italic: false,\n underline: false,\n strike: false,\n ht: 0,\n vt: 0,\n tb: 0,\n ff: '',\n fs: 0,\n};\n\nfunction readActiveStyle(api: CasualSheetsAPI): ActiveStyle {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return NO_STYLE;\n const range = sheet.getRange(sel.range.startRow, sel.range.startColumn);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = (range.getCellStyleData?.() ?? null) as any;\n return {\n bold: s?.bl === 1,\n italic: s?.it === 1,\n underline: s?.ul?.s === 1,\n strike: s?.st?.s === 1,\n ht: typeof s?.ht === 'number' ? s.ht : 0,\n vt: typeof s?.vt === 'number' ? s.vt : 0,\n tb: typeof s?.tb === 'number' ? s.tb : 0,\n ff: typeof s?.ff === 'string' ? s.ff : '',\n fs: typeof s?.fs === 'number' ? s.fs : 0,\n };\n}\n\nconst FONT_FAMILIES = ['Arial', 'Calibri', 'Times New Roman', 'Courier New', 'Georgia', 'Verdana'];\nconst FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 36, 48, 72];\n\ninterface ToolbarAction {\n id: string;\n label: string;\n command: string;\n icon: string;\n params?: object;\n}\n\n// HorizontalAlign enum (@univerjs/core): LEFT=1, CENTER=2, RIGHT=3.\n// VerticalAlign enum (@univerjs/core): TOP=1, MIDDLE=2, BOTTOM=3.\n// WrapStrategy enum (@univerjs/core): OVERFLOW=1, CLIP=2, WRAP=3.\nconst GROUPS: ToolbarAction[][] = [\n [\n { id: 'undo', label: 'Undo', command: 'univer.command.undo', icon: 'undo' },\n { id: 'redo', label: 'Redo', command: 'univer.command.redo', icon: 'redo' },\n ],\n [\n { id: 'bold', label: 'Bold', command: 'sheet.command.set-range-bold', icon: 'format_bold' },\n {\n id: 'italic',\n label: 'Italic',\n command: 'sheet.command.set-range-italic',\n icon: 'format_italic',\n },\n {\n id: 'underline',\n label: 'Underline',\n command: 'sheet.command.set-range-underline',\n icon: 'format_underlined',\n },\n {\n id: 'strikethrough',\n label: 'Strikethrough',\n command: 'sheet.command.set-range-stroke',\n icon: 'format_strikethrough',\n },\n ],\n [\n {\n id: 'align-left',\n label: 'Align left',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_left',\n params: { value: 1 },\n },\n {\n id: 'align-center',\n label: 'Align center',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_center',\n params: { value: 2 },\n },\n {\n id: 'align-right',\n label: 'Align right',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_right',\n params: { value: 3 },\n },\n ],\n [\n {\n id: 'align-top',\n label: 'Align top',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_top',\n params: { value: 1 },\n },\n {\n id: 'align-middle',\n label: 'Align middle',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_center',\n params: { value: 2 },\n },\n {\n id: 'align-bottom',\n label: 'Align bottom',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_bottom',\n params: { value: 3 },\n },\n {\n id: 'wrap-text',\n label: 'Wrap text',\n command: 'sheet.command.set-text-wrap',\n icon: 'wrap_text',\n params: { value: 3 },\n },\n ],\n [\n {\n id: 'merge',\n label: 'Merge cells',\n command: 'sheet.command.add-worksheet-merge-all',\n icon: 'cell_merge',\n },\n {\n id: 'unmerge',\n label: 'Unmerge cells',\n command: 'sheet.command.remove-worksheet-merge',\n icon: 'splitscreen_vertical_add',\n },\n ],\n [\n {\n id: 'currency',\n label: 'Currency format',\n command: 'sheet.command.numfmt.set.currency',\n icon: 'attach_money',\n },\n {\n id: 'percent',\n label: 'Percent format',\n command: 'sheet.command.numfmt.set.percent',\n icon: 'percent',\n },\n {\n id: 'decimal-increase',\n label: 'Increase decimals',\n command: 'sheet.command.numfmt.add.decimal.command',\n icon: 'decimal_increase',\n },\n {\n id: 'decimal-decrease',\n label: 'Decrease decimals',\n command: 'sheet.command.numfmt.subtract.decimal.command',\n icon: 'decimal_decrease',\n },\n ],\n [\n {\n id: 'clear-format',\n label: 'Clear formatting',\n command: 'sheet.command.clear-selection-format',\n icon: 'format_clear',\n },\n ],\n];\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n padding: '4px 8px',\n borderBottom: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-bg, #eef1f5)',\n flex: '0 0 auto',\n userSelect: 'none',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst DIVIDER_STYLE: CSSProperties = {\n width: 1,\n height: 18,\n margin: '0 4px',\n background: 'var(--cs-chrome-border, #cdd3db)',\n flex: '0 0 auto',\n};\n\nconst SELECT_STYLE: CSSProperties = {\n height: 26,\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 6,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n padding: '0 4px',\n cursor: 'pointer',\n};\n\nexport interface ToolbarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\n// Which actions reflect an active state, keyed off the active cell's style.\nfunction isActive(id: string, s: ActiveStyle): boolean {\n switch (id) {\n case 'bold':\n return s.bold;\n case 'italic':\n return s.italic;\n case 'underline':\n return s.underline;\n case 'strikethrough':\n return s.strike;\n case 'align-left':\n return s.ht === 1;\n case 'align-center':\n return s.ht === 2;\n case 'align-right':\n return s.ht === 3;\n case 'align-top':\n return s.vt === 1;\n case 'align-middle':\n return s.vt === 2;\n case 'align-bottom':\n return s.vt === 3;\n case 'wrap-text':\n return s.tb === 3;\n default:\n return false;\n }\n}\n\nexport function Toolbar({ api }: ToolbarProps) {\n const [active, setActive] = useState<ActiveStyle>(NO_STYLE);\n\n useEffect(() => {\n ensureChromeFonts();\n }, []);\n\n // Reflect the active cell: subscribe to command activity (covers selection\n // moves + style mutations) and re-read the style.\n useEffect(() => {\n if (!api) return;\n const refresh = () => setActive(readActiveStyle(api));\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n const dispatch = (command: string, params?: object) => void api?.executeCommand(command, params);\n\n // Reflect current font in the dropdowns; surface a non-listed value too.\n const familyValue = active.ff || 'Arial';\n const familyOptions =\n active.ff && !FONT_FAMILIES.includes(active.ff) ? [active.ff, ...FONT_FAMILIES] : FONT_FAMILIES;\n const sizeValue = active.fs || 11;\n const sizeOptions =\n active.fs && !FONT_SIZES.includes(active.fs) ? [active.fs, ...FONT_SIZES] : FONT_SIZES;\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-toolbar\" role=\"toolbar\" aria-label=\"Editor\">\n <select\n aria-label=\"Font family\"\n data-testid=\"cs-font-family\"\n style={{ ...SELECT_STYLE, width: 116 }}\n value={familyValue}\n onChange={(e) => dispatch('sheet.command.set-range-font-family', { value: e.target.value })}\n >\n {familyOptions.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n <select\n aria-label=\"Font size\"\n data-testid=\"cs-font-size\"\n style={{ ...SELECT_STYLE, width: 56, marginLeft: 4 }}\n value={sizeValue}\n onChange={(e) =>\n dispatch('sheet.command.set-range-fontsize', { value: Number(e.target.value) })\n }\n >\n {sizeOptions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n <span style={DIVIDER_STYLE} aria-hidden />\n {GROUPS.map((group, gi) => (\n <span key={gi} style={{ display: 'inline-flex', alignItems: 'center' }}>\n {gi > 0 && <span style={DIVIDER_STYLE} aria-hidden />}\n {group.map((a) => {\n const on = isActive(a.id, active);\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n return (\n <button\n key={a.id}\n type=\"button\"\n title={a.label}\n aria-label={a.label}\n aria-pressed={on}\n data-action={a.id}\n data-active={on ? 'true' : undefined}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n dispatch(a.command, a.params);\n }}\n onMouseEnter={(e) => {\n if (!on)\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name={a.icon} size={20} />\n </button>\n );\n })}\n </span>\n ))}\n <span style={DIVIDER_STYLE} aria-hidden />\n <ColorPicker api={api} />\n <BordersPicker api={api} />\n <span style={DIVIDER_STYLE} aria-hidden />\n <AutoSumPicker api={api} />\n </div>\n );\n}\n","/**\n * Icon — a Material Symbols Outlined glyph for the chrome.\n *\n * Names are Material Symbols ids (https://fonts.google.com/icons), e.g.\n * `format_bold`. Requires the Material Symbols font (loaded via\n * `ensureChromeFonts`); if it isn't present the ligature text shows instead,\n * which is harmless. Icon-only buttons must carry their own `aria-label`.\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface IconProps {\n name: string;\n size?: number;\n style?: CSSProperties;\n}\n\nexport function Icon({ name, size = 20, style }: IconProps) {\n return (\n <span\n className=\"material-symbols-outlined\"\n aria-hidden\n style={{\n fontFamily: \"'Material Symbols Outlined'\",\n fontWeight: 'normal',\n fontStyle: 'normal',\n fontSize: size,\n lineHeight: 1,\n letterSpacing: 'normal',\n textTransform: 'none',\n display: 'inline-block',\n whiteSpace: 'nowrap',\n wordWrap: 'normal',\n direction: 'ltr',\n // Hint the variable-font axes so weight/optical-size are consistent.\n fontVariationSettings: \"'opsz' 20, 'wght' 400, 'FILL' 0, 'GRAD' 0\",\n ...style,\n }}\n >\n {name}\n </span>\n );\n}\n","/**\n * Ensures the chrome's webfonts (Inter for UI, Material Symbols Outlined for\n * icons) are loaded. The design system standardises on these; the rich\n * `chrome=\"full\"` toolbar/menus render Material Symbols ligatures.\n *\n * Idempotent + safe to call repeatedly: it no-ops if the links already exist\n * (e.g. a host that already loads them, like our own app). Injected lazily only\n * when chrome is actually shown, so bare-grid SDK consumers pull nothing.\n *\n * Hosts with a strict CSP (no fonts.googleapis.com) can pre-load the fonts\n * themselves or self-host them; this is best-effort, not required for the editor\n * to function (icons fall back to the ligature text).\n */\n\nconst LINKS: Array<{ id: string; href: string }> = [\n {\n id: 'cs-font-inter',\n href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',\n },\n {\n id: 'cs-font-material-symbols',\n href: 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,300..700,0..1,-50..200&display=block',\n },\n];\n\nlet done = false;\n\nexport function ensureChromeFonts(): void {\n if (done || typeof document === 'undefined') return;\n done = true;\n const head = document.head;\n for (const { id, href } of LINKS) {\n if (document.getElementById(id)) continue;\n // Skip if the host already loaded the same family by any <link>.\n // Match on the `family=<name>` segment, NOT the bare `/css2` path — both\n // Google Fonts URLs share `/css2`, so splitting on `?` made the second\n // family (Material Symbols) collide with the first (Inter) and never get\n // injected, leaving `chrome=\"full\"` icons as raw ligature text.\n const familyKey = href.match(/family=[^:&]+/)?.[0] ?? href.split('?')[0];\n if (document.querySelector(`link[href*=\"${familyKey}\"]`)) continue;\n const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = href;\n head.appendChild(link);\n }\n}\n","/**\n * ColorPicker — text-colour + fill-colour swatch pickers for `<CasualSheets chrome>`.\n *\n * Two icon buttons (text colour, fill colour). Clicking one toggles a swatch\n * popover; picking a swatch dispatches the matching Univer command on the active\n * selection and closes the popover. A \"None\" entry resets the colour.\n *\n * Drives the editor purely through `CasualSheetsAPI.executeCommand`. Commands:\n * text colour : `sheet.command.set-range-text-color` { value: '#rrggbb' | null }\n * fill colour : `sheet.command.set-background-color` { value: '#rrggbb' }\n * fill reset : `sheet.command.reset-background-color` (no params)\n * (`set-background-color` rejects a null value, so reset uses its own command.)\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\ntype Kind = 'text' | 'fill';\n\n// A tasteful 14-swatch palette: neutrals + a spread of hues, teal = brand.\nconst SWATCHES: { hex: string; label: string }[] = [\n { hex: '#000000', label: 'Black' },\n { hex: '#5f6368', label: 'Dark gray' },\n { hex: '#9aa0a6', label: 'Gray' },\n { hex: '#d9dce0', label: 'Light gray' },\n { hex: '#ffffff', label: 'White' },\n { hex: '#d13438', label: 'Red' },\n { hex: '#e8710a', label: 'Orange' },\n { hex: '#f2c811', label: 'Yellow' },\n { hex: '#107c10', label: 'Green' },\n { hex: '#0e7490', label: 'Teal' },\n { hex: '#1a73e8', label: 'Blue' },\n { hex: '#5b2a86', label: 'Purple' },\n { hex: '#c2185b', label: 'Magenta' },\n { hex: '#795548', label: 'Brown' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 8,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst GRID_STYLE: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 22px)',\n gap: 6,\n};\n\nconst SWATCH_STYLE: CSSProperties = {\n width: 22,\n height: 22,\n borderRadius: 4,\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n cursor: 'pointer',\n padding: 0,\n};\n\nconst NONE_STYLE: CSSProperties = {\n marginTop: 8,\n width: '100%',\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n borderRadius: 6,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 12,\n cursor: 'pointer',\n};\n\nexport interface ColorPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function ColorPicker({ api }: ColorPickerProps) {\n const [open, setOpen] = useState<Kind | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape and on any pointerdown outside the picker root.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(null);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(null);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const pick = (kind: Kind, hex: string | null) => {\n if (api) {\n if (kind === 'text') {\n void api.executeCommand('sheet.command.set-range-text-color', { value: hex });\n } else if (hex === null) {\n void api.executeCommand('sheet.command.reset-background-color');\n } else {\n void api.executeCommand('sheet.command.set-background-color', { value: hex });\n }\n }\n setOpen(null);\n };\n\n const toggle = (kind: Kind) => setOpen((cur) => (cur === kind ? null : kind));\n\n const renderButton = (kind: Kind, icon: string, label: string, testid: string) => {\n const on = open === kind;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid={testid}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n toggle(kind);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name={icon} size={20} />\n </button>\n );\n };\n\n const renderPopover = (kind: Kind) => (\n <div style={POPOVER_STYLE} data-testid=\"cs-color-popover\" role=\"menu\">\n <div style={GRID_STYLE}>\n {SWATCHES.map((s) => (\n <button\n key={s.hex}\n type=\"button\"\n role=\"menuitem\"\n title={s.label}\n aria-label={s.label}\n data-color={s.hex}\n style={{ ...SWATCH_STYLE, background: s.hex }}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(kind, s.hex);\n }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-color=\"none\"\n style={NONE_STYLE}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(kind, null);\n }}\n >\n <Icon name=\"format_color_reset\" size={16} />\n None\n </button>\n </div>\n );\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-color-picker\">\n {renderButton('text', 'format_color_text', 'Text color', 'cs-color-text')}\n {renderButton('fill', 'format_color_fill', 'Fill color', 'cs-color-fill')}\n {open && renderPopover(open)}\n </div>\n );\n}\n","/**\n * BordersPicker — border-position dropdown for `<CasualSheets chrome>`.\n *\n * One toolbar button that opens a popover of Excel-style border options (All,\n * Outside, Inside, Top, Bottom, Left, Right, None). Picking one dispatches\n * `sheet.command.set-border-position` with the matching `BorderType` against the\n * active selection, using Univer's current border style/colour (thin black by\n * default). Drives the editor purely through `CasualSheetsAPI.executeCommand`.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\n// BorderType is a string enum in @univerjs/core ('all' | 'outside' | …); use the\n// literal values directly so this component needs no Univer value import.\nconst OPTIONS: { value: string; icon: string; label: string }[] = [\n { value: 'all', icon: 'border_all', label: 'All borders' },\n { value: 'outside', icon: 'border_outer', label: 'Outside borders' },\n { value: 'inside', icon: 'border_inner', label: 'Inside borders' },\n { value: 'top', icon: 'border_top', label: 'Top border' },\n { value: 'bottom', icon: 'border_bottom', label: 'Bottom border' },\n { value: 'left', icon: 'border_left', label: 'Left border' },\n { value: 'right', icon: 'border_right', label: 'Right border' },\n { value: 'none', icon: 'border_clear', label: 'No border' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 4,\n minWidth: 168,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n width: '100%',\n height: 28,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n textAlign: 'left',\n};\n\nexport interface BordersPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function BordersPicker({ api }: BordersPickerProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape and on any pointerdown outside the picker root.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const pick = (value: string) => {\n void api?.executeCommand('sheet.command.set-border-position', { value });\n setOpen(false);\n };\n\n const on = open;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-borders\">\n <button\n type=\"button\"\n title=\"Borders\"\n aria-label=\"Borders\"\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid=\"cs-borders-button\"\n disabled={!api}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen((v) => !v);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name=\"border_all\" size={20} />\n </button>\n {open && (\n <div style={POPOVER_STYLE} data-testid=\"cs-borders-popover\" role=\"menu\">\n {OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n role=\"menuitem\"\n data-border={o.value}\n data-testid={`cs-border-${o.value}`}\n style={ITEM_STYLE}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(o.value);\n }}\n >\n <Icon name={o.icon} size={18} />\n {o.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * AutoSumPicker — Excel-style AutoSum dropdown for `<CasualSheets chrome>`.\n *\n * One toolbar button (Σ) opening Sum / Average / Count / Max / Min. Picking one\n * inserts `=FN(<selection>)` one row below a multi-cell selection (and activates\n * that cell), or `=FN()` into a single active cell so the user can type the\n * range. Pure facade — no command, no Univer UI dependency — so it works in the\n * SDK's embedded mount.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\nconst FUNCS: { fn: string; label: string }[] = [\n { fn: 'SUM', label: 'Sum' },\n { fn: 'AVERAGE', label: 'Average' },\n { fn: 'COUNT', label: 'Count numbers' },\n { fn: 'MAX', label: 'Max' },\n { fn: 'MIN', label: 'Min' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 4,\n minWidth: 160,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 28,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRange = any;\n\nexport interface AutoSumPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function AutoSumPicker({ api }: AutoSumPickerProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const apply = (fn: string) => {\n setOpen(false);\n const sheet = api?.univer.getActiveWorkbook()?.getActiveSheet();\n const range = (sheet as unknown as { getActiveRange?: () => AnyRange })?.getActiveRange?.();\n if (!sheet || !range) return;\n const multi = range.getWidth() * range.getHeight() > 1;\n if (multi) {\n // Drop the formula one row below the selection, same column as its start.\n const target = sheet.getRange(range.getRow() + range.getHeight(), range.getColumn());\n target.setValue({ f: `=${fn}(${range.getA1Notation()})` });\n (target as AnyRange).activate?.();\n } else {\n // Single cell — leave the cursor inside the parens for the user to fill.\n sheet.getRange(range.getRow(), range.getColumn()).setValue({ f: `=${fn}()` });\n }\n };\n\n const on = open;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-autosum\">\n <button\n type=\"button\"\n title=\"AutoSum\"\n aria-label=\"AutoSum\"\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid=\"cs-autosum-button\"\n disabled={!api}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen((v) => !v);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name=\"functions\" size={20} />\n </button>\n {open && (\n <div style={POPOVER_STYLE} data-testid=\"cs-autosum-popover\" role=\"menu\">\n {FUNCS.map((f) => (\n <button\n key={f.fn}\n type=\"button\"\n role=\"menuitem\"\n data-fn={f.fn}\n data-testid={`cs-autosum-${f.fn}`}\n style={ITEM_STYLE}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n apply(f.fn);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * FormulaBar — minimal built-in formula bar for `<CasualSheets chrome>`.\n *\n * The formula bar: a NameBox (active-cell ref + go-to navigation) and an editable\n * input that shows the active cell's formula (or value) and commits edits through\n * the facade — `=…` as a formula, a number as a number, else text. Typing a\n * function name after `=` shows an autocomplete dropdown (arrows + Enter/Tab to\n * complete, Escape to dismiss). Self-contained: drives the editor only via\n * `CasualSheetsAPI`.\n */\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { NameBox } from './NameBox';\n\n// Curated common spreadsheet functions for the autocomplete dropdown. (Univer\n// ships ~530; this covers what people actually type without bundling them all.)\nconst FUNCTIONS = [\n 'ABS',\n 'AND',\n 'AVERAGE',\n 'AVERAGEIF',\n 'AVERAGEIFS',\n 'CEILING',\n 'CHOOSE',\n 'COLUMN',\n 'COLUMNS',\n 'CONCAT',\n 'CONCATENATE',\n 'COUNT',\n 'COUNTA',\n 'COUNTBLANK',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DATEDIF',\n 'DAY',\n 'EDATE',\n 'EOMONTH',\n 'EXACT',\n 'FILTER',\n 'FIND',\n 'FLOOR',\n 'HLOOKUP',\n 'HOUR',\n 'IF',\n 'IFERROR',\n 'IFNA',\n 'IFS',\n 'INDEX',\n 'INDIRECT',\n 'INT',\n 'ISBLANK',\n 'ISERROR',\n 'ISNA',\n 'ISNUMBER',\n 'ISTEXT',\n 'LEFT',\n 'LEN',\n 'LOOKUP',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MAXIFS',\n 'MEDIAN',\n 'MID',\n 'MIN',\n 'MINIFS',\n 'MINUTE',\n 'MOD',\n 'MONTH',\n 'NETWORKDAYS',\n 'NOT',\n 'NOW',\n 'OFFSET',\n 'OR',\n 'POWER',\n 'PRODUCT',\n 'PROPER',\n 'RAND',\n 'RANDBETWEEN',\n 'RANK',\n 'REPLACE',\n 'REPT',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'ROW',\n 'ROWS',\n 'SEARCH',\n 'SECOND',\n 'SORT',\n 'SQRT',\n 'SUBSTITUTE',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'SUMPRODUCT',\n 'SWITCH',\n 'TEXT',\n 'TEXTJOIN',\n 'TODAY',\n 'TRANSPOSE',\n 'TRIM',\n 'UNIQUE',\n 'UPPER',\n 'VALUE',\n 'VLOOKUP',\n 'WEEKDAY',\n 'WORKDAY',\n 'XLOOKUP',\n 'XMATCH',\n 'YEAR',\n];\n\nconst TOKEN_RE = /([A-Za-z][A-Za-z0-9._]*)$/;\n\n/** Function suggestions for the trailing identifier of a formula draft. */\nfunction suggestFor(draft: string | null): string[] {\n if (!draft || !draft.startsWith('=')) return [];\n const m = TOKEN_RE.exec(draft);\n if (!m) return [];\n const prefix = m[1].toUpperCase();\n return FUNCTIONS.filter((f) => f.startsWith(prefix) && f !== prefix).slice(0, 8);\n}\n\n/** A1 column letters from a 0-based column index (0→A, 26→AA). */\nfunction colToLetters(col: number): string {\n let s = '';\n let n = col;\n do {\n s = String.fromCharCode(65 + (n % 26)) + s;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return s;\n}\n\ninterface ActiveCell {\n a1: string;\n /** Formula text (`=…`) if the cell has one, else the raw value as a string. */\n text: string;\n}\n\nfunction readActiveCell(api: CasualSheetsAPI): ActiveCell | null {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return null;\n const { startRow, startColumn } = sel.range;\n const range = sheet.getRange(startRow, startColumn);\n const formula = range.getFormula?.() || '';\n const raw = range.getValue?.();\n return {\n a1: colToLetters(startColumn) + (startRow + 1),\n text: formula || (raw == null ? '' : String(raw)),\n };\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 6px',\n borderBottom: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n flex: '0 0 auto',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst FX_STYLE: CSSProperties = {\n flex: '0 0 auto',\n fontStyle: 'italic',\n color: 'var(--cs-chrome-muted, #6b7280)',\n};\n\nconst INPUT_STYLE: CSSProperties = {\n width: '100%',\n height: 24,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #1f2329)',\n font: 'inherit',\n fontSize: 13,\n boxSizing: 'border-box',\n};\n\nconst INPUT_WRAP_STYLE: CSSProperties = { position: 'relative', flex: '1 1 auto', minWidth: 0 };\n\nconst AC_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 2,\n minWidth: 200,\n maxHeight: 240,\n overflowY: 'auto',\n zIndex: 1000,\n padding: 4,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n};\n\nconst AC_ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 26,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\nexport interface FormulaBarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function FormulaBar({ api }: FormulaBarProps) {\n const [cell, setCell] = useState<ActiveCell | null>(null);\n // null = mirror the active cell; a string = the user is editing.\n const [draft, setDraft] = useState<string | null>(null);\n const draftRef = useRef<string | null>(null);\n draftRef.current = draft;\n // Autocomplete: active suggestion index + a dismissed flag (Escape closes the\n // dropdown without cancelling the edit).\n const [acIdx, setAcIdx] = useState(0);\n const [acDismissed, setAcDismissed] = useState(false);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n // Don't clobber an in-progress edit on unrelated command activity.\n if (draftRef.current !== null) return;\n setCell(readActiveCell(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n const suggestions = useMemo(() => suggestFor(draft), [draft]);\n const acOpen = !acDismissed && suggestions.length > 0;\n\n const commit = (text: string) => {\n setDraft(null);\n setAcDismissed(false);\n if (!api) return;\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return;\n const range = sheet.getRange(sel.range.startRow, sel.range.startColumn);\n const t = text.trim();\n if (t.startsWith('=')) range.setValue({ f: t });\n else if (t !== '' && !Number.isNaN(Number(t))) range.setValue(Number(t));\n else range.setValue(t);\n };\n\n const onType = (v: string) => {\n setDraft(v);\n setAcIdx(0);\n setAcDismissed(false);\n };\n\n // Replace the trailing identifier with the chosen function + '('.\n const complete = (fn: string) => {\n const base = draft ?? '';\n setDraft(base.replace(TOKEN_RE, `${fn}(`));\n setAcIdx(0);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (acOpen) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setAcIdx((i) => Math.min(i + 1, suggestions.length - 1));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setAcIdx((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n complete(suggestions[acIdx] ?? suggestions[0]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n setAcDismissed(true);\n return;\n }\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n commit((e.target as HTMLInputElement).value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(null);\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const shown = draft ?? cell?.text ?? '';\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-formula-bar\">\n <NameBox api={api} />\n <span style={FX_STYLE} aria-hidden>\n fx\n </span>\n <div style={INPUT_WRAP_STYLE}>\n <input\n type=\"text\"\n aria-label=\"Formula bar\"\n data-testid=\"casual-sheets-formula-input\"\n style={INPUT_STYLE}\n value={shown}\n onChange={(e) => onType(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={(e) => {\n if (draftRef.current !== null) commit(e.target.value);\n }}\n disabled={!api}\n />\n {acOpen && (\n <div style={AC_STYLE} data-testid=\"cs-formula-suggestions\" role=\"listbox\">\n {suggestions.map((fn, i) => (\n <button\n key={fn}\n type=\"button\"\n role=\"option\"\n aria-selected={i === acIdx}\n data-testid={`cs-formula-suggestion-${fn}`}\n style={{\n ...AC_ITEM_STYLE,\n background: i === acIdx ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: i === acIdx ? 'var(--cs-chrome-active-fg, #0e7490)' : AC_ITEM_STYLE.color,\n }}\n // mousedown+preventDefault so the input keeps focus (no blur-commit).\n onMouseDown={(e) => {\n e.preventDefault();\n complete(fn);\n }}\n onMouseEnter={() => setAcIdx(i)}\n >\n {fn}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * NameBox — the Excel \"Name Box\" for `<CasualSheets chrome>`.\n *\n * A small editable box that mirrors the active cell's A1 reference live, and\n * lets you navigate by typing a reference (e.g. `B5` or `A1:C3`) + Enter. Self-\n * contained: reads the active selection through `CasualSheetsAPI` and navigates\n * through the FUniver facade (`getRange(a1).activate()`) — no app context, no\n * named-range support (defined names land with the rich name-box later).\n *\n * The orchestrator uses this to replace the static name-box span currently\n * inside FormulaBar.tsx; this component does NOT edit FormulaBar.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties, type KeyboardEvent } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\n/** A defined name as surfaced by the FWorkbook facade. */\ninterface DefinedNameEntry {\n name: string;\n ref: string;\n}\n\n/**\n * Read the active workbook's defined names through the FWorkbook facade\n * (`getDefinedNames()` → `FDefinedName[]`, each with `getName()` +\n * `getFormulaOrRefString()`). Returns [] when the facade/API is unavailable —\n * never invents an API.\n */\nfunction readDefinedNames(api: CasualSheetsAPI | null): DefinedNameEntry[] {\n if (!api) return [];\n try {\n const wb = api.univer.getActiveWorkbook() as unknown as {\n getDefinedNames?: () => Array<{\n getName?: () => string;\n getFormulaOrRefString?: () => string;\n }>;\n } | null;\n const names = wb?.getDefinedNames?.();\n if (!names) return [];\n return names\n .map((dn) => ({\n name: dn.getName?.() ?? '',\n ref: dn.getFormulaOrRefString?.() ?? '',\n }))\n .filter((e) => e.name !== '');\n } catch {\n return [];\n }\n}\n\n/** A1 column letters from a 0-based column index (0→A, 26→AA). */\nfunction colToLetters(col: number): string {\n let s = '';\n let n = col;\n do {\n s = String.fromCharCode(65 + (n % 26)) + s;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return s;\n}\n\n/** The active selection's top-left A1 reference, or '' when unavailable. */\nfunction readActiveRef(api: CasualSheetsAPI): string {\n const sel = api.getSelection();\n if (!sel) return '';\n const { startRow, startColumn } = sel.range;\n return colToLetters(startColumn) + (startRow + 1);\n}\n\nconst BOX_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 80,\n height: 24,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'center',\n boxSizing: 'border-box',\n};\n\nconst ROOT_STYLE: CSSProperties = {\n flex: '0 0 auto',\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst DROPDOWN_BTN_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 20,\n height: 24,\n marginLeft: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n padding: 0,\n};\n\nconst MENU_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n minWidth: 160,\n maxHeight: 280,\n overflowY: 'auto',\n padding: 4,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst MENU_ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 12,\n width: '100%',\n height: 28,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'left',\n cursor: 'pointer',\n boxSizing: 'border-box',\n};\n\nconst MENU_EMPTY_STYLE: CSSProperties = {\n padding: '6px 8px',\n color: 'var(--cs-chrome-muted, #8a8886)',\n fontSize: 12,\n whiteSpace: 'nowrap',\n};\n\nconst ITEM_REF_STYLE: CSSProperties = {\n color: 'var(--cs-chrome-muted, #8a8886)',\n fontSize: 11,\n flex: '0 0 auto',\n};\n\nexport interface NameBoxProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function NameBox({ api }: NameBoxProps) {\n // The A1 reference of the active cell.\n const [ref, setRef] = useState('');\n // null = mirror the active cell; a string = the user is typing.\n const [draft, setDraft] = useState<string | null>(null);\n const draftRef = useRef<string | null>(null);\n draftRef.current = draft;\n const inputRef = useRef<HTMLInputElement>(null);\n // The defined-names dropdown: open state, current entries, and a root ref for\n // outside-pointerdown detection (mirrors ColorPicker's popover pattern).\n const [open, setOpen] = useState(false);\n const [names, setNames] = useState<DefinedNameEntry[]>([]);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Reflect the active cell: subscribe to command activity (covers selection\n // moves) and re-read the reference — unless the user is mid-edit.\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n if (draftRef.current !== null) return;\n setRef(readActiveRef(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n // While the dropdown is open, close it on Escape or any outside pointerdown.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n /** Navigate to the typed A1 reference / range. Invalid input is ignored. */\n const navigate = (text: string) => {\n const t = text.trim();\n setDraft(null);\n if (!api || t === '') {\n setRef(readActiveRef(api ?? ({} as CasualSheetsAPI)));\n return;\n }\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n try {\n // FRange.getRange parses an A1 string (\"B5\") or range (\"A1:C3\").\n const range = (sheet as unknown as { getRange(a1: string): { activate(): void } }).getRange(\n t,\n );\n range.activate();\n } catch {\n // Invalid reference — fall back to the current selection.\n setRef(readActiveRef(api));\n }\n };\n\n // Open the dropdown: refresh the defined-name list from the live workbook,\n // then toggle. mousedown (not click) so the grid selection isn't lost first.\n const toggleDropdown = () => {\n setOpen((cur) => {\n const next = !cur;\n if (next) setNames(readDefinedNames(api));\n return next;\n });\n };\n\n // Navigate to a defined name's range. The ref may carry a sheet prefix\n // (\"Sheet1!$A$1\") and absolute `$` markers — strip both, then reuse the same\n // getRange(...).activate() path the typed-reference navigation uses.\n const navigateName = (entry: DefinedNameEntry) => {\n setOpen(false);\n const raw = entry.ref.trim();\n if (raw === '') return;\n const afterSheet = raw.includes('!') ? raw.slice(raw.lastIndexOf('!') + 1) : raw;\n const a1 = afterSheet.replace(/\\$/g, '');\n navigate(a1);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n navigate((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(null);\n setRef(api ? readActiveRef(api) : '');\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const shown = draft ?? ref;\n\n return (\n <div ref={rootRef} style={ROOT_STYLE}>\n <input\n ref={inputRef}\n type=\"text\"\n aria-label=\"Name box\"\n title=\"Name box\"\n data-testid=\"cs-namebox-input\"\n style={BOX_STYLE}\n value={shown}\n disabled={!api}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onFocus={(e) => e.currentTarget.select()}\n onBlur={() => {\n // Abandon any uncommitted edit without navigating.\n if (draftRef.current !== null) {\n setDraft(null);\n setRef(api ? readActiveRef(api) : '');\n }\n }}\n />\n <button\n type=\"button\"\n title=\"Defined names\"\n aria-label=\"Defined names\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"cs-namebox-dropdown\"\n style={{\n ...DROPDOWN_BTN_STYLE,\n background: open ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: open ? 'var(--cs-chrome-active-fg, #0e7490)' : DROPDOWN_BTN_STYLE.color,\n }}\n disabled={!api}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n toggleDropdown();\n }}\n >\n <Icon name=\"expand_more\" size={18} />\n </button>\n {open && (\n <div style={MENU_STYLE} role=\"menu\" data-testid=\"cs-namebox-menu\">\n {names.length === 0 ? (\n <div style={MENU_EMPTY_STYLE}>No names</div>\n ) : (\n names.map((entry, i) => (\n <button\n key={entry.name}\n type=\"button\"\n role=\"menuitem\"\n title={entry.ref || entry.name}\n data-testid={`cs-namebox-name-${i}`}\n style={MENU_ITEM_STYLE}\n onMouseDown={(e) => {\n e.preventDefault();\n navigateName(entry);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <span>{entry.name}</span>\n {entry.ref && <span style={ITEM_REF_STYLE}>{entry.ref}</span>}\n </button>\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * StatusBar — built-in status bar for `<CasualSheets chrome>`.\n *\n * Self-contained: reads the active selection through `CasualSheetsAPI` and shows\n * Excel-style aggregates over it (Average / Count / Numerical Count / Min / Max\n * / Sum), plus a zoom control on the right (− / level / +, click the level to\n * reset to 100%). Drives the editor only through the facade + commands.\n *\n * Count = non-empty cells (any type); Numerical Count = numeric cells; the\n * numeric aggregates (Average/Min/Max/Sum) run over the numeric cells only —\n * matching Excel's status-bar semantics.\n *\n * Zoom dispatches the OPERATION `sheet.operation.set-zoom-ratio` (not the\n * `set-zoom-ratio` / `change-zoom-ratio` commands, which bail when Univer's\n * always-present formula-bar editor unit reports visible). The operation's\n * render controller registers in sheets-ui's `onRendered` lifecycle — i.e. a\n * frame or two after `onReady` — so the buttons just no-op until the grid has\n * painted; in practice the user can't click that fast.\n */\n\nimport { useEffect, useState, type CSSProperties } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\ninterface Stats {\n /** Non-empty cells (any type). */\n count: number;\n /** Numeric cells. */\n numCount: number;\n sum: number;\n avg: number;\n min: number;\n max: number;\n}\n\nfunction readStats(api: CasualSheetsAPI): Stats | null {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return null;\n const { startRow, startColumn, endRow, endColumn } = sel.range;\n // Single cell → nothing to aggregate (matches Excel).\n if (startRow === endRow && startColumn === endColumn) return null;\n const values = sheet.getRange(sel.range).getValues?.() as unknown[][] | undefined;\n if (!values) return null;\n let count = 0;\n let numCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const row of values) {\n for (const v of row) {\n if (v == null || v === '') continue;\n count += 1;\n if (typeof v === 'number' && Number.isFinite(v)) {\n numCount += 1;\n sum += v;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n }\n if (count === 0) return null;\n return { count, numCount, sum, avg: numCount ? sum / numCount : 0, min, max };\n}\n\n/** Current zoom as a fraction (1 = 100%). Reads the live worksheet config via\n * the facade's `getSheet()` escape hatch; falls back to 1. */\nfunction readZoom(api: CasualSheetsAPI): number {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ws = (sheet as any)?.getSheet?.();\n const z = ws?.getConfig?.().zoomRatio;\n return typeof z === 'number' && z > 0 ? z : 1;\n}\n\n// Trim float noise without locking to a fixed precision.\nfunction fmt(n: number): string {\n return Number(n.toFixed(10)).toLocaleString();\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 16,\n height: 24,\n padding: '0 12px',\n borderTop: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n color: 'var(--cs-chrome-muted, #4b5563)',\n flex: '0 0 auto',\n font: 'inherit',\n fontSize: 12,\n userSelect: 'none',\n};\n\nconst ZOOM_GROUP_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n};\n\nconst ZOOM_BTN_STYLE: CSSProperties = {\n width: 20,\n height: 18,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n padding: 0,\n};\n\nconst ZOOM_LEVEL_STYLE: CSSProperties = {\n minWidth: 40,\n height: 18,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-muted, #4b5563)',\n cursor: 'pointer',\n font: 'inherit',\n fontSize: 12,\n textAlign: 'center',\n};\n\nexport interface StatusBarProps {\n api: CasualSheetsAPI | null;\n}\n\nexport function StatusBar({ api }: StatusBarProps) {\n const [stats, setStats] = useState<Stats | null>(null);\n const [zoom, setZoom] = useState(1);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n setStats(readStats(api));\n setZoom(readZoom(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n // Drive the zoom OPERATION directly — see file header for why not the commands.\n const setZoomRatio = (ratio: number) => {\n const wb = api?.univer.getActiveWorkbook();\n const sheet = wb?.getActiveSheet();\n if (!wb || !sheet) return;\n const clamped = Math.min(4, Math.max(0.1, ratio));\n void api?.executeCommand('sheet.operation.set-zoom-ratio', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n zoomRatio: clamped,\n });\n // Optimistic local update — the onCommandExecuted refresh will reconcile.\n setZoom(clamped);\n };\n const zoomBy = (delta: number) => setZoomRatio(Math.round((zoom + delta) * 100) / 100);\n const resetZoom = () => setZoomRatio(1);\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-status-bar\">\n {stats && (\n <>\n {stats.numCount > 0 && <span data-stat=\"average\">Average: {fmt(stats.avg)}</span>}\n <span data-stat=\"count\">Count: {stats.count}</span>\n {stats.numCount > 0 && (\n <>\n <span data-stat=\"num-count\">Numerical Count: {stats.numCount}</span>\n <span data-stat=\"min\">Min: {fmt(stats.min)}</span>\n <span data-stat=\"max\">Max: {fmt(stats.max)}</span>\n <span data-stat=\"sum\">Sum: {fmt(stats.sum)}</span>\n </>\n )}\n </>\n )}\n <span style={ZOOM_GROUP_STYLE} data-testid=\"cs-zoom\">\n <button\n type=\"button\"\n style={ZOOM_BTN_STYLE}\n aria-label=\"Zoom out\"\n title=\"Zoom out\"\n data-testid=\"cs-zoom-out\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n zoomBy(-0.1);\n }}\n >\n −\n </button>\n <button\n type=\"button\"\n style={ZOOM_LEVEL_STYLE}\n aria-label=\"Reset zoom to 100%\"\n title=\"Reset zoom to 100%\"\n data-testid=\"cs-zoom-level\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n resetZoom();\n }}\n >\n {Math.round(zoom * 100)}%\n </button>\n <button\n type=\"button\"\n style={ZOOM_BTN_STYLE}\n aria-label=\"Zoom in\"\n title=\"Zoom in\"\n data-testid=\"cs-zoom-in\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n zoomBy(0.1);\n }}\n >\n +\n </button>\n </span>\n </div>\n );\n}\n","/**\n * MenuBar — the built-in dropdown menu row for `<CasualSheets chrome>`.\n *\n * Office-style horizontal menu strip (no logo, no title — the host frames the\n * editor with its own bar): Edit · Insert · Format · Data. Each button opens a\n * dropdown of items that dispatch a single verified Univer command through\n * `CasualSheetsAPI.executeCommand`, then close the menu.\n *\n * Self-contained: only one menu is open at a time; Escape and an outside\n * pointerdown close it. Every command id below was verified against the fork\n * (`vendor/univer-revamp/packages`); items whose command can't be verified are\n * omitted rather than dispatched blindly.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\nimport { ensureChromeFonts } from './fonts';\n\ntype MenuId = 'edit' | 'insert' | 'format' | 'data' | 'view';\n\ninterface MenuItem {\n /** Stable id — drives the per-item testid `cs-menuitem-<id>`. */\n id: string;\n label: string;\n command: string;\n icon?: string;\n params?: object;\n}\n\ninterface Menu {\n id: MenuId;\n label: string;\n items: MenuItem[];\n}\n\n// All command ids below verified via:\n// grep -rhoE \"id: '(sheet\\.command\\.[a-z.-]+)'\" vendor/univer-revamp/packages | sort -u\n// (undo/redo: univer.command.undo / .redo in packages/core undoredo)\nconst MENUS: Menu[] = [\n {\n id: 'edit',\n label: 'Edit',\n items: [\n { id: 'undo', label: 'Undo', command: 'univer.command.undo', icon: 'undo' },\n { id: 'redo', label: 'Redo', command: 'univer.command.redo', icon: 'redo' },\n { id: 'cut', label: 'Cut', command: 'univer.command.cut', icon: 'content_cut' },\n { id: 'copy', label: 'Copy', command: 'univer.command.copy', icon: 'content_copy' },\n { id: 'paste', label: 'Paste', command: 'univer.command.paste', icon: 'content_paste' },\n ],\n },\n {\n id: 'insert',\n label: 'Insert',\n items: [\n {\n id: 'insert-row',\n label: 'Insert row above',\n command: 'sheet.command.insert-row-before',\n icon: 'add_row_above',\n },\n {\n id: 'insert-col',\n label: 'Insert column left',\n command: 'sheet.command.insert-col-before',\n icon: 'add_column_left',\n },\n {\n id: 'delete-row',\n label: 'Delete row',\n command: 'sheet.command.remove-row',\n icon: 'delete',\n },\n {\n id: 'delete-col',\n label: 'Delete column',\n command: 'sheet.command.remove-col',\n icon: 'delete',\n },\n ],\n },\n {\n id: 'format',\n label: 'Format',\n items: [\n { id: 'bold', label: 'Bold', command: 'sheet.command.set-range-bold', icon: 'format_bold' },\n {\n id: 'italic',\n label: 'Italic',\n command: 'sheet.command.set-range-italic',\n icon: 'format_italic',\n },\n {\n id: 'underline',\n label: 'Underline',\n command: 'sheet.command.set-range-underline',\n icon: 'format_underlined',\n },\n {\n id: 'wrap-text',\n label: 'Wrap text',\n command: 'sheet.command.set-text-wrap',\n icon: 'wrap_text',\n },\n {\n id: 'clear-format',\n label: 'Clear formatting',\n command: 'sheet.command.clear-selection-format',\n icon: 'format_clear',\n },\n ],\n },\n {\n id: 'data',\n label: 'Data',\n items: [\n {\n id: 'sort-asc',\n label: 'Sort ascending',\n command: 'sheet.command.sort-range-asc',\n icon: 'arrow_upward',\n },\n {\n id: 'sort-desc',\n label: 'Sort descending',\n command: 'sheet.command.sort-range-desc',\n icon: 'arrow_downward',\n },\n {\n id: 'toggle-filter',\n label: 'Toggle filter',\n command: 'sheet.command.smart-toggle-filter',\n icon: 'filter_alt',\n },\n ],\n },\n {\n id: 'view',\n label: 'View',\n items: [\n {\n id: 'freeze',\n label: 'Freeze panes',\n command: 'sheet.command.set-selection-frozen',\n icon: 'table_view',\n },\n {\n id: 'unfreeze',\n label: 'Unfreeze panes',\n command: 'sheet.command.cancel-frozen',\n icon: 'grid_off',\n },\n {\n id: 'toggle-gridlines',\n label: 'Toggle gridlines',\n command: 'sheet.command.toggle-gridlines',\n icon: 'grid_on',\n },\n ],\n },\n];\n\nconst BAR_STYLE: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n padding: '2px 6px',\n borderBottom: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-bg, #eef1f5)',\n flex: '0 0 auto',\n userSelect: 'none',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst MENU_BTN_STYLE: CSSProperties = {\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst DROPDOWN_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n minWidth: 200,\n marginTop: 2,\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n zIndex: 1000,\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n width: '100%',\n height: 30,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'left',\n};\n\nexport interface MenuBarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function MenuBar({ api }: MenuBarProps) {\n const [open, setOpen] = useState<MenuId | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n ensureChromeFonts();\n }, []);\n\n // Close on Escape + on a pointerdown outside the menu bar.\n useEffect(() => {\n if (open === null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(null);\n };\n const onDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(null);\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onDown, true);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onDown, true);\n };\n }, [open]);\n\n const run = (item: MenuItem) => {\n setOpen(null);\n void api?.executeCommand(item.command, item.params);\n };\n\n return (\n <div\n ref={rootRef}\n style={BAR_STYLE}\n data-testid=\"cs-menubar\"\n role=\"menubar\"\n aria-label=\"Menu bar\"\n >\n {MENUS.map((menu) => {\n const isOpen = open === menu.id;\n return (\n <div key={menu.id} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n data-menu={menu.id}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n style={{\n ...MENU_BTN_STYLE,\n background: isOpen ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: isOpen ? 'var(--cs-chrome-active-fg, #0e7490)' : MENU_BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid selection isn't lost first;\n // toggle the menu open/closed.\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen((cur) => (cur === menu.id ? null : menu.id));\n }}\n onMouseEnter={(e) => {\n // Hover-to-switch once a menu is already open (Office behaviour).\n if (open !== null && open !== menu.id) setOpen(menu.id);\n else if (!isOpen)\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isOpen\n ? 'var(--cs-chrome-active, #e6f3f7)'\n : 'transparent';\n }}\n >\n {menu.label}\n </button>\n {isOpen && (\n <div style={DROPDOWN_STYLE} role=\"menu\" aria-label={menu.label}>\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-testid={`cs-menuitem-${item.id}`}\n disabled={!api}\n style={{ ...ITEM_STYLE, opacity: api ? 1 : 0.5 }}\n onMouseDown={(e) => {\n e.preventDefault();\n run(item);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n {item.icon ? (\n <Icon name={item.icon} size={18} />\n ) : (\n <span style={{ width: 18 }} aria-hidden />\n )}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * SheetTabs — worksheet tab strip for `<CasualSheets chrome>`.\n *\n * The fundamental multi-sheet control the built-in chrome was missing: switch\n * sheets (click), add a sheet (+), rename (double-click), and delete (context\n * menu). Drives the editor through the FUniver facade only — `insertSheet` /\n * `setActiveSheet` / `deleteSheet` / `FWorksheet.setName` — and stays live by\n * subscribing to the sheet-lifecycle facade events (plus the mutation-level\n * fallback so collab/replay-driven changes refresh too).\n *\n * Scope of this batch: switch / add / rename / delete. Drag-reorder, tab\n * colour, hide/unhide, and duplicate are richer host features deferred to\n * later parity batches (the reference app's SheetTabs has them).\n */\n\nimport { useEffect, useState, type CSSProperties, type KeyboardEvent } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\ninterface SheetTab {\n id: string;\n name: string;\n hidden: boolean;\n}\n\ninterface SheetsSnapshot {\n tabs: SheetTab[];\n activeId: string | null;\n}\n\nconst EMPTY: SheetsSnapshot = { tabs: [], activeId: null };\n\n/** Sheet-list mutations that must refresh the strip even when they arrive via\n * the collab bridge's mutation-only replay (which bypasses facade events). */\nconst SHEET_LIST_MUTATIONS = new Set([\n 'sheet.mutation.insert-sheet',\n 'sheet.mutation.remove-sheet',\n 'sheet.mutation.set-worksheet-name',\n 'sheet.mutation.set-worksheet-order',\n 'sheet.mutation.set-worksheet-hidden',\n]);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFacade = any;\n\nfunction readSheets(api: CasualSheetsAPI): SheetsSnapshot {\n const wb = api.univer.getActiveWorkbook();\n if (!wb) return EMPTY;\n const tabs = wb.getSheets().map((s) => ({\n id: s.getSheetId(),\n name: s.getSheetName(),\n hidden: (s as AnyFacade).isSheetHidden?.() === true,\n }));\n return { tabs, activeId: wb.getActiveSheet()?.getSheetId() ?? null };\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'stretch',\n gap: 2,\n height: 30,\n flex: '0 0 auto',\n padding: '0 6px',\n borderTop: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n font: 'inherit',\n fontSize: 13,\n overflowX: 'auto',\n overflowY: 'hidden',\n};\n\nconst ADD_BTN_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 28,\n border: 'none',\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n fontSize: 18,\n lineHeight: 1,\n borderRadius: 4,\n};\n\nconst RENAME_INPUT_STYLE: CSSProperties = {\n height: 22,\n alignSelf: 'center',\n padding: '0 6px',\n border: '1px solid var(--cs-chrome-active-fg, #0e7490)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n width: 120,\n};\n\nconst MENU_STYLE: CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n minWidth: 140,\n padding: 4,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n};\n\nconst MENU_ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 28,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\nexport interface SheetTabsProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function SheetTabs({ api }: SheetTabsProps) {\n const [{ tabs, activeId }, setSnapshot] = useState<SheetsSnapshot>(EMPTY);\n // Inline-rename target sheet id (null = not renaming) + its draft text.\n const [renaming, setRenaming] = useState<string | null>(null);\n const [draft, setDraft] = useState('');\n // Right-click context menu: anchor + target sheet id.\n const [menu, setMenu] = useState<{ x: number; y: number; sheetId: string } | null>(null);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => setSnapshot(readSheets(api));\n refresh();\n const f = api.univer as AnyFacade;\n const subs: Array<{ dispose(): void }> = [];\n try {\n subs.push(\n f.addEvent(f.Event.SheetCreated, refresh),\n f.addEvent(f.Event.SheetDeleted, refresh),\n f.addEvent(f.Event.SheetNameChanged, refresh),\n f.addEvent(f.Event.ActiveSheetChanged, refresh),\n f.addEvent(f.Event.SheetMoved, refresh),\n // Mutation-level fallback — catches collab/replay-driven changes that\n // don't emit the higher-level facade events.\n f.addEvent(f.Event.CommandExecuted, (e: { id?: string }) => {\n if (e?.id && SHEET_LIST_MUTATIONS.has(e.id)) refresh();\n }),\n );\n // Whole-unit swaps (loadSnapshot / File→Open) don't fire SheetCreated;\n // refresh a tick after the new unit is wired in.\n if (typeof f.onUniverSheetCreated === 'function') {\n subs.push(f.onUniverSheetCreated(() => queueMicrotask(refresh)));\n }\n } catch {\n /* facade event surface differs — the initial read still populated tabs */\n }\n return () => {\n for (const s of subs) s?.dispose?.();\n };\n }, [api]);\n\n // Close the context menu on any outside interaction.\n useEffect(() => {\n if (!menu) return;\n const close = () => setMenu(null);\n window.addEventListener('pointerdown', close);\n window.addEventListener('keydown', close);\n return () => {\n window.removeEventListener('pointerdown', close);\n window.removeEventListener('keydown', close);\n };\n }, [menu]);\n\n if (!api) {\n return <div style={BAR_STYLE} data-testid=\"casual-sheets-tabs\" />;\n }\n\n const visible = tabs.filter((t) => !t.hidden);\n const wb = () => api.univer.getActiveWorkbook();\n\n const switchTo = (id: string) => {\n if (id === activeId) return;\n wb()?.setActiveSheet(id);\n };\n\n const addSheet = () => {\n const created = (wb() as AnyFacade)?.insertSheet?.();\n created?.activate?.();\n };\n\n const startRename = (tab: SheetTab) => {\n setMenu(null);\n setRenaming(tab.id);\n setDraft(tab.name);\n };\n\n const commitRename = () => {\n const id = renaming;\n setRenaming(null);\n if (!id) return;\n const name = draft.trim();\n if (!name) return;\n const sheet = (wb() as AnyFacade)?.getSheetBySheetId?.(id);\n if (sheet && sheet.getSheetName?.() !== name) sheet.setName?.(name);\n };\n\n const deleteSheet = (id: string) => {\n setMenu(null);\n // Excel keeps at least one visible sheet — never delete the last one.\n if (visible.length <= 1) return;\n (wb() as AnyFacade)?.deleteSheet?.(id);\n };\n\n const onRenameKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitRename();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setRenaming(null);\n }\n };\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-tabs\" role=\"tablist\">\n {visible.map((tab) => {\n const active = tab.id === activeId;\n if (renaming === tab.id) {\n return (\n <input\n key={tab.id}\n autoFocus\n style={RENAME_INPUT_STYLE}\n value={draft}\n data-testid=\"cs-tab-rename-input\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onRenameKey}\n onBlur={commitRename}\n />\n );\n }\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-testid={`cs-tab-${tab.id}`}\n data-active={active || undefined}\n title={tab.name}\n style={{\n flex: '0 0 auto',\n maxWidth: 160,\n padding: '0 12px',\n border: 'none',\n borderTop: active\n ? '2px solid var(--cs-chrome-active-fg, #0e7490)'\n : '2px solid transparent',\n background: active ? 'var(--cs-chrome-input-bg, #fff)' : 'transparent',\n color: active\n ? 'var(--cs-chrome-active-fg, #0e7490)'\n : 'var(--cs-chrome-fg, #201f1e)',\n fontWeight: active ? 600 : 400,\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n // mousedown keeps the grid from stealing focus mid-switch.\n onMouseDown={(e) => {\n e.preventDefault();\n switchTo(tab.id);\n }}\n onDoubleClick={() => startRename(tab)}\n onContextMenu={(e) => {\n e.preventDefault();\n setMenu({ x: e.clientX, y: e.clientY, sheetId: tab.id });\n }}\n >\n {tab.name}\n </button>\n );\n })}\n <button\n type=\"button\"\n style={ADD_BTN_STYLE}\n aria-label=\"Add sheet\"\n title=\"Add sheet\"\n data-testid=\"cs-tab-add\"\n onMouseDown={(e) => {\n e.preventDefault();\n addSheet();\n }}\n >\n +\n </button>\n\n {menu && (\n <div\n style={{ ...MENU_STYLE, left: menu.x, top: menu.y }}\n data-testid=\"cs-tab-menu\"\n role=\"menu\"\n // Keep clicks inside the menu from closing it via the window handler.\n onPointerDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n style={MENU_ITEM_STYLE}\n data-testid=\"cs-tab-menu-rename\"\n onMouseDown={(e) => {\n e.preventDefault();\n const tab = tabs.find((t) => t.id === menu.sheetId);\n if (tab) startRename(tab);\n }}\n >\n Rename\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n style={{\n ...MENU_ITEM_STYLE,\n opacity: visible.length <= 1 ? 0.5 : 1,\n cursor: visible.length <= 1 ? 'not-allowed' : 'pointer',\n }}\n data-testid=\"cs-tab-menu-delete\"\n onMouseDown={(e) => {\n e.preventDefault();\n deleteSheet(menu.sheetId);\n }}\n >\n Delete\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * FindReplace — a custom find/replace dialog for `<CasualSheets chrome>`.\n *\n * Univer's own find-replace dialog doesn't render in the SDK's headless mount\n * (it needs Univer's UI/overlay layer, which is dormant when header/toolbar/\n * footer are off), so the chrome ships its own — driven purely through the\n * facade: search reads the active sheet's `cellData` from `getSnapshot()`,\n * navigation `activate()`s the matching cell, and replace `setValue()`s it.\n *\n * Opens on Ctrl/Cmd+F (find) or Ctrl/Cmd+H (replace) while the editor has focus;\n * Escape closes. Self-managing — just mount it in the chrome with the live api.\n */\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\ninterface Match {\n row: number;\n col: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySnapshot = any;\n\n/** Collect matches on the active sheet, in row-major order. Searches each\n * cell's value (`v`) and formula (`f`) text. */\nfunction findMatches(api: CasualSheetsAPI, query: string, matchCase: boolean): Match[] {\n if (!query) return [];\n const snap = api.getSnapshot() as AnySnapshot;\n const sheetId =\n api.getSelection()?.sheetId ?? api.univer.getActiveWorkbook()?.getActiveSheet()?.getSheetId();\n const sheet = sheetId ? snap?.sheets?.[sheetId] : undefined;\n const cellData = sheet?.cellData as Record<string, Record<string, AnySnapshot>> | undefined;\n if (!cellData) return [];\n const needle = matchCase ? query : query.toLowerCase();\n const out: Match[] = [];\n for (const rk of Object.keys(cellData).sort((a, b) => Number(a) - Number(b))) {\n const rowObj = cellData[rk];\n if (!rowObj) continue;\n for (const ck of Object.keys(rowObj).sort((a, b) => Number(a) - Number(b))) {\n const cell = rowObj[ck];\n if (!cell) continue;\n const hay = `${cell.v ?? ''}${cell.f ? ` ${cell.f}` : ''}`;\n const cmp = matchCase ? hay : hay.toLowerCase();\n if (cmp.includes(needle)) out.push({ row: Number(rk), col: Number(ck) });\n }\n }\n return out;\n}\n\nconst WRAP_STYLE: CSSProperties = {\n position: 'absolute',\n top: 8,\n right: 12,\n zIndex: 1100,\n width: 320,\n padding: 10,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 8px 28px rgba(0,0,0,0.18)',\n font: 'inherit',\n fontSize: 13,\n color: 'var(--cs-chrome-fg, #201f1e)',\n};\n\nconst ROW_STYLE: CSSProperties = { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 };\n\nconst INPUT_STYLE: CSSProperties = {\n flex: '1 1 auto',\n height: 26,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n boxSizing: 'border-box',\n};\n\nconst BTN_STYLE: CSSProperties = {\n height: 26,\n padding: '0 10px',\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 4,\n background: 'var(--cs-chrome-bg, #f3f5f8)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 12,\n cursor: 'pointer',\n};\n\nconst ICON_BTN_STYLE: CSSProperties = {\n width: 26,\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n padding: 0,\n};\n\nexport interface FindReplaceProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function FindReplace({ api }: FindReplaceProps) {\n const [open, setOpen] = useState(false);\n const [showReplace, setShowReplace] = useState(false);\n const [query, setQuery] = useState('');\n const [replaceText, setReplaceText] = useState('');\n const [matchCase, setMatchCase] = useState(false);\n const [idx, setIdx] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Open on Ctrl/Cmd+F (find) / Ctrl/Cmd+H (replace), close on Escape.\n useEffect(() => {\n const onKey = (e: globalThis.KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && (e.key === 'f' || e.key === 'F')) {\n e.preventDefault();\n setShowReplace(false);\n setOpen(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n } else if (mod && (e.key === 'h' || e.key === 'H')) {\n e.preventDefault();\n setShowReplace(true);\n setOpen(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n\n const matches = useMemo(\n () => (api && open && query ? findMatches(api, query, matchCase) : []),\n [api, open, query, matchCase],\n );\n\n // Keep idx in range as matches change.\n useEffect(() => {\n setIdx((i) => (matches.length === 0 ? 0 : Math.min(i, matches.length - 1)));\n }, [matches.length]);\n\n if (!open || !api) return null;\n\n const go = (delta: number) => {\n if (matches.length === 0) return;\n const next = (idx + delta + matches.length) % matches.length;\n setIdx(next);\n activate(matches[next]);\n };\n\n const activate = (m: Match) => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (sheet?.getRange(m.row, m.col) as any)?.activate?.();\n };\n\n const replaceOne = () => {\n if (matches.length === 0) return;\n const m = matches[Math.min(idx, matches.length - 1)];\n replaceAt(m);\n // Matches recompute via the query memo on next render; advance stays put.\n };\n\n const replaceAt = (m: Match) => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n const cur = String(sheet.getRange(m.row, m.col).getValue?.() ?? '');\n const next = replaceInString(cur, query, replaceText, matchCase);\n if (next !== cur) sheet.getRange(m.row, m.col).setValue(next);\n };\n\n const replaceAll = () => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n for (const m of matches) {\n const cur = String(sheet.getRange(m.row, m.col).getValue?.() ?? '');\n const next = replaceInString(cur, query, replaceText, matchCase);\n if (next !== cur) sheet.getRange(m.row, m.col).setValue(next);\n }\n };\n\n const onInputKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n go(e.shiftKey ? -1 : 1);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n }\n };\n\n const count = matches.length;\n const position = count === 0 ? 0 : Math.min(idx, count - 1) + 1;\n\n return (\n <div\n style={WRAP_STYLE}\n data-testid=\"cs-find-replace\"\n role=\"dialog\"\n aria-label=\"Find and replace\"\n >\n <div style={ROW_STYLE}>\n <input\n ref={inputRef}\n type=\"text\"\n aria-label=\"Find\"\n placeholder=\"Find\"\n data-testid=\"cs-find-input\"\n style={INPUT_STYLE}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onInputKey}\n />\n <span\n style={{ minWidth: 54, textAlign: 'center', color: 'var(--cs-chrome-muted, #6b7280)' }}\n data-testid=\"cs-find-count\"\n >\n {position}/{count}\n </span>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Previous match\"\n data-testid=\"cs-find-prev\"\n onMouseDown={(e) => {\n e.preventDefault();\n go(-1);\n }}\n >\n <Icon name=\"keyboard_arrow_up\" size={18} />\n </button>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Next match\"\n data-testid=\"cs-find-next\"\n onMouseDown={(e) => {\n e.preventDefault();\n go(1);\n }}\n >\n <Icon name=\"keyboard_arrow_down\" size={18} />\n </button>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Close\"\n data-testid=\"cs-find-close\"\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen(false);\n }}\n >\n <Icon name=\"close\" size={18} />\n </button>\n </div>\n\n {showReplace && (\n <div style={ROW_STYLE}>\n <input\n type=\"text\"\n aria-label=\"Replace with\"\n placeholder=\"Replace with\"\n data-testid=\"cs-replace-input\"\n style={INPUT_STYLE}\n value={replaceText}\n onChange={(e) => setReplaceText(e.target.value)}\n />\n <button\n type=\"button\"\n style={BTN_STYLE}\n data-testid=\"cs-replace-one\"\n onMouseDown={(e) => {\n e.preventDefault();\n replaceOne();\n }}\n >\n Replace\n </button>\n <button\n type=\"button\"\n style={BTN_STYLE}\n data-testid=\"cs-replace-all\"\n onMouseDown={(e) => {\n e.preventDefault();\n replaceAll();\n }}\n >\n All\n </button>\n </div>\n )}\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <label style={{ display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n data-testid=\"cs-find-match-case\"\n checked={matchCase}\n onChange={(e) => setMatchCase(e.target.checked)}\n />\n Match case\n </label>\n {!showReplace && (\n <button\n type=\"button\"\n style={{\n ...BTN_STYLE,\n marginLeft: 'auto',\n border: 'none',\n background: 'transparent',\n color: 'var(--cs-chrome-active-fg, #0e7490)',\n }}\n data-testid=\"cs-find-toggle-replace\"\n onMouseDown={(e) => {\n e.preventDefault();\n setShowReplace(true);\n }}\n >\n Replace…\n </button>\n )}\n </div>\n </div>\n );\n}\n\n/** Replace all occurrences of `query` in `text` (case-(in)sensitive). */\nfunction replaceInString(\n text: string,\n query: string,\n replacement: string,\n matchCase: boolean,\n): string {\n if (!query) return text;\n if (matchCase) return text.split(query).join(replacement);\n // Case-insensitive: walk and rebuild preserving non-matched casing.\n const lower = text.toLowerCase();\n const needle = query.toLowerCase();\n let out = '';\n let i = 0;\n while (i < text.length) {\n if (lower.startsWith(needle, i)) {\n out += replacement;\n i += needle.length;\n } else {\n out += text[i];\n i += 1;\n }\n }\n return out;\n}\n","/**\n * ChromeTop — the chrome ABOVE the grid (menu bar + toolbar + formula bar).\n * Lives in the `@casualoffice/sheets/chrome` entry, lazy-imported by\n * `<CasualSheets>` only when `chrome !== 'none'` so bare-grid consumers (the\n * default; the apps/web host renders chrome=\"none\" + its own shell) never bundle\n * the chrome JS.\n */\nimport { MenuBar } from './MenuBar';\nimport { Toolbar } from './Toolbar';\nimport { FormulaBar } from './FormulaBar';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\nexport function ChromeTop({ api }: { api: CasualSheetsAPI | null }) {\n return (\n <>\n <MenuBar api={api} />\n <Toolbar api={api} />\n <FormulaBar api={api} />\n </>\n );\n}\n","/**\n * ChromeBottom — the chrome BELOW the grid (sheet tabs + status bar) plus the\n * Find & Replace overlay. Lazy-imported with ChromeTop (see ChromeTop).\n */\nimport { SheetTabs } from './SheetTabs';\nimport { StatusBar } from './StatusBar';\nimport { FindReplace } from './FindReplace';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\nexport function ChromeBottom({ api }: { api: CasualSheetsAPI | null }) {\n return (\n <>\n <SheetTabs api={api} />\n <StatusBar api={api} />\n <FindReplace api={api} />\n </>\n );\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","ROW_STYLE","BTN_STYLE","POPOVER_STYLE","import_react","import_jsx_runtime","ROW_STYLE","BTN_STYLE","POPOVER_STYLE","ITEM_STYLE","import_jsx_runtime","BTN_STYLE","import_react","import_core","import_react","import_core","import_jsx_runtime","onKeyDown","import_jsx_runtime","colToLetters","BAR_STYLE","import_react","import_core","import_jsx_runtime","BAR_STYLE","import_react","import_jsx_runtime","BAR_STYLE","ITEM_STYLE","import_react","import_jsx_runtime","BAR_STYLE","MENU_STYLE","MENU_ITEM_STYLE","import_react","import_jsx_runtime","ROW_STYLE","INPUT_STYLE","BTN_STYLE","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/chrome/index.ts","../src/chrome/Toolbar.tsx","../src/chrome/Icon.tsx","../src/chrome/fonts.ts","../src/chrome/ColorPicker.tsx","../src/chrome/BordersPicker.tsx","../src/chrome/AutoSumPicker.tsx","../src/chrome/FormulaBar.tsx","../src/chrome/NameBox.tsx","../src/chrome/StatusBar.tsx","../src/chrome/MenuBar.tsx","../src/univer/lazy-plugins.ts","../src/chrome/SheetTabs.tsx","../src/chrome/FindReplace.tsx","../src/chrome/ChromeTop.tsx","../src/chrome/ChromeBottom.tsx"],"sourcesContent":["/**\n * Chrome — the Office shell as slot components for `<CasualSheets chrome>`.\n *\n * First slice (SDK_MIGRATION_PIPELINE Phase 1 step 2): a minimal built-in\n * `Toolbar`. The rich shell (FormulaBar, MenuBar, TitleBar, StatusBar) lifts\n * from `apps/web/src/shell/` here in later slices, behind `chrome=\"full\"`.\n */\nexport { Toolbar, type ToolbarProps } from './Toolbar';\nexport { FormulaBar, type FormulaBarProps } from './FormulaBar';\nexport { StatusBar, type StatusBarProps } from './StatusBar';\nexport { Icon, type IconProps } from './Icon';\nexport { ensureChromeFonts } from './fonts';\nexport { ColorPicker, type ColorPickerProps } from './ColorPicker';\nexport { BordersPicker, type BordersPickerProps } from './BordersPicker';\nexport { AutoSumPicker, type AutoSumPickerProps } from './AutoSumPicker';\nexport { MenuBar, type MenuBarProps } from './MenuBar';\nexport { NameBox, type NameBoxProps } from './NameBox';\nexport { SheetTabs, type SheetTabsProps } from './SheetTabs';\nexport { FindReplace, type FindReplaceProps } from './FindReplace';\n// Lazy-loaded shells: chrome above (ChromeTop) and below (ChromeBottom) the grid,\n// imported on demand by `<CasualSheets>` via the `@casualoffice/sheets/chrome`\n// subpath so `chrome=\"none\"` consumers don't bundle the chrome JS.\nexport { ChromeTop } from './ChromeTop';\nexport { ChromeBottom } from './ChromeBottom';\n","/**\n * Toolbar — the rich built-in formatting toolbar for `<CasualSheets chrome>`.\n *\n * Drives the editor purely through `CasualSheetsAPI.executeCommand` + the FUniver\n * facade (`api.univer`), with Material Symbols icons + design-system tokens. No\n * app context, no title/logo row (the host frames the editor with its own bar).\n * Commands grouped with dividers, Office-style — mirrors the app shell's\n * `apps/web/src/shell/Toolbar.tsx` + `RibbonControls.tsx` group/order/icons,\n * replicating `home-tab-actions.ts` logic inline against `api` / `api.univer`.\n *\n * Covered (parity with the app's Home tab):\n * history (undo/redo) · clipboard (paste/cut/copy/paste-values) · format\n * painter · font family/size + grow/shrink · bold/italic/underline/strike ·\n * text + fill colour (ColorPicker) · borders (BordersPicker) · horizontal +\n * vertical align · wrap · merge/unmerge · number-format dropdown +\n * currency/percent/decimals · AutoSum (AutoSumPicker) · clear formatting.\n *\n * Reflects the active cell — toggles light up, dropdowns show the current font /\n * number format — via a command-execution subscription.\n *\n * Dialog-only controls (Format Cells, Insert Chart, PivotTable) have no SDK\n * dialog: when the host passes `onDialogRequest` they render and call it so the\n * host can render its own; without it, they are omitted entirely (no fake\n * dialog). Each group/control can also be hidden via the `features` flag map.\n */\n\nimport { useEffect, useState, type CSSProperties } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\nimport { ensureChromeFonts } from './fonts';\nimport { ColorPicker } from './ColorPicker';\nimport { BordersPicker } from './BordersPicker';\nimport { AutoSumPicker } from './AutoSumPicker';\n\ninterface ActiveStyle {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n ht: number; // HorizontalAlign of the active cell (0 = unset)\n vt: number; // VerticalAlign of the active cell (0 = unset)\n tb: number; // WrapStrategy of the active cell (0 = unset, 3 = wrap)\n ff: string;\n fs: number;\n nf: string; // number-format pattern ('' = General)\n}\n\nconst NO_STYLE: ActiveStyle = {\n bold: false,\n italic: false,\n underline: false,\n strike: false,\n ht: 0,\n vt: 0,\n tb: 0,\n ff: '',\n fs: 0,\n nf: '',\n};\n\nfunction readActiveStyle(api: CasualSheetsAPI): ActiveStyle {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return NO_STYLE;\n const range = sheet.getRange(sel.range.startRow, sel.range.startColumn);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = (range.getCellStyleData?.() ?? null) as any;\n return {\n bold: s?.bl === 1,\n italic: s?.it === 1,\n underline: s?.ul?.s === 1,\n strike: s?.st?.s === 1,\n ht: typeof s?.ht === 'number' ? s.ht : 0,\n vt: typeof s?.vt === 'number' ? s.vt : 0,\n tb: typeof s?.tb === 'number' ? s.tb : 0,\n ff: typeof s?.ff === 'string' ? s.ff : '',\n fs: typeof s?.fs === 'number' ? s.fs : 0,\n nf: typeof s?.n?.pattern === 'string' ? s.n.pattern : '',\n };\n}\n\nconst FONT_FAMILIES = [\n 'Calibri',\n 'Arial',\n 'Helvetica',\n 'Inter',\n 'Times New Roman',\n 'Georgia',\n 'Verdana',\n 'Courier New',\n 'JetBrains Mono',\n];\nconst FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 72];\n\n/**\n * Number-format presets, mirroring the app's `home-tab-actions`\n * `NUMBER_FORMAT_PATTERNS`. The dropdown applies a pattern via the facade\n * (`FRange.setNumberFormat`, a runtime numfmt-facade extension) so it lands as a\n * normal numfmt mutation — same path the app uses.\n */\nconst NUMBER_FORMAT_PATTERNS = {\n general: '',\n integer: '#,##0',\n number: '#,##0.00',\n currency: '\"$\"#,##0.00',\n accounting: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)',\n percent: '0.00%',\n date: 'yyyy-mm-dd',\n time: 'hh:mm:ss',\n scientific: '0.00E+00',\n text: '@',\n} as const;\n\ntype NumberFormatKey = keyof typeof NUMBER_FORMAT_PATTERNS;\n\nconst NUMBER_FORMAT_OPTIONS: { value: NumberFormatKey; label: string }[] = [\n { value: 'general', label: 'General' },\n { value: 'integer', label: 'Number (no decimals)' },\n { value: 'number', label: 'Number (2 decimals)' },\n { value: 'currency', label: 'Currency' },\n { value: 'accounting', label: 'Accounting' },\n { value: 'percent', label: 'Percent' },\n { value: 'date', label: 'Date (yyyy-mm-dd)' },\n { value: 'time', label: 'Time (hh:mm:ss)' },\n { value: 'scientific', label: 'Scientific' },\n { value: 'text', label: 'Text' },\n];\n\nfunction detectFormatKey(pattern: string): NumberFormatKey {\n for (const k of Object.keys(NUMBER_FORMAT_PATTERNS) as NumberFormatKey[]) {\n if (NUMBER_FORMAT_PATTERNS[k] === pattern) return k;\n }\n return 'general';\n}\n\ninterface ToolbarAction {\n id: string;\n label: string;\n command: string;\n icon: string;\n params?: object;\n /** Feature key gating this action; defaults to the owning group's key. */\n feature?: string;\n}\n\n/**\n * Each entry is a feature-gated group. The `feature` key lets a host hide the\n * whole group (and per-action `feature` keys gate individual buttons). Order +\n * icons mirror the app shell's Home tab.\n *\n * HorizontalAlign enum (@univerjs/core): LEFT=1, CENTER=2, RIGHT=3.\n * VerticalAlign enum (@univerjs/core): TOP=1, MIDDLE=2, BOTTOM=3.\n * WrapStrategy enum (@univerjs/core): OVERFLOW=1, CLIP=2, WRAP=3.\n *\n * Clipboard command ids: `univer.command.{paste,cut,copy}` (matches\n * `home-tab-actions.ts`). Paste values-only uses the base paste command with a\n * predefined hook `value` (`special-paste-value`), same as the app's\n * `pasteSpecial`.\n */\nconst GROUPS: { feature: string; actions: ToolbarAction[] }[] = [\n {\n feature: 'history',\n actions: [\n { id: 'undo', label: 'Undo (Ctrl+Z)', command: 'univer.command.undo', icon: 'undo' },\n { id: 'redo', label: 'Redo (Ctrl+Y)', command: 'univer.command.redo', icon: 'redo' },\n ],\n },\n {\n feature: 'clipboard',\n actions: [\n {\n id: 'paste',\n label: 'Paste (Ctrl+V)',\n command: 'univer.command.paste',\n icon: 'content_paste',\n },\n { id: 'cut', label: 'Cut (Ctrl+X)', command: 'univer.command.cut', icon: 'content_cut' },\n { id: 'copy', label: 'Copy (Ctrl+C)', command: 'univer.command.copy', icon: 'content_copy' },\n {\n id: 'paste-values',\n label: 'Paste values only',\n command: 'univer.command.paste',\n icon: 'content_paste_go',\n params: { value: 'special-paste-value' },\n },\n ],\n },\n {\n feature: 'format-painter',\n actions: [\n {\n id: 'format-painter',\n label: 'Format Painter',\n command: 'sheet.command.set-once-format-painter',\n icon: 'format_paint',\n },\n ],\n },\n {\n feature: 'font-style',\n actions: [\n {\n id: 'bold',\n label: 'Bold (Ctrl+B)',\n command: 'sheet.command.set-range-bold',\n icon: 'format_bold',\n },\n {\n id: 'italic',\n label: 'Italic (Ctrl+I)',\n command: 'sheet.command.set-range-italic',\n icon: 'format_italic',\n },\n {\n id: 'underline',\n label: 'Underline (Ctrl+U)',\n command: 'sheet.command.set-range-underline',\n icon: 'format_underlined',\n },\n {\n id: 'strikethrough',\n label: 'Strikethrough',\n command: 'sheet.command.set-range-stroke',\n icon: 'format_strikethrough',\n },\n ],\n },\n {\n feature: 'alignment',\n actions: [\n {\n id: 'align-left',\n label: 'Align left',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_left',\n params: { value: 1 },\n },\n {\n id: 'align-center',\n label: 'Align center',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_center',\n params: { value: 2 },\n },\n {\n id: 'align-right',\n label: 'Align right',\n command: 'sheet.command.set-horizontal-text-align',\n icon: 'format_align_right',\n params: { value: 3 },\n },\n {\n id: 'wrap-text',\n label: 'Wrap text',\n command: 'sheet.command.set-text-wrap',\n icon: 'wrap_text',\n params: { value: 3 },\n },\n ],\n },\n {\n feature: 'alignment',\n actions: [\n {\n id: 'align-top',\n label: 'Align top',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_top',\n params: { value: 1 },\n },\n {\n id: 'align-middle',\n label: 'Align middle',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_center',\n params: { value: 2 },\n },\n {\n id: 'align-bottom',\n label: 'Align bottom',\n command: 'sheet.command.set-vertical-text-align',\n icon: 'vertical_align_bottom',\n params: { value: 3 },\n },\n ],\n },\n {\n feature: 'merge',\n actions: [\n {\n id: 'merge',\n label: 'Merge cells',\n command: 'sheet.command.add-worksheet-merge-all',\n icon: 'cell_merge',\n },\n {\n id: 'unmerge',\n label: 'Unmerge cells',\n command: 'sheet.command.remove-worksheet-merge',\n icon: 'splitscreen_vertical_add',\n },\n ],\n },\n {\n feature: 'number',\n actions: [\n {\n id: 'currency',\n label: 'Currency format',\n command: 'sheet.command.numfmt.set.currency',\n icon: 'attach_money',\n },\n {\n id: 'percent',\n label: 'Percent format',\n command: 'sheet.command.numfmt.set.percent',\n icon: 'percent',\n },\n {\n id: 'decimal-increase',\n label: 'Increase decimals',\n command: 'sheet.command.numfmt.add.decimal.command',\n icon: 'decimal_increase',\n },\n {\n id: 'decimal-decrease',\n label: 'Decrease decimals',\n command: 'sheet.command.numfmt.subtract.decimal.command',\n icon: 'decimal_decrease',\n },\n ],\n },\n {\n feature: 'clear-format',\n actions: [\n {\n id: 'clear-format',\n label: 'Clear formatting',\n command: 'sheet.command.clear-selection-format',\n icon: 'format_clear',\n },\n ],\n },\n];\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n padding: '4px 8px',\n borderBottom: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-bg, #eef1f5)',\n flex: '0 0 auto',\n userSelect: 'none',\n flexWrap: 'wrap',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst DIVIDER_STYLE: CSSProperties = {\n width: 1,\n height: 18,\n margin: '0 4px',\n background: 'var(--cs-chrome-border, #cdd3db)',\n flex: '0 0 auto',\n};\n\nconst SELECT_STYLE: CSSProperties = {\n height: 26,\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 6,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n padding: '0 4px',\n cursor: 'pointer',\n};\n\nexport interface ToolbarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n /**\n * Per-control / per-group feature flags. A key set to `false` hides that\n * control or group; omitted keys default to enabled. Keys:\n * history · clipboard · format-painter · font · font-style · color ·\n * borders · alignment · merge · number · autosum · clear-format ·\n * format-cells · insert-chart · pivot-table\n */\n features?: Record<string, boolean>;\n /**\n * Host hook for dialogs the SDK has no built-in UI for (Format Cells, Insert\n * Chart, PivotTable). When provided, those controls render and call this with\n * a `kind`; when omitted, they are not rendered (no fake dialog).\n */\n onDialogRequest?: (kind: string, context?: unknown) => void;\n}\n\n/** A feature is on unless explicitly set to `false`. */\nfunction enabled(features: Record<string, boolean> | undefined, key: string): boolean {\n return features?.[key] !== false;\n}\n\n// Which actions reflect an active state, keyed off the active cell's style.\nfunction isActive(id: string, s: ActiveStyle): boolean {\n switch (id) {\n case 'bold':\n return s.bold;\n case 'italic':\n return s.italic;\n case 'underline':\n return s.underline;\n case 'strikethrough':\n return s.strike;\n case 'align-left':\n return s.ht === 1;\n case 'align-center':\n return s.ht === 2;\n case 'align-right':\n return s.ht === 3;\n case 'align-top':\n return s.vt === 1;\n case 'align-middle':\n return s.vt === 2;\n case 'align-bottom':\n return s.vt === 3;\n case 'wrap-text':\n return s.tb === 3;\n default:\n return false;\n }\n}\n\nexport function Toolbar({ api, features, onDialogRequest }: ToolbarProps) {\n const [active, setActive] = useState<ActiveStyle>(NO_STYLE);\n\n useEffect(() => {\n ensureChromeFonts();\n }, []);\n\n // Reflect the active cell: subscribe to command activity (covers selection\n // moves + style mutations) and re-read the style.\n useEffect(() => {\n if (!api) return;\n const refresh = () => setActive(readActiveStyle(api));\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n const dispatch = (command: string, params?: object) => void api?.executeCommand(command, params);\n\n /**\n * Apply a font size via the dedicated command (matches the app's\n * `set-range-fontsize`). Used by the size dropdown + grow/shrink.\n */\n const applyFontSize = (size: number) => {\n if (!Number.isFinite(size) || size <= 0) return;\n dispatch('sheet.command.set-range-fontsize', { value: size });\n };\n\n /**\n * Grow / shrink the active cell's font size by `delta`, mirroring the app's\n * `adjustFontSize` (read current off the active cell, fall back to 11, clamp\n * to [6, 72]). Reads the size we already track in `active`.\n */\n const adjustFontSize = (delta: number) => {\n const current = active.fs && active.fs > 0 ? active.fs : 11;\n const next = Math.max(6, Math.min(72, current + delta));\n if (next === current) return;\n applyFontSize(next);\n };\n\n /**\n * Apply a number-format pattern via the FUniver facade — `FRange.setNumberFormat`\n * is a runtime numfmt-facade extension (added via `FUniver.extend()`), so a\n * runtime cast is the cleanest way to reach it. Same approach as the app's\n * `home-tab-actions.setNumberFormat`.\n */\n const applyNumberFormat = (pattern: string) => {\n const sheet = api?.univer.getActiveWorkbook()?.getActiveSheet();\n const range = (sheet as unknown as { getActiveRange?: () => unknown })?.getActiveRange?.() as\n | { setNumberFormat?: (p: string) => unknown }\n | undefined;\n range?.setNumberFormat?.(pattern);\n };\n\n // Reflect current font in the dropdowns; surface a non-listed value too.\n const familyValue = active.ff || 'Calibri';\n const familyOptions =\n active.ff && !FONT_FAMILIES.includes(active.ff) ? [active.ff, ...FONT_FAMILIES] : FONT_FAMILIES;\n const sizeValue = active.fs || 11;\n const sizeOptions =\n active.fs && !FONT_SIZES.includes(active.fs) ? [active.fs, ...FONT_SIZES] : FONT_SIZES;\n const numberFormatValue = detectFormatKey(active.nf);\n\n const renderActionButton = (a: ToolbarAction) => {\n const on = isActive(a.id, active);\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n return (\n <button\n key={a.id}\n type=\"button\"\n title={a.label}\n aria-label={a.label}\n aria-pressed={on}\n data-action={a.id}\n data-testid={`cs-${a.id}`}\n data-active={on ? 'true' : undefined}\n disabled={!api}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n dispatch(a.command, a.params);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name={a.icon} size={20} />\n </button>\n );\n };\n\n // A plain (non-command) icon button — used for grow/shrink + dialog requests.\n const renderIconButton = (\n id: string,\n label: string,\n icon: string,\n onPress: () => void,\n testid: string,\n ) => (\n <button\n key={id}\n type=\"button\"\n title={label}\n aria-label={label}\n data-action={id}\n data-testid={testid}\n disabled={!api}\n style={BTN_STYLE}\n onMouseDown={(e) => {\n e.preventDefault();\n onPress();\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <Icon name={icon} size={20} />\n </button>\n );\n\n // Render the static command groups, skipping any whose feature is off and any\n // group left empty after per-action filtering. A leading divider separates a\n // group from whatever rendered before it.\n let firstGroupRendered = false;\n const groupNodes = GROUPS.map((group, gi) => {\n if (!enabled(features, group.feature)) return null;\n const visible = group.actions.filter((a) => enabled(features, a.feature ?? group.feature));\n if (visible.length === 0) return null;\n const showDivider = firstGroupRendered;\n firstGroupRendered = true;\n return (\n <span key={gi} style={{ display: 'inline-flex', alignItems: 'center' }}>\n {showDivider && <span style={DIVIDER_STYLE} aria-hidden />}\n {visible.map(renderActionButton)}\n </span>\n );\n });\n\n const showFont = enabled(features, 'font');\n const showColor = enabled(features, 'color');\n const showBorders = enabled(features, 'borders');\n const showAutoSum = enabled(features, 'autosum');\n const showNumberDropdown = enabled(features, 'number');\n\n // Dialog-only controls: render ONLY when the host gave us a way to open them.\n const showFormatCells = enabled(features, 'format-cells') && !!onDialogRequest;\n const showInsertChart = enabled(features, 'insert-chart') && !!onDialogRequest;\n const showPivotTable = enabled(features, 'pivot-table') && !!onDialogRequest;\n const showDialogGroup = showFormatCells || showInsertChart || showPivotTable;\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-toolbar\" role=\"toolbar\" aria-label=\"Editor\">\n {showFont && (\n <>\n <select\n aria-label=\"Font family\"\n data-testid=\"cs-font-family\"\n style={{ ...SELECT_STYLE, width: 130 }}\n value={familyValue}\n disabled={!api}\n onChange={(e) =>\n dispatch('sheet.command.set-range-font-family', { value: e.target.value })\n }\n >\n {familyOptions.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n <select\n aria-label=\"Font size\"\n data-testid=\"cs-font-size\"\n style={{ ...SELECT_STYLE, width: 56, marginLeft: 4 }}\n value={sizeValue}\n disabled={!api}\n onChange={(e) => applyFontSize(Number(e.target.value))}\n >\n {sizeOptions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n {renderIconButton(\n 'font-size-up',\n 'Increase font size',\n 'text_increase',\n () => adjustFontSize(+1),\n 'cs-font-size-up',\n )}\n {renderIconButton(\n 'font-size-down',\n 'Decrease font size',\n 'text_decrease',\n () => adjustFontSize(-1),\n 'cs-font-size-down',\n )}\n <span style={DIVIDER_STYLE} aria-hidden />\n </>\n )}\n\n {groupNodes}\n\n {(showColor || showBorders) && <span style={DIVIDER_STYLE} aria-hidden />}\n {showColor && <ColorPicker api={api} />}\n {showBorders && <BordersPicker api={api} />}\n\n {showNumberDropdown && (\n <>\n <span style={DIVIDER_STYLE} aria-hidden />\n <select\n aria-label=\"Number format\"\n data-testid=\"cs-number-format\"\n style={{ ...SELECT_STYLE, width: 124 }}\n value={numberFormatValue}\n disabled={!api}\n onChange={(e) =>\n applyNumberFormat(NUMBER_FORMAT_PATTERNS[e.target.value as NumberFormatKey])\n }\n >\n {NUMBER_FORMAT_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </>\n )}\n\n {showAutoSum && (\n <>\n <span style={DIVIDER_STYLE} aria-hidden />\n <AutoSumPicker api={api} />\n </>\n )}\n\n {showDialogGroup && (\n <>\n <span style={DIVIDER_STYLE} aria-hidden />\n {showFormatCells &&\n renderIconButton(\n 'format-cells',\n 'Format Cells…',\n 'format_shapes',\n () => onDialogRequest?.('format-cells'),\n 'cs-format-cells',\n )}\n {showInsertChart &&\n renderIconButton(\n 'insert-chart',\n 'Insert chart',\n 'bar_chart',\n () => onDialogRequest?.('insert-chart'),\n 'cs-insert-chart',\n )}\n {showPivotTable &&\n renderIconButton(\n 'pivot-table',\n 'Insert PivotTable',\n 'pivot_table_chart',\n () => onDialogRequest?.('pivot-table'),\n 'cs-pivot-table',\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Icon — a Material Symbols Outlined glyph for the chrome.\n *\n * Names are Material Symbols ids (https://fonts.google.com/icons), e.g.\n * `format_bold`. Requires the Material Symbols font (loaded via\n * `ensureChromeFonts`); if it isn't present the ligature text shows instead,\n * which is harmless. Icon-only buttons must carry their own `aria-label`.\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface IconProps {\n name: string;\n size?: number;\n style?: CSSProperties;\n}\n\nexport function Icon({ name, size = 20, style }: IconProps) {\n return (\n <span\n className=\"material-symbols-outlined\"\n aria-hidden\n style={{\n fontFamily: \"'Material Symbols Outlined'\",\n fontWeight: 'normal',\n fontStyle: 'normal',\n fontSize: size,\n lineHeight: 1,\n letterSpacing: 'normal',\n textTransform: 'none',\n display: 'inline-block',\n whiteSpace: 'nowrap',\n wordWrap: 'normal',\n direction: 'ltr',\n // Hint the variable-font axes so weight/optical-size are consistent.\n fontVariationSettings: \"'opsz' 20, 'wght' 400, 'FILL' 0, 'GRAD' 0\",\n ...style,\n }}\n >\n {name}\n </span>\n );\n}\n","/**\n * Ensures the chrome's webfonts (Inter for UI, Material Symbols Outlined for\n * icons) are loaded. The design system standardises on these; the rich\n * `chrome=\"full\"` toolbar/menus render Material Symbols ligatures.\n *\n * Idempotent + safe to call repeatedly: it no-ops if the links already exist\n * (e.g. a host that already loads them, like our own app). Injected lazily only\n * when chrome is actually shown, so bare-grid SDK consumers pull nothing.\n *\n * Hosts with a strict CSP (no fonts.googleapis.com) can pre-load the fonts\n * themselves or self-host them; this is best-effort, not required for the editor\n * to function (icons fall back to the ligature text).\n */\n\nconst LINKS: Array<{ id: string; href: string }> = [\n {\n id: 'cs-font-inter',\n href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',\n },\n {\n id: 'cs-font-material-symbols',\n href: 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,300..700,0..1,-50..200&display=block',\n },\n];\n\nlet done = false;\n\nexport function ensureChromeFonts(): void {\n if (done || typeof document === 'undefined') return;\n done = true;\n const head = document.head;\n for (const { id, href } of LINKS) {\n if (document.getElementById(id)) continue;\n // Skip if the host already loaded the same family by any <link>.\n // Match on the `family=<name>` segment, NOT the bare `/css2` path — both\n // Google Fonts URLs share `/css2`, so splitting on `?` made the second\n // family (Material Symbols) collide with the first (Inter) and never get\n // injected, leaving `chrome=\"full\"` icons as raw ligature text.\n const familyKey = href.match(/family=[^:&]+/)?.[0] ?? href.split('?')[0];\n if (document.querySelector(`link[href*=\"${familyKey}\"]`)) continue;\n const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = href;\n head.appendChild(link);\n }\n}\n","/**\n * ColorPicker — text-colour + fill-colour swatch pickers for `<CasualSheets chrome>`.\n *\n * Two icon buttons (text colour, fill colour). Clicking one toggles a swatch\n * popover; picking a swatch dispatches the matching Univer command on the active\n * selection and closes the popover. A \"None\" entry resets the colour.\n *\n * Drives the editor purely through `CasualSheetsAPI.executeCommand`. Commands:\n * text colour : `sheet.command.set-range-text-color` { value: '#rrggbb' | null }\n * fill colour : `sheet.command.set-background-color` { value: '#rrggbb' }\n * fill reset : `sheet.command.reset-background-color` (no params)\n * (`set-background-color` rejects a null value, so reset uses its own command.)\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\ntype Kind = 'text' | 'fill';\n\n// A tasteful 14-swatch palette: neutrals + a spread of hues, teal = brand.\nconst SWATCHES: { hex: string; label: string }[] = [\n { hex: '#000000', label: 'Black' },\n { hex: '#5f6368', label: 'Dark gray' },\n { hex: '#9aa0a6', label: 'Gray' },\n { hex: '#d9dce0', label: 'Light gray' },\n { hex: '#ffffff', label: 'White' },\n { hex: '#d13438', label: 'Red' },\n { hex: '#e8710a', label: 'Orange' },\n { hex: '#f2c811', label: 'Yellow' },\n { hex: '#107c10', label: 'Green' },\n { hex: '#0e7490', label: 'Teal' },\n { hex: '#1a73e8', label: 'Blue' },\n { hex: '#5b2a86', label: 'Purple' },\n { hex: '#c2185b', label: 'Magenta' },\n { hex: '#795548', label: 'Brown' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 8,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst GRID_STYLE: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 22px)',\n gap: 6,\n};\n\nconst SWATCH_STYLE: CSSProperties = {\n width: 22,\n height: 22,\n borderRadius: 4,\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n cursor: 'pointer',\n padding: 0,\n};\n\nconst NONE_STYLE: CSSProperties = {\n marginTop: 8,\n width: '100%',\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n borderRadius: 6,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 12,\n cursor: 'pointer',\n};\n\nexport interface ColorPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function ColorPicker({ api }: ColorPickerProps) {\n const [open, setOpen] = useState<Kind | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape and on any pointerdown outside the picker root.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(null);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(null);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const pick = (kind: Kind, hex: string | null) => {\n if (api) {\n if (kind === 'text') {\n void api.executeCommand('sheet.command.set-range-text-color', { value: hex });\n } else if (hex === null) {\n void api.executeCommand('sheet.command.reset-background-color');\n } else {\n void api.executeCommand('sheet.command.set-background-color', { value: hex });\n }\n }\n setOpen(null);\n };\n\n const toggle = (kind: Kind) => setOpen((cur) => (cur === kind ? null : kind));\n\n const renderButton = (kind: Kind, icon: string, label: string, testid: string) => {\n const on = open === kind;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid={testid}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n toggle(kind);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name={icon} size={20} />\n </button>\n );\n };\n\n const renderPopover = (kind: Kind) => (\n <div style={POPOVER_STYLE} data-testid=\"cs-color-popover\" role=\"menu\">\n <div style={GRID_STYLE}>\n {SWATCHES.map((s) => (\n <button\n key={s.hex}\n type=\"button\"\n role=\"menuitem\"\n title={s.label}\n aria-label={s.label}\n data-color={s.hex}\n style={{ ...SWATCH_STYLE, background: s.hex }}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(kind, s.hex);\n }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-color=\"none\"\n style={NONE_STYLE}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(kind, null);\n }}\n >\n <Icon name=\"format_color_reset\" size={16} />\n None\n </button>\n </div>\n );\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-color-picker\">\n {renderButton('text', 'format_color_text', 'Text color', 'cs-color-text')}\n {renderButton('fill', 'format_color_fill', 'Fill color', 'cs-color-fill')}\n {open && renderPopover(open)}\n </div>\n );\n}\n","/**\n * BordersPicker — border-position dropdown for `<CasualSheets chrome>`.\n *\n * One toolbar button that opens a popover of Excel-style border options (All,\n * Outside, Inside, Top, Bottom, Left, Right, None). Picking one dispatches\n * `sheet.command.set-border-position` with the matching `BorderType` against the\n * active selection, using Univer's current border style/colour (thin black by\n * default). Drives the editor purely through `CasualSheetsAPI.executeCommand`.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\n// BorderType is a string enum in @univerjs/core ('all' | 'outside' | …); use the\n// literal values directly so this component needs no Univer value import.\nconst OPTIONS: { value: string; icon: string; label: string }[] = [\n { value: 'all', icon: 'border_all', label: 'All borders' },\n { value: 'outside', icon: 'border_outer', label: 'Outside borders' },\n { value: 'inside', icon: 'border_inner', label: 'Inside borders' },\n { value: 'top', icon: 'border_top', label: 'Top border' },\n { value: 'bottom', icon: 'border_bottom', label: 'Bottom border' },\n { value: 'left', icon: 'border_left', label: 'Left border' },\n { value: 'right', icon: 'border_right', label: 'Right border' },\n { value: 'none', icon: 'border_clear', label: 'No border' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 4,\n minWidth: 168,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n width: '100%',\n height: 28,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n textAlign: 'left',\n};\n\nexport interface BordersPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function BordersPicker({ api }: BordersPickerProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape and on any pointerdown outside the picker root.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const pick = (value: string) => {\n void api?.executeCommand('sheet.command.set-border-position', { value });\n setOpen(false);\n };\n\n const on = open;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-borders\">\n <button\n type=\"button\"\n title=\"Borders\"\n aria-label=\"Borders\"\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid=\"cs-borders-button\"\n disabled={!api}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen((v) => !v);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name=\"border_all\" size={20} />\n </button>\n {open && (\n <div style={POPOVER_STYLE} data-testid=\"cs-borders-popover\" role=\"menu\">\n {OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n role=\"menuitem\"\n data-border={o.value}\n data-testid={`cs-border-${o.value}`}\n style={ITEM_STYLE}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(o.value);\n }}\n >\n <Icon name={o.icon} size={18} />\n {o.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * AutoSumPicker — Excel-style AutoSum dropdown for `<CasualSheets chrome>`.\n *\n * One toolbar button (Σ) opening Sum / Average / Count / Max / Min. Picking one\n * inserts `=FN(<selection>)` one row below a multi-cell selection (and activates\n * that cell), or `=FN()` into a single active cell so the user can type the\n * range. Pure facade — no command, no Univer UI dependency — so it works in the\n * SDK's embedded mount.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\nconst FUNCS: { fn: string; label: string }[] = [\n { fn: 'SUM', label: 'Sum' },\n { fn: 'AVERAGE', label: 'Average' },\n { fn: 'COUNT', label: 'Count numbers' },\n { fn: 'MAX', label: 'Max' },\n { fn: 'MIN', label: 'Min' },\n];\n\nconst ROW_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst BTN_STYLE: CSSProperties = {\n width: 30,\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n padding: 0,\n};\n\nconst POPOVER_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n padding: 4,\n minWidth: 160,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 28,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRange = any;\n\nexport interface AutoSumPickerProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function AutoSumPicker({ api }: AutoSumPickerProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n const apply = (fn: string) => {\n setOpen(false);\n const sheet = api?.univer.getActiveWorkbook()?.getActiveSheet();\n const range = (sheet as unknown as { getActiveRange?: () => AnyRange })?.getActiveRange?.();\n if (!sheet || !range) return;\n const multi = range.getWidth() * range.getHeight() > 1;\n if (multi) {\n // Drop the formula one row below the selection, same column as its start.\n const target = sheet.getRange(range.getRow() + range.getHeight(), range.getColumn());\n target.setValue({ f: `=${fn}(${range.getA1Notation()})` });\n (target as AnyRange).activate?.();\n } else {\n // Single cell — leave the cursor inside the parens for the user to fill.\n sheet.getRange(range.getRow(), range.getColumn()).setValue({ f: `=${fn}()` });\n }\n };\n\n const on = open;\n const baseBg = on ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent';\n\n return (\n <div ref={rootRef} style={ROW_STYLE} data-testid=\"cs-autosum\">\n <button\n type=\"button\"\n title=\"AutoSum\"\n aria-label=\"AutoSum\"\n aria-haspopup=\"true\"\n aria-expanded={on}\n data-testid=\"cs-autosum-button\"\n disabled={!api}\n style={{\n ...BTN_STYLE,\n background: baseBg,\n color: on ? 'var(--cs-chrome-active-fg, #0e7490)' : BTN_STYLE.color,\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen((v) => !v);\n }}\n onMouseEnter={(e) => {\n if (!on) e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = baseBg;\n }}\n >\n <Icon name=\"functions\" size={20} />\n </button>\n {open && (\n <div style={POPOVER_STYLE} data-testid=\"cs-autosum-popover\" role=\"menu\">\n {FUNCS.map((f) => (\n <button\n key={f.fn}\n type=\"button\"\n role=\"menuitem\"\n data-fn={f.fn}\n data-testid={`cs-autosum-${f.fn}`}\n style={ITEM_STYLE}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n apply(f.fn);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * FormulaBar — minimal built-in formula bar for `<CasualSheets chrome>`.\n *\n * The formula bar: a NameBox (active-cell ref + go-to navigation) and an editable\n * input that shows the active cell's formula (or value) and commits edits through\n * the facade — `=…` as a formula, a number as a number, else text. Typing a\n * function name after `=` shows an autocomplete dropdown (arrows + Enter/Tab to\n * complete, Escape to dismiss). Self-contained: drives the editor only via\n * `CasualSheetsAPI`.\n */\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { NameBox } from './NameBox';\n\n// Curated common spreadsheet functions for the autocomplete dropdown. (Univer\n// ships ~530; this covers what people actually type without bundling them all.)\nconst FUNCTIONS = [\n 'ABS',\n 'AND',\n 'AVERAGE',\n 'AVERAGEIF',\n 'AVERAGEIFS',\n 'CEILING',\n 'CHOOSE',\n 'COLUMN',\n 'COLUMNS',\n 'CONCAT',\n 'CONCATENATE',\n 'COUNT',\n 'COUNTA',\n 'COUNTBLANK',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DATEDIF',\n 'DAY',\n 'EDATE',\n 'EOMONTH',\n 'EXACT',\n 'FILTER',\n 'FIND',\n 'FLOOR',\n 'HLOOKUP',\n 'HOUR',\n 'IF',\n 'IFERROR',\n 'IFNA',\n 'IFS',\n 'INDEX',\n 'INDIRECT',\n 'INT',\n 'ISBLANK',\n 'ISERROR',\n 'ISNA',\n 'ISNUMBER',\n 'ISTEXT',\n 'LEFT',\n 'LEN',\n 'LOOKUP',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MAXIFS',\n 'MEDIAN',\n 'MID',\n 'MIN',\n 'MINIFS',\n 'MINUTE',\n 'MOD',\n 'MONTH',\n 'NETWORKDAYS',\n 'NOT',\n 'NOW',\n 'OFFSET',\n 'OR',\n 'POWER',\n 'PRODUCT',\n 'PROPER',\n 'RAND',\n 'RANDBETWEEN',\n 'RANK',\n 'REPLACE',\n 'REPT',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'ROW',\n 'ROWS',\n 'SEARCH',\n 'SECOND',\n 'SORT',\n 'SQRT',\n 'SUBSTITUTE',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'SUMPRODUCT',\n 'SWITCH',\n 'TEXT',\n 'TEXTJOIN',\n 'TODAY',\n 'TRANSPOSE',\n 'TRIM',\n 'UNIQUE',\n 'UPPER',\n 'VALUE',\n 'VLOOKUP',\n 'WEEKDAY',\n 'WORKDAY',\n 'XLOOKUP',\n 'XMATCH',\n 'YEAR',\n];\n\nconst TOKEN_RE = /([A-Za-z][A-Za-z0-9._]*)$/;\n\n/** Function suggestions for the trailing identifier of a formula draft. */\nfunction suggestFor(draft: string | null): string[] {\n if (!draft || !draft.startsWith('=')) return [];\n const m = TOKEN_RE.exec(draft);\n if (!m) return [];\n const prefix = m[1].toUpperCase();\n return FUNCTIONS.filter((f) => f.startsWith(prefix) && f !== prefix).slice(0, 8);\n}\n\n/** A1 column letters from a 0-based column index (0→A, 26→AA). */\nfunction colToLetters(col: number): string {\n let s = '';\n let n = col;\n do {\n s = String.fromCharCode(65 + (n % 26)) + s;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return s;\n}\n\ninterface ActiveCell {\n a1: string;\n /** Formula text (`=…`) if the cell has one, else the raw value as a string. */\n text: string;\n}\n\nfunction readActiveCell(api: CasualSheetsAPI): ActiveCell | null {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return null;\n const { startRow, startColumn } = sel.range;\n const range = sheet.getRange(startRow, startColumn);\n const formula = range.getFormula?.() || '';\n const raw = range.getValue?.();\n return {\n a1: colToLetters(startColumn) + (startRow + 1),\n text: formula || (raw == null ? '' : String(raw)),\n };\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 6px',\n borderBottom: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n flex: '0 0 auto',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst FX_STYLE: CSSProperties = {\n flex: '0 0 auto',\n fontStyle: 'italic',\n color: 'var(--cs-chrome-muted, #6b7280)',\n};\n\nconst INPUT_STYLE: CSSProperties = {\n width: '100%',\n height: 24,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.18))',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #1f2329)',\n font: 'inherit',\n fontSize: 13,\n boxSizing: 'border-box',\n};\n\nconst INPUT_WRAP_STYLE: CSSProperties = { position: 'relative', flex: '1 1 auto', minWidth: 0 };\n\nconst AC_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 2,\n minWidth: 200,\n maxHeight: 240,\n overflowY: 'auto',\n zIndex: 1000,\n padding: 4,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n};\n\nconst AC_ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 26,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\nexport interface FormulaBarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function FormulaBar({ api }: FormulaBarProps) {\n const [cell, setCell] = useState<ActiveCell | null>(null);\n // null = mirror the active cell; a string = the user is editing.\n const [draft, setDraft] = useState<string | null>(null);\n const draftRef = useRef<string | null>(null);\n draftRef.current = draft;\n // Autocomplete: active suggestion index + a dismissed flag (Escape closes the\n // dropdown without cancelling the edit).\n const [acIdx, setAcIdx] = useState(0);\n const [acDismissed, setAcDismissed] = useState(false);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n // Don't clobber an in-progress edit on unrelated command activity.\n if (draftRef.current !== null) return;\n setCell(readActiveCell(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n const suggestions = useMemo(() => suggestFor(draft), [draft]);\n const acOpen = !acDismissed && suggestions.length > 0;\n\n const commit = (text: string) => {\n setDraft(null);\n setAcDismissed(false);\n if (!api) return;\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return;\n const range = sheet.getRange(sel.range.startRow, sel.range.startColumn);\n const t = text.trim();\n if (t.startsWith('=')) range.setValue({ f: t });\n else if (t !== '' && !Number.isNaN(Number(t))) range.setValue(Number(t));\n else range.setValue(t);\n };\n\n const onType = (v: string) => {\n setDraft(v);\n setAcIdx(0);\n setAcDismissed(false);\n };\n\n // Replace the trailing identifier with the chosen function + '('.\n const complete = (fn: string) => {\n const base = draft ?? '';\n setDraft(base.replace(TOKEN_RE, `${fn}(`));\n setAcIdx(0);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (acOpen) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setAcIdx((i) => Math.min(i + 1, suggestions.length - 1));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setAcIdx((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n complete(suggestions[acIdx] ?? suggestions[0]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n setAcDismissed(true);\n return;\n }\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n commit((e.target as HTMLInputElement).value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(null);\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const shown = draft ?? cell?.text ?? '';\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-formula-bar\">\n <NameBox api={api} />\n <span style={FX_STYLE} aria-hidden>\n fx\n </span>\n <div style={INPUT_WRAP_STYLE}>\n <input\n type=\"text\"\n aria-label=\"Formula bar\"\n data-testid=\"casual-sheets-formula-input\"\n style={INPUT_STYLE}\n value={shown}\n onChange={(e) => onType(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={(e) => {\n if (draftRef.current !== null) commit(e.target.value);\n }}\n disabled={!api}\n />\n {acOpen && (\n <div style={AC_STYLE} data-testid=\"cs-formula-suggestions\" role=\"listbox\">\n {suggestions.map((fn, i) => (\n <button\n key={fn}\n type=\"button\"\n role=\"option\"\n aria-selected={i === acIdx}\n data-testid={`cs-formula-suggestion-${fn}`}\n style={{\n ...AC_ITEM_STYLE,\n background: i === acIdx ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: i === acIdx ? 'var(--cs-chrome-active-fg, #0e7490)' : AC_ITEM_STYLE.color,\n }}\n // mousedown+preventDefault so the input keeps focus (no blur-commit).\n onMouseDown={(e) => {\n e.preventDefault();\n complete(fn);\n }}\n onMouseEnter={() => setAcIdx(i)}\n >\n {fn}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * NameBox — the Excel \"Name Box\" for `<CasualSheets chrome>`.\n *\n * A small editable box that mirrors the active cell's A1 reference live, and\n * lets you navigate by typing a reference (e.g. `B5` or `A1:C3`) + Enter. Self-\n * contained: reads the active selection through `CasualSheetsAPI` and navigates\n * through the FUniver facade (`getRange(a1).activate()`) — no app context, no\n * named-range support (defined names land with the rich name-box later).\n *\n * The orchestrator uses this to replace the static name-box span currently\n * inside FormulaBar.tsx; this component does NOT edit FormulaBar.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties, type KeyboardEvent } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\n/** A defined name as surfaced by the FWorkbook facade. */\ninterface DefinedNameEntry {\n name: string;\n ref: string;\n}\n\n/**\n * Read the active workbook's defined names through the FWorkbook facade\n * (`getDefinedNames()` → `FDefinedName[]`, each with `getName()` +\n * `getFormulaOrRefString()`). Returns [] when the facade/API is unavailable —\n * never invents an API.\n */\nfunction readDefinedNames(api: CasualSheetsAPI | null): DefinedNameEntry[] {\n if (!api) return [];\n try {\n const wb = api.univer.getActiveWorkbook() as unknown as {\n getDefinedNames?: () => Array<{\n getName?: () => string;\n getFormulaOrRefString?: () => string;\n }>;\n } | null;\n const names = wb?.getDefinedNames?.();\n if (!names) return [];\n return names\n .map((dn) => ({\n name: dn.getName?.() ?? '',\n ref: dn.getFormulaOrRefString?.() ?? '',\n }))\n .filter((e) => e.name !== '');\n } catch {\n return [];\n }\n}\n\n/** A1 column letters from a 0-based column index (0→A, 26→AA). */\nfunction colToLetters(col: number): string {\n let s = '';\n let n = col;\n do {\n s = String.fromCharCode(65 + (n % 26)) + s;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return s;\n}\n\n/** The active selection's top-left A1 reference, or '' when unavailable. */\nfunction readActiveRef(api: CasualSheetsAPI): string {\n const sel = api.getSelection();\n if (!sel) return '';\n const { startRow, startColumn } = sel.range;\n return colToLetters(startColumn) + (startRow + 1);\n}\n\nconst BOX_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 80,\n height: 24,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'center',\n boxSizing: 'border-box',\n};\n\nconst ROOT_STYLE: CSSProperties = {\n flex: '0 0 auto',\n display: 'inline-flex',\n alignItems: 'center',\n position: 'relative',\n};\n\nconst DROPDOWN_BTN_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 20,\n height: 24,\n marginLeft: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n padding: 0,\n};\n\nconst MENU_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n minWidth: 160,\n maxHeight: 280,\n overflowY: 'auto',\n padding: 4,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.18)',\n};\n\nconst MENU_ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 12,\n width: '100%',\n height: 28,\n padding: '0 8px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'left',\n cursor: 'pointer',\n boxSizing: 'border-box',\n};\n\nconst MENU_EMPTY_STYLE: CSSProperties = {\n padding: '6px 8px',\n color: 'var(--cs-chrome-muted, #8a8886)',\n fontSize: 12,\n whiteSpace: 'nowrap',\n};\n\nconst ITEM_REF_STYLE: CSSProperties = {\n color: 'var(--cs-chrome-muted, #8a8886)',\n fontSize: 11,\n flex: '0 0 auto',\n};\n\nexport interface NameBoxProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function NameBox({ api }: NameBoxProps) {\n // The A1 reference of the active cell.\n const [ref, setRef] = useState('');\n // null = mirror the active cell; a string = the user is typing.\n const [draft, setDraft] = useState<string | null>(null);\n const draftRef = useRef<string | null>(null);\n draftRef.current = draft;\n const inputRef = useRef<HTMLInputElement>(null);\n // The defined-names dropdown: open state, current entries, and a root ref for\n // outside-pointerdown detection (mirrors ColorPicker's popover pattern).\n const [open, setOpen] = useState(false);\n const [names, setNames] = useState<DefinedNameEntry[]>([]);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Reflect the active cell: subscribe to command activity (covers selection\n // moves) and re-read the reference — unless the user is mid-edit.\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n if (draftRef.current !== null) return;\n setRef(readActiveRef(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n // While the dropdown is open, close it on Escape or any outside pointerdown.\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n /** Navigate to the typed A1 reference / range. Invalid input is ignored. */\n const navigate = (text: string) => {\n const t = text.trim();\n setDraft(null);\n if (!api || t === '') {\n setRef(readActiveRef(api ?? ({} as CasualSheetsAPI)));\n return;\n }\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n try {\n // FRange.getRange parses an A1 string (\"B5\") or range (\"A1:C3\").\n const range = (sheet as unknown as { getRange(a1: string): { activate(): void } }).getRange(\n t,\n );\n range.activate();\n } catch {\n // Invalid reference — fall back to the current selection.\n setRef(readActiveRef(api));\n }\n };\n\n // Open the dropdown: refresh the defined-name list from the live workbook,\n // then toggle. mousedown (not click) so the grid selection isn't lost first.\n const toggleDropdown = () => {\n setOpen((cur) => {\n const next = !cur;\n if (next) setNames(readDefinedNames(api));\n return next;\n });\n };\n\n // Navigate to a defined name's range. The ref may carry a sheet prefix\n // (\"Sheet1!$A$1\") and absolute `$` markers — strip both, then reuse the same\n // getRange(...).activate() path the typed-reference navigation uses.\n const navigateName = (entry: DefinedNameEntry) => {\n setOpen(false);\n const raw = entry.ref.trim();\n if (raw === '') return;\n const afterSheet = raw.includes('!') ? raw.slice(raw.lastIndexOf('!') + 1) : raw;\n const a1 = afterSheet.replace(/\\$/g, '');\n navigate(a1);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n navigate((e.target as HTMLInputElement).value);\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(null);\n setRef(api ? readActiveRef(api) : '');\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const shown = draft ?? ref;\n\n return (\n <div ref={rootRef} style={ROOT_STYLE}>\n <input\n ref={inputRef}\n type=\"text\"\n aria-label=\"Name box\"\n title=\"Name box\"\n data-testid=\"cs-namebox-input\"\n style={BOX_STYLE}\n value={shown}\n disabled={!api}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onFocus={(e) => e.currentTarget.select()}\n onBlur={() => {\n // Abandon any uncommitted edit without navigating.\n if (draftRef.current !== null) {\n setDraft(null);\n setRef(api ? readActiveRef(api) : '');\n }\n }}\n />\n <button\n type=\"button\"\n title=\"Defined names\"\n aria-label=\"Defined names\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"cs-namebox-dropdown\"\n style={{\n ...DROPDOWN_BTN_STYLE,\n background: open ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: open ? 'var(--cs-chrome-active-fg, #0e7490)' : DROPDOWN_BTN_STYLE.color,\n }}\n disabled={!api}\n // mousedown (not click) so the grid's selection isn't lost first.\n onMouseDown={(e) => {\n e.preventDefault();\n toggleDropdown();\n }}\n >\n <Icon name=\"expand_more\" size={18} />\n </button>\n {open && (\n <div style={MENU_STYLE} role=\"menu\" data-testid=\"cs-namebox-menu\">\n {names.length === 0 ? (\n <div style={MENU_EMPTY_STYLE}>No names</div>\n ) : (\n names.map((entry, i) => (\n <button\n key={entry.name}\n type=\"button\"\n role=\"menuitem\"\n title={entry.ref || entry.name}\n data-testid={`cs-namebox-name-${i}`}\n style={MENU_ITEM_STYLE}\n onMouseDown={(e) => {\n e.preventDefault();\n navigateName(entry);\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <span>{entry.name}</span>\n {entry.ref && <span style={ITEM_REF_STYLE}>{entry.ref}</span>}\n </button>\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * StatusBar — built-in status bar for `<CasualSheets chrome>`.\n *\n * Self-contained: reads the active selection through `CasualSheetsAPI` and shows\n * Excel-style aggregates over it (Average / Count / Numerical Count / Min / Max\n * / Sum), plus a zoom control on the right (− / level / +, click the level to\n * reset to 100%). Drives the editor only through the facade + commands.\n *\n * Count = non-empty cells (any type); Numerical Count = numeric cells; the\n * numeric aggregates (Average/Min/Max/Sum) run over the numeric cells only —\n * matching Excel's status-bar semantics.\n *\n * Zoom dispatches the OPERATION `sheet.operation.set-zoom-ratio` (not the\n * `set-zoom-ratio` / `change-zoom-ratio` commands, which bail when Univer's\n * always-present formula-bar editor unit reports visible). The operation's\n * render controller registers in sheets-ui's `onRendered` lifecycle — i.e. a\n * frame or two after `onReady` — so the buttons just no-op until the grid has\n * painted; in practice the user can't click that fast.\n */\n\nimport { useEffect, useState, type CSSProperties } from 'react';\nimport { ICommandService } from '@univerjs/core';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\ninterface Stats {\n /** Non-empty cells (any type). */\n count: number;\n /** Numeric cells. */\n numCount: number;\n sum: number;\n avg: number;\n min: number;\n max: number;\n}\n\nfunction readStats(api: CasualSheetsAPI): Stats | null {\n const sel = api.getSelection();\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sel || !sheet) return null;\n const { startRow, startColumn, endRow, endColumn } = sel.range;\n // Single cell → nothing to aggregate (matches Excel).\n if (startRow === endRow && startColumn === endColumn) return null;\n const values = sheet.getRange(sel.range).getValues?.() as unknown[][] | undefined;\n if (!values) return null;\n let count = 0;\n let numCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const row of values) {\n for (const v of row) {\n if (v == null || v === '') continue;\n count += 1;\n if (typeof v === 'number' && Number.isFinite(v)) {\n numCount += 1;\n sum += v;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n }\n if (count === 0) return null;\n return { count, numCount, sum, avg: numCount ? sum / numCount : 0, min, max };\n}\n\n/** Current zoom as a fraction (1 = 100%). Reads the live worksheet config via\n * the facade's `getSheet()` escape hatch; falls back to 1. */\nfunction readZoom(api: CasualSheetsAPI): number {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ws = (sheet as any)?.getSheet?.();\n const z = ws?.getConfig?.().zoomRatio;\n return typeof z === 'number' && z > 0 ? z : 1;\n}\n\n// Trim float noise without locking to a fixed precision.\nfunction fmt(n: number): string {\n return Number(n.toFixed(10)).toLocaleString();\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 16,\n height: 24,\n padding: '0 12px',\n borderTop: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n color: 'var(--cs-chrome-muted, #4b5563)',\n flex: '0 0 auto',\n font: 'inherit',\n fontSize: 12,\n userSelect: 'none',\n};\n\nconst ZOOM_GROUP_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n};\n\nconst ZOOM_BTN_STYLE: CSSProperties = {\n width: 20,\n height: 18,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n padding: 0,\n};\n\nconst ZOOM_LEVEL_STYLE: CSSProperties = {\n minWidth: 40,\n height: 18,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-muted, #4b5563)',\n cursor: 'pointer',\n font: 'inherit',\n fontSize: 12,\n textAlign: 'center',\n};\n\nexport interface StatusBarProps {\n api: CasualSheetsAPI | null;\n}\n\nexport function StatusBar({ api }: StatusBarProps) {\n const [stats, setStats] = useState<Stats | null>(null);\n const [zoom, setZoom] = useState(1);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => {\n setStats(readStats(api));\n setZoom(readZoom(api));\n };\n refresh();\n const injector = (api.univer as unknown as { _injector?: { get(t: unknown): unknown } })\n ._injector;\n const cmd = injector?.get(ICommandService) as\n | { onCommandExecuted: (cb: () => void) => { dispose: () => void } }\n | undefined;\n const sub = cmd?.onCommandExecuted(() => refresh());\n return () => sub?.dispose();\n }, [api]);\n\n // Drive the zoom OPERATION directly — see file header for why not the commands.\n const setZoomRatio = (ratio: number) => {\n const wb = api?.univer.getActiveWorkbook();\n const sheet = wb?.getActiveSheet();\n if (!wb || !sheet) return;\n const clamped = Math.min(4, Math.max(0.1, ratio));\n void api?.executeCommand('sheet.operation.set-zoom-ratio', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n zoomRatio: clamped,\n });\n // Optimistic local update — the onCommandExecuted refresh will reconcile.\n setZoom(clamped);\n };\n const zoomBy = (delta: number) => setZoomRatio(Math.round((zoom + delta) * 100) / 100);\n const resetZoom = () => setZoomRatio(1);\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-status-bar\">\n {stats && (\n <>\n {stats.numCount > 0 && <span data-stat=\"average\">Average: {fmt(stats.avg)}</span>}\n <span data-stat=\"count\">Count: {stats.count}</span>\n {stats.numCount > 0 && (\n <>\n <span data-stat=\"num-count\">Numerical Count: {stats.numCount}</span>\n <span data-stat=\"min\">Min: {fmt(stats.min)}</span>\n <span data-stat=\"max\">Max: {fmt(stats.max)}</span>\n <span data-stat=\"sum\">Sum: {fmt(stats.sum)}</span>\n </>\n )}\n </>\n )}\n <span style={ZOOM_GROUP_STYLE} data-testid=\"cs-zoom\">\n <button\n type=\"button\"\n style={ZOOM_BTN_STYLE}\n aria-label=\"Zoom out\"\n title=\"Zoom out\"\n data-testid=\"cs-zoom-out\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n zoomBy(-0.1);\n }}\n >\n −\n </button>\n <button\n type=\"button\"\n style={ZOOM_LEVEL_STYLE}\n aria-label=\"Reset zoom to 100%\"\n title=\"Reset zoom to 100%\"\n data-testid=\"cs-zoom-level\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n resetZoom();\n }}\n >\n {Math.round(zoom * 100)}%\n </button>\n <button\n type=\"button\"\n style={ZOOM_BTN_STYLE}\n aria-label=\"Zoom in\"\n title=\"Zoom in\"\n data-testid=\"cs-zoom-in\"\n disabled={!api}\n onMouseDown={(e) => {\n e.preventDefault();\n zoomBy(0.1);\n }}\n >\n +\n </button>\n </span>\n </div>\n );\n}\n","/**\n * MenuBar — the built-in dropdown menu row for `<CasualSheets chrome>`.\n *\n * Office / Google-Sheets-style horizontal menu strip (no logo, no title — the\n * host frames the editor with its own bar): File · Edit · View · Insert ·\n * Format · Data · Help. Each top-level button opens a dropdown of items that\n * either dispatch a verified Univer command / facade call through the\n * `CasualSheetsAPI` (no app context), or — for actions that need a dialog the\n * SDK doesn't ship — route through the optional `onDialogRequest` host hook.\n *\n * This mirrors `apps/web/src/shell/MenuBar.tsx`, but reimplements every action\n * INLINE against `api` / `api.univer` (the FUniver facade) + `api.executeCommand`.\n * The command ids + facade logic are copied verbatim from\n * `apps/web/src/shell/home-tab-actions.ts` + `tab-actions.ts` so behaviour\n * matches the real app exactly.\n *\n * Feature flags: pass `features` to hide a control or whole menu group when its\n * feature is disabled. Defaults to all-enabled. A control whose feature is\n * `false` does not render. An entire top-level menu that ends up with no\n * runnable items is dropped.\n *\n * Dialog routing: items marked `dialog: '<kind>'` (Format Cells, Insert Chart,\n * PivotTable, Find & Replace, Insert/Delete cells, Sparkline, Name Manager,\n * Goal Seek, Data Validation, Conditional Formatting, …) call\n * `onDialogRequest(kind, context)` so the host renders its own UI. When\n * `onDialogRequest` is not provided, those items are omitted (the SDK never\n * fakes a dialog).\n *\n * Self-contained: only one menu is open at a time; Escape and an outside\n * pointerdown close it.\n */\n\nimport { useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { BorderStyleTypes, BorderType } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { ensurePluginByName } from '../univer';\nimport { Icon } from './Icon';\nimport { ensureChromeFonts } from './fonts';\n\ntype MenuId = 'file' | 'edit' | 'view' | 'insert' | 'format' | 'data' | 'help';\n\n/**\n * Dialog kinds the host can choose to render via `onDialogRequest`. These are\n * the actions the SDK chrome can't fulfil on its own (no built-in modal). The\n * string is passed straight to the host hook; the `context` (when present)\n * carries the pre-resolved A1 selection so the host doesn't have to re-read it.\n */\nexport type MenuDialogKind =\n | 'format-cells'\n | 'find-replace'\n | 'insert-cells'\n | 'delete-cells'\n | 'paste-special'\n | 'insert-chart'\n | 'insert-pivot'\n | 'insert-sparkline'\n | 'insert-function'\n | 'name-manager'\n | 'goal-seek'\n | 'data-validation'\n | 'conditional-formatting'\n | 'custom-sort'\n | 'properties'\n | 'about'\n | 'keyboard-shortcuts';\n\ntype RunFn = (api: CasualSheetsAPI) => void;\n\ntype MenuItemDef =\n | {\n kind: 'item';\n id: string;\n label: string;\n icon?: string;\n shortcut?: string;\n /** Dispatch a command / facade call directly. */\n run?: RunFn;\n /** Route through the host's `onDialogRequest`. Omitted if no host hook. */\n dialog?: MenuDialogKind;\n /** Feature gate — item hidden when `features[feature] === false`. */\n feature?: string;\n }\n | { kind: 'separator'; id: string; feature?: string }\n | {\n kind: 'submenu';\n id: string;\n label: string;\n icon?: string;\n items: MenuItemDef[];\n feature?: string;\n };\n\ninterface MenuDef {\n id: MenuId;\n label: string;\n /** Feature gate for the whole menu. */\n feature?: string;\n items: MenuItemDef[];\n}\n\n/**\n * Pretty-print a `Ctrl+Shift+X` shortcut for the current platform. The SDK\n * doesn't import the app's `formatShortcut`, so this is a compact inline\n * equivalent: on macOS, swap Ctrl→⌘, Alt→⌥, Shift→⇧ and drop the `+`.\n */\nfunction fmtShortcut(shortcut: string): string {\n const isMac =\n typeof navigator !== 'undefined' && /Mac|iPhone|iPad/i.test(navigator.platform || '');\n if (!isMac) return shortcut;\n return shortcut\n .split('+')\n .map((part) => {\n switch (part) {\n case 'Ctrl':\n return '⌘';\n case 'Alt':\n return '⌥';\n case 'Shift':\n return '⇧';\n default:\n return part;\n }\n })\n .join('');\n}\n\n/* ───────────────────────── inline action helpers ─────────────────────────\n * Every helper below is a faithful port of the corresponding function in\n * apps/web/src/shell/home-tab-actions.ts + tab-actions.ts, reimplemented over\n * the SDK's `api` (CasualSheetsAPI) / `api.univer` (FUniver) so the chrome\n * never imports app context. Command ids are identical to the app's.\n */\n\nfunction fu(api: CasualSheetsAPI): FUniver {\n return api.univer;\n}\n\nfunction activeRange(api: CasualSheetsAPI) {\n return fu(api).getActiveWorkbook()?.getActiveSheet()?.getActiveRange() ?? null;\n}\n\nfunction activeSheet(api: CasualSheetsAPI) {\n return fu(api).getActiveWorkbook()?.getActiveSheet() ?? null;\n}\n\n/** Selection as A1 (e.g. `B2:D10`), or null. Used to seed dialog context. */\nfunction selectionA1(api: CasualSheetsAPI): string | null {\n const range = activeRange(api);\n if (!range) return null;\n try {\n return range.getA1Notation();\n } catch {\n return null;\n }\n}\n\n/* ── Edit ─────────────────────────────────────────────────────────────── */\n\nconst undo: RunFn = (api) => void api.executeCommand('univer.command.undo');\nconst redo: RunFn = (api) => void api.executeCommand('univer.command.redo');\nconst cut: RunFn = (api) => void api.executeCommand('univer.command.cut');\nconst copy: RunFn = (api) => void api.executeCommand('univer.command.copy');\nconst paste: RunFn = (api) => void api.executeCommand('univer.command.paste');\nconst pasteFormattingOnly: RunFn = (api) => void api.executeCommand('sheet.command.paste-format');\n\n/* ── Insert (facade-driven; mirror tab-actions.ts) ─────────────────────── */\n\nconst insertRowAbove: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.insertRowBefore(range.getRow());\n};\n\nconst insertRowBelow: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.insertRowAfter(range.getRow() + range.getHeight() - 1);\n};\n\nconst insertColumnLeft: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.insertColumnBefore(range.getColumn());\n};\n\nconst insertColumnRight: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.insertColumnAfter(range.getColumn() + range.getWidth() - 1);\n};\n\nconst deleteSelectedRow: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.deleteRows(range.getRow(), range.getHeight());\n};\n\nconst deleteSelectedColumn: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n sheet.deleteColumns(range.getColumn(), range.getWidth());\n};\n\nconst insertNewSheet: RunFn = (api) => {\n fu(api).getActiveWorkbook()?.insertSheet();\n};\n\nconst insertImage: RunFn = (api) => void api.executeCommand('sheet.command.insert-float-image');\n\nconst insertHyperlink: RunFn = (api) =>\n void api.executeCommand('sheet.operation.insert-hyper-link');\n\nconst insertComment: RunFn = (api) => void api.executeCommand('sheet.operation.show-comment-modal');\n\nconst insertTodayDate: RunFn = (api) => {\n const range = activeRange(api);\n if (!range) return;\n const today = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n const v = `${today.getFullYear()}-${pad(today.getMonth() + 1)}-${pad(today.getDate())}`;\n range.setValue({ v });\n};\n\nconst insertCurrentTime: RunFn = (api) => {\n const range = activeRange(api);\n if (!range) return;\n const now = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n const v = `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n range.setValue({ v });\n};\n\nconst insertTable: RunFn = (api) => {\n void (async () => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n const wb = fu(api).getActiveWorkbook();\n if (!range || !sheet || !wb) return;\n await ensurePluginByName('table');\n await api.executeCommand('sheet.command.add-table', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n range: {\n startRow: range.getRow(),\n startColumn: range.getColumn(),\n endRow: range.getRow() + range.getHeight() - 1,\n endColumn: range.getColumn() + range.getWidth() - 1,\n },\n });\n })();\n};\n\nconst autoFitColumns: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n const withAutoWidth = sheet as unknown as {\n setColumnAutoWidth?: (col: number, n: number) => unknown;\n };\n withAutoWidth.setColumnAutoWidth?.(range.getColumn(), range.getWidth());\n};\n\nconst AUTO_FIT_ROW_CAP = 500;\nconst autoFitRows: RunFn = (api) => {\n const range = activeRange(api);\n const sheet = activeSheet(api);\n if (!range || !sheet) return;\n const start = range.getRow();\n const count = Math.min(range.getHeight(), AUTO_FIT_ROW_CAP);\n for (let r = 0; r < count; r++) sheet.autoFitRow(start + r);\n};\n\n/* ── Format ───────────────────────────────────────────────────────────── */\n\n// Patterns copied from home-tab-actions.ts NUMBER_FORMAT_PATTERNS.\nconst NUMBER_FORMAT_PATTERNS = {\n general: '',\n number: '#,##0.00',\n integer: '#,##0',\n currency: '\"$\"#,##0.00',\n accounting: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)',\n percent: '0.00%',\n date: 'yyyy-mm-dd',\n time: 'hh:mm:ss',\n scientific: '0.00E+00',\n text: '@',\n} as const;\ntype NumberFormatKey = keyof typeof NUMBER_FORMAT_PATTERNS;\n\nconst NUM_FORMAT_ORDER: NumberFormatKey[] = [\n 'general',\n 'number',\n 'integer',\n 'currency',\n 'accounting',\n 'percent',\n 'date',\n 'time',\n 'scientific',\n 'text',\n];\n\nconst NUM_FORMAT_SHORTCUT: Partial<Record<NumberFormatKey, string>> = {\n number: 'Ctrl+Shift+1',\n time: 'Ctrl+Shift+2',\n date: 'Ctrl+Shift+3',\n currency: 'Ctrl+Shift+4',\n percent: 'Ctrl+Shift+5',\n scientific: 'Ctrl+Shift+6',\n};\n\nfunction setNumberFormatByKey(api: CasualSheetsAPI, key: NumberFormatKey) {\n // setNumberFormat lives on the sheets-numfmt facade extension (runtime cast).\n const range = activeRange(api) as unknown as { setNumberFormat?: (p: string) => unknown } | null;\n range?.setNumberFormat?.(NUMBER_FORMAT_PATTERNS[key]);\n}\n\nconst increaseDecimal: RunFn = (api) =>\n void api.executeCommand('sheet.command.numfmt.add.decimal.command');\nconst decreaseDecimal: RunFn = (api) =>\n void api.executeCommand('sheet.command.numfmt.subtract.decimal.command');\nconst clearFormat: RunFn = (api) => void api.executeCommand('sheet.command.clear-selection-format');\n\nfunction applyBorders(api: CasualSheetsAPI, choice: 'all' | 'outside' | 'none') {\n const range = activeRange(api);\n if (!range) return;\n const type =\n choice === 'all' ? BorderType.ALL : choice === 'outside' ? BorderType.OUTSIDE : BorderType.NONE;\n const style = choice === 'none' ? BorderStyleTypes.NONE : BorderStyleTypes.THIN;\n range.setBorder(type, style, '#000000');\n}\n\n/* ── Format → Visibility (command-driven; mirror tab-actions.ts) ───────── */\n\nfunction rowSpan(api: CasualSheetsAPI) {\n const wb = fu(api).getActiveWorkbook();\n const sheet = activeSheet(api);\n const range = activeRange(api);\n if (!wb || !sheet || !range) return null;\n const startRow = range.getRow();\n const endRow = startRow + range.getHeight() - 1;\n const maxCol = (sheet as unknown as { getMaxColumns?: () => number }).getMaxColumns?.() ?? 1;\n return { wb, sheet, startRow, endRow, maxCol };\n}\n\nfunction colSpan(api: CasualSheetsAPI) {\n const wb = fu(api).getActiveWorkbook();\n const sheet = activeSheet(api);\n const range = activeRange(api);\n if (!wb || !sheet || !range) return null;\n const startColumn = range.getColumn();\n const endColumn = startColumn + range.getWidth() - 1;\n const maxRow = (sheet as unknown as { getMaxRows?: () => number }).getMaxRows?.() ?? 1;\n return { wb, sheet, startColumn, endColumn, maxRow };\n}\n\nconst hideSelectedRows: RunFn = (api) => {\n const s = rowSpan(api);\n if (!s) return;\n void api.executeCommand('sheet.command.set-rows-hidden', {\n unitId: s.wb.getId(),\n subUnitId: s.sheet.getSheetId(),\n ranges: [\n {\n startRow: s.startRow,\n endRow: s.endRow,\n startColumn: 0,\n endColumn: Math.max(0, s.maxCol - 1),\n rangeType: 1,\n },\n ],\n });\n};\n\nconst unhideSelectedRows: RunFn = (api) => {\n const s = rowSpan(api);\n if (!s) return;\n void api.executeCommand('sheet.command.set-specific-rows-visible', {\n unitId: s.wb.getId(),\n subUnitId: s.sheet.getSheetId(),\n ranges: [\n {\n startRow: s.startRow,\n endRow: s.endRow,\n startColumn: 0,\n endColumn: Math.max(0, s.maxCol - 1),\n rangeType: 1,\n },\n ],\n });\n};\n\nconst hideSelectedColumns: RunFn = (api) => {\n const s = colSpan(api);\n if (!s) return;\n void api.executeCommand('sheet.command.set-col-hidden', {\n unitId: s.wb.getId(),\n subUnitId: s.sheet.getSheetId(),\n ranges: [\n {\n startRow: 0,\n endRow: Math.max(0, s.maxRow - 1),\n startColumn: s.startColumn,\n endColumn: s.endColumn,\n rangeType: 2,\n },\n ],\n });\n};\n\nconst unhideSelectedColumns: RunFn = (api) => {\n const s = colSpan(api);\n if (!s) return;\n // Univer's \"show specific cols\" id is asymmetric with the row variant.\n void api.executeCommand('sheet.command.set-col-visible-on-cols', {\n unitId: s.wb.getId(),\n subUnitId: s.sheet.getSheetId(),\n ranges: [\n {\n startRow: 0,\n endRow: Math.max(0, s.maxRow - 1),\n startColumn: s.startColumn,\n endColumn: s.endColumn,\n rangeType: 2,\n },\n ],\n });\n};\n\n/* ── View ─────────────────────────────────────────────────────────────── */\n\ntype FreezeCapableSheet = {\n setFrozenRows: (n: number) => unknown;\n setFrozenColumns: (n: number) => unknown;\n};\n\nconst freezeFirstRow: RunFn = (api) => {\n (activeSheet(api) as unknown as FreezeCapableSheet | null)?.setFrozenRows(1);\n};\nconst freezeFirstColumn: RunFn = (api) => {\n (activeSheet(api) as unknown as FreezeCapableSheet | null)?.setFrozenColumns(1);\n};\nconst freezeAtSelection: RunFn = (api) =>\n void api.executeCommand('sheet.command.set-selection-frozen');\nconst unfreezePanes: RunFn = (api) => void api.executeCommand('sheet.command.cancel-frozen');\n\nconst toggleGridlines: RunFn = (api) => {\n const wb = fu(api).getActiveWorkbook();\n const sheet = activeSheet(api);\n if (!wb || !sheet) return;\n // BooleanNumber: 0 = hide, 1 = show. The app reads current state; without a\n // reactive UI store here we hide (matches the app's default click path).\n void api.executeCommand('sheet.command.toggle-gridlines', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n showGridlines: 0,\n });\n};\n\nconst toggleCommentPanel: RunFn = (api) =>\n void api.executeCommand('sheet.operation.toggle-comment-panel');\n\nconst jumpToFirstCell: RunFn = (api) => {\n activeSheet(api)?.getRange(0, 0).activate();\n};\n\nconst switchToPreviousSheet: RunFn = (api) => switchSheetByDelta(api, -1);\nconst switchToNextSheet: RunFn = (api) => switchSheetByDelta(api, +1);\n\nfunction switchSheetByDelta(api: CasualSheetsAPI, delta: -1 | 1) {\n const wb = fu(api).getActiveWorkbook();\n const active = wb?.getActiveSheet();\n if (!wb || !active) return;\n const sheets = wb.getSheets();\n const activeId = active.getSheetId();\n const idx = sheets.findIndex((s) => s.getSheetId() === activeId);\n if (idx < 0) return;\n const nextIdx = idx + delta;\n if (nextIdx < 0 || nextIdx >= sheets.length) return;\n wb.setActiveSheet(sheets[nextIdx]);\n}\n\nconst showFormulas: RunFn = (api) => void api.executeCommand('sheet.command.set-show-formula', {});\n\n/* ── Data ─────────────────────────────────────────────────────────────── */\n\nconst sortAsc: RunFn = (api) => sortRange(api, true);\nconst sortDesc: RunFn = (api) => sortRange(api, false);\n\nfunction sortRange(api: CasualSheetsAPI, ascending: boolean) {\n const range = activeRange(api);\n if (!range) return;\n // sort() comes from the sheets-sort facade extension (runtime cast).\n const withSort = range as unknown as {\n sort?: (spec: { column: number; ascending: boolean }) => unknown;\n };\n withSort.sort?.({ column: range.getColumn(), ascending });\n}\n\nconst toggleFilter: RunFn = (api) => {\n void (async () => {\n await ensurePluginByName('filter');\n const wb = fu(api).getActiveWorkbook();\n const sheet = activeSheet(api);\n const range = activeRange(api);\n if (!wb || !sheet || !range) return;\n const sheetWithFilter = sheet as unknown as { getFilter?: () => unknown };\n if (sheetWithFilter.getFilter?.()) {\n await api.executeCommand('sheet.command.remove-sheet-filter', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n });\n return;\n }\n await api.executeCommand('sheet.command.set-filter-range', {\n unitId: wb.getId(),\n subUnitId: sheet.getSheetId(),\n range: {\n startRow: range.getRow(),\n startColumn: range.getColumn(),\n endRow: range.getRow() + range.getHeight() - 1,\n endColumn: range.getColumn() + range.getWidth() - 1,\n },\n });\n })();\n};\n\nconst splitTextToColumns: RunFn = (api) =>\n void api.executeCommand('sheet.command.split-text-to-columns');\n\nconst forceRecalculate: RunFn = (api) =>\n void api.executeCommand('formula.mutation.set-formula-calculation-start', {\n forceCalculation: true,\n });\n\n/* ───────────────────────────── menu structure ─────────────────────────── */\n\n// Mirrors the app's menu order. Dialog items resolve `dialog` against\n// `onDialogRequest`; non-dialog items dispatch via the inline helpers above.\nconst MENUS: MenuDef[] = [\n {\n id: 'file',\n label: 'File',\n feature: 'file',\n items: [\n { kind: 'item', id: 'properties', label: 'Properties…', icon: 'info', dialog: 'properties' },\n {\n kind: 'item',\n id: 'about',\n label: 'About casual sheets',\n icon: 'help_outline',\n dialog: 'about',\n },\n ],\n },\n {\n id: 'edit',\n label: 'Edit',\n items: [\n { kind: 'item', id: 'undo', label: 'Undo', icon: 'undo', shortcut: 'Ctrl+Z', run: undo },\n { kind: 'item', id: 'redo', label: 'Redo', icon: 'redo', shortcut: 'Ctrl+Y', run: redo },\n { kind: 'separator', id: 'sep-clip' },\n { kind: 'item', id: 'cut', label: 'Cut', icon: 'content_cut', shortcut: 'Ctrl+X', run: cut },\n {\n kind: 'item',\n id: 'copy',\n label: 'Copy',\n icon: 'content_copy',\n shortcut: 'Ctrl+C',\n run: copy,\n },\n {\n kind: 'item',\n id: 'paste',\n label: 'Paste',\n icon: 'content_paste',\n shortcut: 'Ctrl+V',\n run: paste,\n },\n {\n kind: 'item',\n id: 'paste-format',\n label: 'Paste formatting only',\n icon: 'content_paste',\n shortcut: 'Ctrl+Shift+V',\n run: pasteFormattingOnly,\n },\n {\n kind: 'item',\n id: 'paste-special',\n label: 'Paste Special…',\n icon: 'content_paste_go',\n shortcut: 'Ctrl+Alt+V',\n dialog: 'paste-special',\n },\n { kind: 'separator', id: 'sep-find' },\n {\n kind: 'item',\n id: 'find-replace',\n label: 'Find & Replace…',\n icon: 'search',\n shortcut: 'Ctrl+F',\n dialog: 'find-replace',\n },\n { kind: 'separator', id: 'sep-cells' },\n {\n kind: 'item',\n id: 'edit-insert-cells',\n label: 'Insert cells…',\n icon: 'add_box',\n shortcut: 'Ctrl++',\n dialog: 'insert-cells',\n },\n {\n kind: 'item',\n id: 'edit-delete-cells',\n label: 'Delete cells…',\n icon: 'indeterminate_check_box',\n shortcut: 'Ctrl+-',\n dialog: 'delete-cells',\n },\n ],\n },\n {\n id: 'view',\n label: 'View',\n items: [\n {\n kind: 'item',\n id: 'show-formulas',\n label: 'Show formulas',\n icon: 'description',\n shortcut: 'Ctrl+`',\n run: showFormulas,\n },\n {\n kind: 'item',\n id: 'toggle-gridlines',\n label: 'Toggle gridlines',\n icon: 'grid_on',\n run: toggleGridlines,\n },\n { kind: 'separator', id: 'sep-freeze' },\n {\n kind: 'item',\n id: 'freeze-row',\n label: 'Freeze top row',\n icon: 'border_horizontal',\n run: freezeFirstRow,\n },\n {\n kind: 'item',\n id: 'freeze-col',\n label: 'Freeze first column',\n icon: 'border_vertical',\n run: freezeFirstColumn,\n },\n {\n kind: 'item',\n id: 'freeze-selection',\n label: 'Freeze panes (at selection)',\n icon: 'grid_4x4',\n run: freezeAtSelection,\n },\n { kind: 'item', id: 'unfreeze', label: 'Unfreeze', icon: 'grid_off', run: unfreezePanes },\n { kind: 'separator', id: 'sep-nav' },\n {\n kind: 'item',\n id: 'jump-home',\n label: 'Jump to A1',\n icon: 'home',\n shortcut: 'Ctrl+Home',\n run: jumpToFirstCell,\n },\n {\n kind: 'item',\n id: 'prev-sheet',\n label: 'Previous sheet',\n icon: 'navigate_before',\n shortcut: 'Ctrl+PageUp',\n run: switchToPreviousSheet,\n },\n {\n kind: 'item',\n id: 'next-sheet',\n label: 'Next sheet',\n icon: 'navigate_next',\n shortcut: 'Ctrl+PageDown',\n run: switchToNextSheet,\n },\n { kind: 'separator', id: 'sep-panels' },\n {\n kind: 'item',\n id: 'comments-panel',\n label: 'Comments panel',\n icon: 'forum',\n run: toggleCommentPanel,\n },\n ],\n },\n {\n id: 'insert',\n label: 'Insert',\n items: [\n {\n kind: 'item',\n id: 'new-sheet',\n label: 'New sheet',\n icon: 'add_box',\n shortcut: 'Shift+F11',\n run: insertNewSheet,\n },\n {\n kind: 'item',\n id: 'insert-table',\n label: 'Table',\n icon: 'table_rows',\n shortcut: 'Ctrl+L',\n run: insertTable,\n feature: 'tables',\n },\n {\n kind: 'item',\n id: 'insert-chart',\n label: 'Chart…',\n icon: 'bar_chart',\n dialog: 'insert-chart',\n feature: 'charts',\n },\n {\n kind: 'item',\n id: 'insert-sparkline',\n label: 'Sparkline…',\n icon: 'show_chart',\n dialog: 'insert-sparkline',\n feature: 'sparklines',\n },\n {\n kind: 'item',\n id: 'insert-pivot',\n label: 'PivotTable…',\n icon: 'pivot_table_chart',\n dialog: 'insert-pivot',\n feature: 'pivots',\n },\n { kind: 'separator', id: 'sep-objects' },\n { kind: 'item', id: 'insert-image', label: 'Image…', icon: 'image', run: insertImage },\n {\n kind: 'item',\n id: 'insert-function',\n label: 'Function…',\n icon: 'functions',\n shortcut: 'Shift+F3',\n dialog: 'insert-function',\n },\n {\n kind: 'item',\n id: 'insert-link',\n label: 'Hyperlink…',\n icon: 'link',\n shortcut: 'Ctrl+K',\n run: insertHyperlink,\n },\n {\n kind: 'item',\n id: 'insert-comment',\n label: 'Comment',\n icon: 'comment',\n shortcut: 'Shift+F2',\n run: insertComment,\n },\n { kind: 'separator', id: 'sep-rowcol' },\n {\n kind: 'submenu',\n id: 'insert-rowcol',\n label: 'Rows & columns',\n icon: 'grid_on',\n items: [\n {\n kind: 'item',\n id: 'insert-row-above',\n label: 'Row above',\n icon: 'vertical_align_top',\n run: insertRowAbove,\n },\n {\n kind: 'item',\n id: 'insert-row-below',\n label: 'Row below',\n icon: 'vertical_align_bottom',\n run: insertRowBelow,\n },\n {\n kind: 'item',\n id: 'insert-col-left',\n label: 'Column left',\n icon: 'keyboard_tab_rtl',\n run: insertColumnLeft,\n },\n {\n kind: 'item',\n id: 'insert-col-right',\n label: 'Column right',\n icon: 'keyboard_tab',\n run: insertColumnRight,\n },\n ],\n },\n { kind: 'separator', id: 'sep-autofit' },\n {\n kind: 'item',\n id: 'autofit-col',\n label: 'Auto-fit column width',\n icon: 'settings_ethernet',\n run: autoFitColumns,\n },\n {\n kind: 'item',\n id: 'autofit-row',\n label: 'Auto-fit row height',\n icon: 'height',\n run: autoFitRows,\n },\n { kind: 'separator', id: 'sep-date' },\n {\n kind: 'item',\n id: 'insert-today',\n label: \"Today's date\",\n icon: 'today',\n shortcut: 'Ctrl+;',\n run: insertTodayDate,\n },\n {\n kind: 'item',\n id: 'insert-time',\n label: 'Current time',\n icon: 'schedule',\n shortcut: 'Ctrl+Shift+:',\n run: insertCurrentTime,\n },\n ],\n },\n {\n id: 'format',\n label: 'Format',\n items: [\n {\n kind: 'item',\n id: 'format-cells',\n label: 'Format cells…',\n icon: 'format_shapes',\n shortcut: 'Ctrl+1',\n dialog: 'format-cells',\n },\n { kind: 'separator', id: 'sep-format-cells' },\n {\n kind: 'item',\n id: 'bold',\n label: 'Bold',\n icon: 'format_bold',\n shortcut: 'Ctrl+B',\n run: (api) => void api.executeCommand('sheet.command.set-range-bold'),\n },\n {\n kind: 'item',\n id: 'italic',\n label: 'Italic',\n icon: 'format_italic',\n shortcut: 'Ctrl+I',\n run: (api) => void api.executeCommand('sheet.command.set-range-italic'),\n },\n {\n kind: 'item',\n id: 'underline',\n label: 'Underline',\n icon: 'format_underlined',\n shortcut: 'Ctrl+U',\n run: (api) => void api.executeCommand('sheet.command.set-range-underline'),\n },\n {\n kind: 'item',\n id: 'wrap-text',\n label: 'Wrap text',\n icon: 'wrap_text',\n run: (api) => void api.executeCommand('sheet.command.set-text-wrap', { value: 3 }),\n },\n { kind: 'separator', id: 'sep-numfmt' },\n {\n kind: 'submenu',\n id: 'num-format',\n label: 'Number format',\n icon: 'looks_one',\n items: NUM_FORMAT_ORDER.map<MenuItemDef>((k) => ({\n kind: 'item',\n id: `num-${k}`,\n label: k[0]!.toUpperCase() + k.slice(1),\n icon: 'looks_one',\n shortcut: NUM_FORMAT_SHORTCUT[k],\n run: (api) => setNumberFormatByKey(api, k),\n })),\n },\n {\n kind: 'item',\n id: 'decimal-up',\n label: 'Increase decimals',\n icon: 'decimal_increase',\n run: increaseDecimal,\n },\n {\n kind: 'item',\n id: 'decimal-down',\n label: 'Decrease decimals',\n icon: 'decimal_decrease',\n run: decreaseDecimal,\n },\n { kind: 'separator', id: 'sep-borders' },\n {\n kind: 'submenu',\n id: 'borders',\n label: 'Borders',\n icon: 'border_all',\n items: [\n {\n kind: 'item',\n id: 'border-all',\n label: 'All borders',\n icon: 'border_all',\n run: (api) => applyBorders(api, 'all'),\n },\n {\n kind: 'item',\n id: 'border-outside',\n label: 'Outside borders',\n icon: 'border_outer',\n run: (api) => applyBorders(api, 'outside'),\n },\n {\n kind: 'item',\n id: 'border-none',\n label: 'No border',\n icon: 'border_clear',\n run: (api) => applyBorders(api, 'none'),\n },\n ],\n },\n { kind: 'separator', id: 'sep-cond' },\n {\n kind: 'item',\n id: 'conditional-formatting',\n label: 'Conditional formatting…',\n icon: 'palette',\n dialog: 'conditional-formatting',\n feature: 'conditionalFormatting',\n },\n { kind: 'separator', id: 'sep-visibility' },\n {\n kind: 'submenu',\n id: 'visibility',\n label: 'Visibility',\n icon: 'visibility',\n items: [\n {\n kind: 'item',\n id: 'hide-row',\n label: 'Hide row',\n icon: 'visibility_off',\n shortcut: 'Ctrl+9',\n run: hideSelectedRows,\n },\n {\n kind: 'item',\n id: 'unhide-row',\n label: 'Unhide row',\n icon: 'visibility',\n shortcut: 'Ctrl+Shift+9',\n run: unhideSelectedRows,\n },\n {\n kind: 'item',\n id: 'hide-col',\n label: 'Hide column',\n icon: 'visibility_off',\n shortcut: 'Ctrl+0',\n run: hideSelectedColumns,\n },\n {\n kind: 'item',\n id: 'unhide-col',\n label: 'Unhide column',\n icon: 'visibility',\n shortcut: 'Ctrl+Shift+0',\n run: unhideSelectedColumns,\n },\n ],\n },\n { kind: 'separator', id: 'sep-clear' },\n {\n kind: 'item',\n id: 'clear-format',\n label: 'Clear formatting',\n icon: 'format_clear',\n run: clearFormat,\n },\n { kind: 'separator', id: 'sep-delete' },\n {\n kind: 'item',\n id: 'delete-row',\n label: 'Delete row',\n icon: 'delete_sweep',\n run: deleteSelectedRow,\n },\n {\n kind: 'item',\n id: 'delete-col',\n label: 'Delete column',\n icon: 'folder_delete',\n run: deleteSelectedColumn,\n },\n ],\n },\n {\n id: 'data',\n label: 'Data',\n items: [\n {\n kind: 'item',\n id: 'sort-asc',\n label: 'Sort ascending',\n icon: 'arrow_upward',\n run: sortAsc,\n },\n {\n kind: 'item',\n id: 'sort-desc',\n label: 'Sort descending',\n icon: 'arrow_downward',\n run: sortDesc,\n },\n {\n kind: 'item',\n id: 'sort-custom',\n label: 'Sort range…',\n icon: 'sort',\n dialog: 'custom-sort',\n },\n {\n kind: 'item',\n id: 'toggle-filter',\n label: 'Toggle filter',\n icon: 'filter_alt',\n shortcut: 'Ctrl+Shift+L',\n run: toggleFilter,\n feature: 'filter',\n },\n { kind: 'separator', id: 'sep-tools' },\n {\n kind: 'item',\n id: 'data-validation',\n label: 'Data validation…',\n icon: 'rule',\n dialog: 'data-validation',\n feature: 'dataValidation',\n },\n {\n kind: 'item',\n id: 'name-manager',\n label: 'Name Manager…',\n icon: 'bookmark_add',\n shortcut: 'Ctrl+F3',\n dialog: 'name-manager',\n },\n {\n kind: 'item',\n id: 'goal-seek',\n label: 'Goal Seek…',\n icon: 'analytics',\n dialog: 'goal-seek',\n },\n { kind: 'separator', id: 'sep-clean' },\n {\n kind: 'item',\n id: 'text-to-columns',\n label: 'Text to Columns',\n icon: 'splitscreen',\n run: splitTextToColumns,\n },\n {\n kind: 'item',\n id: 'recalculate',\n label: 'Recalculate',\n icon: 'autorenew',\n shortcut: 'F9',\n run: forceRecalculate,\n },\n ],\n },\n {\n id: 'help',\n label: 'Help',\n items: [\n {\n kind: 'item',\n id: 'keyboard-shortcuts',\n label: 'Keyboard shortcuts',\n icon: 'info',\n shortcut: 'Ctrl+/',\n dialog: 'keyboard-shortcuts',\n },\n { kind: 'separator', id: 'sep-help' },\n { kind: 'item', id: 'about', label: 'About casual sheets', icon: 'info', dialog: 'about' },\n {\n kind: 'item',\n id: 'github',\n label: 'View on GitHub',\n icon: 'open_in_new',\n run: () => window.open('https://github.com/CasualOffice/sheets', '_blank'),\n },\n ],\n },\n];\n\n/* ───────────────────────────── styling ────────────────────────────────── */\n\nconst BAR_STYLE: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n padding: '2px 6px',\n borderBottom: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-bg, #eef1f5)',\n flex: '0 0 auto',\n userSelect: 'none',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst MENU_BTN_STYLE: CSSProperties = {\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n};\n\nconst DROPDOWN_STYLE: CSSProperties = {\n position: 'absolute',\n top: '100%',\n minWidth: 220,\n marginTop: 2,\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n zIndex: 1000,\n};\n\nconst ITEM_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n width: '100%',\n height: 30,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'left',\n};\n\nconst SEPARATOR_STYLE: CSSProperties = {\n height: 1,\n margin: '4px 6px',\n background: 'var(--cs-chrome-border, #e6e9ee)',\n};\n\nconst SHORTCUT_STYLE: CSSProperties = {\n marginLeft: 'auto',\n paddingLeft: 16,\n fontSize: 11,\n color: 'var(--cs-chrome-muted, #6b7280)',\n};\n\nconst SUBMENU_PANEL_STYLE: CSSProperties = {\n position: 'absolute',\n top: -4,\n left: '100%',\n minWidth: 200,\n marginLeft: 2,\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n zIndex: 1001,\n};\n\n/* ───────────────────────────── filtering ──────────────────────────────── */\n\n/** True when the feature gate (if any) is enabled (default: enabled). */\nfunction featureOn(feature: string | undefined, features: Record<string, boolean>): boolean {\n if (!feature) return true;\n return features[feature] !== false;\n}\n\n/**\n * Keep an item if its feature is on AND — for a dialog item — the host provides\n * a dialog handler. Dialog items with no host hook are dropped (the SDK never\n * fakes a dialog). Submenus are filtered recursively and dropped when empty.\n */\nfunction keepItem(\n item: MenuItemDef,\n features: Record<string, boolean>,\n hasDialogHost: boolean,\n): MenuItemDef | null {\n if (!featureOn(item.feature, features)) return null;\n if (item.kind === 'separator') return item;\n if (item.kind === 'submenu') {\n const items = filterItems(item.items, features, hasDialogHost);\n if (items.length === 0) return null;\n return { ...item, items };\n }\n if (item.dialog && !hasDialogHost) return null;\n return item;\n}\n\n/** Filter a list and collapse leading/trailing/double separators. */\nfunction filterItems(\n items: MenuItemDef[],\n features: Record<string, boolean>,\n hasDialogHost: boolean,\n): MenuItemDef[] {\n const kept = items\n .map((i) => keepItem(i, features, hasDialogHost))\n .filter((i): i is MenuItemDef => i !== null);\n // Collapse separators: drop leading, trailing, and runs.\n const out: MenuItemDef[] = [];\n for (const item of kept) {\n if (item.kind === 'separator') {\n if (out.length === 0) continue;\n if (out[out.length - 1].kind === 'separator') continue;\n }\n out.push(item);\n }\n while (out.length > 0 && out[out.length - 1].kind === 'separator') out.pop();\n return out;\n}\n\n/* ───────────────────────────── component ──────────────────────────────── */\n\nexport interface MenuBarProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n /**\n * Per-feature toggles. A control / menu whose `feature` key is `false` is not\n * rendered. Unknown / omitted keys default to enabled.\n */\n features?: Record<string, boolean>;\n /**\n * Host hook for actions the SDK can't render itself (Format Cells, Insert\n * Chart, PivotTable, Find & Replace, Insert/Delete cells, …). Called with the\n * dialog `kind` and an optional `context` (the active selection in A1 for\n * range-seeded dialogs). When omitted, those items are not rendered.\n */\n onDialogRequest?: (kind: MenuDialogKind, context?: unknown) => void;\n}\n\nexport function MenuBar({ api, features = {}, onDialogRequest }: MenuBarProps) {\n const [open, setOpen] = useState<MenuId | null>(null);\n const [openSubmenu, setOpenSubmenu] = useState<string | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n ensureChromeFonts();\n }, []);\n\n // Close on Escape + on a pointerdown outside the menu bar.\n useEffect(() => {\n if (open === null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(null);\n setOpenSubmenu(null);\n }\n };\n const onDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) {\n setOpen(null);\n setOpenSubmenu(null);\n }\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onDown, true);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onDown, true);\n };\n }, [open]);\n\n const close = () => {\n setOpen(null);\n setOpenSubmenu(null);\n };\n\n const runItem = (item: Extract<MenuItemDef, { kind: 'item' }>) => {\n close();\n if (!api) return;\n if (item.dialog) {\n // Range-seeded dialogs get the current selection in A1 as context.\n const seeded =\n item.dialog === 'insert-chart' ||\n item.dialog === 'insert-pivot' ||\n item.dialog === 'insert-sparkline' ||\n item.dialog === 'insert-cells' ||\n item.dialog === 'delete-cells';\n onDialogRequest?.(item.dialog, seeded ? selectionA1(api) : undefined);\n return;\n }\n item.run?.(api);\n };\n\n // Compute the visible menus once per render (feature + dialog-host gating).\n const hasDialogHost = !!onDialogRequest;\n const visibleMenus = MENUS.map((menu) => ({\n ...menu,\n items: filterItems(menu.items, features, hasDialogHost),\n })).filter((menu) => featureOn(menu.feature, features) && menu.items.length > 0);\n\n const renderItems = (items: MenuItemDef[]): ReactNode =>\n items.map((item) => {\n if (item.kind === 'separator') {\n return <div key={item.id} style={SEPARATOR_STYLE} role=\"separator\" aria-hidden />;\n }\n if (item.kind === 'submenu') {\n const isSubOpen = openSubmenu === item.id;\n return (\n <div\n key={item.id}\n style={{ position: 'relative' }}\n onMouseEnter={() => setOpenSubmenu(item.id)}\n onMouseLeave={() => setOpenSubmenu((cur) => (cur === item.id ? null : cur))}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n data-testid={`cs-menuitem-${item.id}`}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n disabled={!api}\n style={{ ...ITEM_STYLE, opacity: api ? 1 : 0.5 }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {item.icon ? (\n <Icon name={item.icon} size={18} />\n ) : (\n <span style={{ width: 18 }} aria-hidden />\n )}\n <span>{item.label}</span>\n <Icon name=\"chevron_right\" size={18} style={{ marginLeft: 'auto' }} />\n </button>\n {isSubOpen && (\n <div style={SUBMENU_PANEL_STYLE} role=\"menu\" aria-label={item.label}>\n {renderItems(item.items)}\n </div>\n )}\n </div>\n );\n }\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-testid={`cs-menuitem-${item.id}`}\n disabled={!api}\n style={{ ...ITEM_STYLE, opacity: api ? 1 : 0.5 }}\n onMouseDown={(e) => {\n e.preventDefault();\n runItem(item);\n }}\n onMouseEnter={(e) => {\n setOpenSubmenu(null);\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n {item.icon ? (\n <Icon name={item.icon} size={18} />\n ) : (\n <span style={{ width: 18 }} aria-hidden />\n )}\n <span>{item.label}</span>\n {item.shortcut && <span style={SHORTCUT_STYLE}>{fmtShortcut(item.shortcut)}</span>}\n </button>\n );\n });\n\n return (\n <div\n ref={rootRef}\n style={BAR_STYLE}\n data-testid=\"cs-menubar\"\n role=\"menubar\"\n aria-label=\"Menu bar\"\n >\n {visibleMenus.map((menu) => {\n const isOpen = open === menu.id;\n return (\n <div key={menu.id} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n data-menu={menu.id}\n data-testid={`cs-menu-${menu.id}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n style={{\n ...MENU_BTN_STYLE,\n background: isOpen ? 'var(--cs-chrome-active, #e6f3f7)' : 'transparent',\n color: isOpen ? 'var(--cs-chrome-active-fg, #0e7490)' : MENU_BTN_STYLE.color,\n }}\n // mousedown (not click) so the grid selection isn't lost first;\n // toggle the menu open/closed.\n onMouseDown={(e) => {\n e.preventDefault();\n setOpenSubmenu(null);\n setOpen((cur) => (cur === menu.id ? null : menu.id));\n }}\n onMouseEnter={(e) => {\n // Hover-to-switch once a menu is already open (Office behaviour).\n if (open !== null && open !== menu.id) {\n setOpen(menu.id);\n setOpenSubmenu(null);\n } else if (!isOpen)\n e.currentTarget.style.background = 'var(--cs-chrome-hover, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isOpen\n ? 'var(--cs-chrome-active, #e6f3f7)'\n : 'transparent';\n }}\n >\n {menu.label}\n </button>\n {isOpen && (\n <div style={DROPDOWN_STYLE} role=\"menu\" aria-label={menu.label}>\n {renderItems(menu.items)}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { Univer, IWorkbookData } from '@univerjs/core';\n\n/**\n * Lazy plugin loading — pipeline Stage 4. The cheap plugins (render,\n * formula, sheets, sheets-ui, numfmt, docs) stay eager because every\n * workbook needs them. The heavy / feature-specific plugins (CF, DV,\n * hyperlink, table, note, thread-comment, drawing, sort, filter,\n * find-replace) load on demand:\n *\n * 1. Eagerly when a snapshot is about to mount and we detect the\n * plugin's resource key on it (e.g. `SHEET_CONDITIONAL_FORMATTING_PLUGIN`\n * in `data.resources`). This is the safety net: missing this would\n * silently drop plugin data on file open.\n * 2. Lazily when the user reaches for the feature — opens the Data\n * tab (sort/filter), hits Ctrl+F (find-replace), uses the Insert\n * tab (drawing), etc. The shell hooks `ensurePlugin(...)` into\n * these triggers and awaits before the action runs.\n *\n * Each loader returns the plugins-to-register in the correct order\n * (base before UI, same as `plugins.ts`). Registration order matters\n * in Univer; the loaders bundle a small group together to keep that\n * locality explicit.\n */\n\nexport type LazyPluginGroup =\n | 'cf'\n | 'dv'\n | 'hyperlink'\n | 'note'\n | 'table'\n | 'threadComment'\n | 'drawing'\n | 'sort'\n | 'filter'\n | 'findReplace';\n\ntype Loader = () => Promise<Array<[unknown, unknown?]>>;\n\nconst LOADERS: Record<LazyPluginGroup, Loader> = {\n cf: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-conditional-formatting'),\n import('@univerjs/sheets-conditional-formatting-ui'),\n ]);\n return [\n [base.UniverSheetsConditionalFormattingPlugin],\n [ui.UniverSheetsConditionalFormattingUIPlugin],\n ];\n },\n dv: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-data-validation'),\n import('@univerjs/sheets-data-validation-ui'),\n ]);\n return [\n [base.UniverSheetsDataValidationPlugin],\n [ui.UniverSheetsDataValidationUIPlugin],\n ];\n },\n hyperlink: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-hyper-link'),\n import('@univerjs/sheets-hyper-link-ui'),\n ]);\n return [\n [base.UniverSheetsHyperLinkPlugin],\n [ui.UniverSheetsHyperLinkUIPlugin],\n ];\n },\n note: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-note'),\n import('@univerjs/sheets-note-ui'),\n ]);\n return [[base.UniverSheetsNotePlugin], [ui.UniverSheetsNoteUIPlugin]];\n },\n table: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-table'),\n import('@univerjs/sheets-table-ui'),\n ]);\n return [[base.UniverSheetsTablePlugin], [ui.UniverSheetsTableUIPlugin]];\n },\n threadComment: async () => {\n const [tc, tcUi, sheetsTc, sheetsTcUi] = await Promise.all([\n import('@univerjs/thread-comment'),\n import('@univerjs/thread-comment-ui'),\n import('@univerjs/sheets-thread-comment'),\n import('@univerjs/sheets-thread-comment-ui'),\n ]);\n return [\n [tc.UniverThreadCommentPlugin],\n [tcUi.UniverThreadCommentUIPlugin],\n [sheetsTc.UniverSheetsThreadCommentPlugin],\n [sheetsTcUi.UniverSheetsThreadCommentUIPlugin],\n ];\n },\n drawing: async () => {\n const [d, dUi, sd, sdUi] = await Promise.all([\n import('@univerjs/drawing'),\n import('@univerjs/drawing-ui'),\n import('@univerjs/sheets-drawing'),\n import('@univerjs/sheets-drawing-ui'),\n // Side-effect imports: install FWorksheet.insertImage / getImages /\n // updateImages on the facade prototype. Without these, code that\n // reaches in via the FUniver facade (e2e specs, future shell glue)\n // sees an undefined method even though the plugin is registered.\n import('@univerjs/sheets-drawing/facade'),\n import('@univerjs/sheets-drawing-ui/facade'),\n ]);\n return [\n [d.UniverDrawingPlugin],\n [dUi.UniverDrawingUIPlugin],\n [sd.UniverSheetsDrawingPlugin],\n [sdUi.UniverSheetsDrawingUIPlugin],\n ];\n },\n sort: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-sort'),\n import('@univerjs/sheets-sort-ui'),\n ]);\n return [[base.UniverSheetsSortPlugin], [ui.UniverSheetsSortUIPlugin]];\n },\n filter: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-filter'),\n import('@univerjs/sheets-filter-ui'),\n ]);\n return [[base.UniverSheetsFilterPlugin], [ui.UniverSheetsFilterUIPlugin]];\n },\n findReplace: async () => {\n const [base, sheets] = await Promise.all([\n import('@univerjs/find-replace'),\n import('@univerjs/sheets-find-replace'),\n ]);\n return [[base.UniverFindReplacePlugin], [sheets.UniverSheetsFindReplacePlugin]];\n },\n};\n\n/**\n * Map from a Univer `data.resources[].name` to the lazy group that owns\n * it. Used by `eagerLoadForSnapshot` to pre-register plugins whose\n * state already lives on the workbook so file-open never silently\n * drops a CF rule / table / drawing / etc.\n */\nconst RESOURCE_NAME_TO_GROUP: Record<string, LazyPluginGroup> = {\n SHEET_CONDITIONAL_FORMATTING_PLUGIN: 'cf',\n SHEET_DATA_VALIDATION_PLUGIN: 'dv',\n SHEET_HYPER_LINK_PLUGIN: 'hyperlink',\n SHEET_NOTE_PLUGIN: 'note',\n SHEET_TABLE_PLUGIN: 'table',\n SHEET_THREAD_COMMENT_BASE_PLUGIN: 'threadComment',\n SHEET_DRAWING_PLUGIN: 'drawing',\n SHEET_SORT_PLUGIN: 'sort',\n SHEET_FILTER_PLUGIN: 'filter',\n};\n\nconst loaded = new Set<LazyPluginGroup>();\nconst inflight = new Map<LazyPluginGroup, Promise<void>>();\n\n/**\n * Module-level reference to the live Univer instance, set by\n * `UniverSheet.tsx` immediately after `new Univer()`. Lets shell code\n * call `ensurePluginByName(group)` without plumbing the Univer\n * instance through React context (the FUniver facade doesn't expose\n * its host). Cleared on dispose so callers fail loudly if they hit\n * the lazy path after teardown.\n */\nlet currentUniver: Univer | null = null;\n\nexport function setUniverForLazyLoad(univer: Univer | null): void {\n currentUniver = univer;\n}\n\n/**\n * Idempotent: subsequent calls for the same group resolve immediately\n * if the plugin is already loaded; concurrent calls share the same\n * in-flight promise so we never double-register.\n */\nexport function ensurePlugin(univer: Univer, group: LazyPluginGroup): Promise<void> {\n if (loaded.has(group)) return Promise.resolve();\n const existing = inflight.get(group);\n if (existing) return existing;\n const loader = LOADERS[group];\n if (!loader) return Promise.resolve();\n const p = loader().then((plugins) => {\n for (const [PluginCtor, config] of plugins) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n univer.registerPlugin(PluginCtor as any, config);\n }\n loaded.add(group);\n inflight.delete(group);\n });\n inflight.set(group, p);\n return p;\n}\n\n/**\n * Shell-friendly variant of `ensurePlugin` that pulls the Univer\n * instance from the module-level holder set by `UniverSheet.tsx`. Use\n * this anywhere we only have the FUniver facade (toolbar callbacks,\n * panel handlers). Returns a resolved promise if the holder is empty —\n * the worst case is a no-op, never a throw.\n */\nexport function ensurePluginByName(group: LazyPluginGroup): Promise<void> {\n if (loaded.has(group)) return Promise.resolve();\n if (!currentUniver) return Promise.resolve();\n return ensurePlugin(currentUniver, group);\n}\n\n/**\n * Walk a snapshot for plugin-owned resources + side-channel hyperlinks\n * and eagerly load every group that's referenced. Returns a promise\n * the caller MUST await before `createUnit` — Univer's resource manager\n * silently discards keys for plugins that aren't yet registered.\n */\nexport async function eagerLoadForSnapshot(univer: Univer, snapshot: IWorkbookData): Promise<void> {\n const groups = new Set<LazyPluginGroup>();\n const resources = snapshot.resources ?? [];\n for (const r of resources) {\n const g = RESOURCE_NAME_TO_GROUP[r.name];\n if (g) groups.add(g);\n }\n // Hyperlinks live inline in cell.p (Stage 5) — the hyperlink plugin\n // still owns click handling / context-menu actions, so eager-load\n // when any cell has a HYPERLINK customRange.\n if (snapshotHasHyperlinks(snapshot)) groups.add('hyperlink');\n await Promise.all(Array.from(groups).map((g) => ensurePlugin(univer, g)));\n}\n\n/**\n * Idle-load every remaining lazy group AFTER Univer is mounted. The\n * bundle split (each group ships as its own chunk) is the persistent\n * boot-time win — the initial paint doesn't pay for them. This\n * idle-load just ensures they're all eventually registered so a user\n * clicking \"Insert > Table\" doesn't hit a no-op.\n *\n * Loads in parallel via `requestIdleCallback` so they don't compete\n * with the first paint, falling back to `setTimeout(0)` in browsers\n * without rIC (Safari).\n */\nexport function idleLoadAll(univer: Univer): void {\n const groups = Object.keys(LOADERS) as LazyPluginGroup[];\n schedule(() => {\n for (const g of groups) {\n void ensurePlugin(univer, g);\n }\n });\n}\n\nfunction schedule(fn: () => void): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ric = (globalThis as any).requestIdleCallback as\n | ((cb: () => void, opts?: { timeout: number }) => number)\n | undefined;\n if (ric) ric(fn, { timeout: 500 });\n else setTimeout(fn, 0);\n}\n\nfunction snapshotHasHyperlinks(snapshot: IWorkbookData): boolean {\n const sheetOrder = snapshot.sheetOrder ?? [];\n for (const sid of sheetOrder) {\n const sheet = snapshot.sheets?.[sid];\n if (!sheet?.cellData) continue;\n const cellData = sheet.cellData as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, { p?: any }>\n >;\n for (const r of Object.keys(cellData)) {\n const row = cellData[r];\n for (const c of Object.keys(row)) {\n const ranges = row[c]?.p?.body?.customRanges ?? [];\n if (ranges.some((cr: { rangeType?: number }) => cr.rangeType === 0)) return true;\n }\n }\n }\n return false;\n}\n","/**\n * SheetTabs — worksheet tab strip for `<CasualSheets chrome>`.\n *\n * The fundamental multi-sheet control the built-in chrome was missing: switch\n * sheets (click), add a sheet (+), rename (double-click), and delete (context\n * menu). Drives the editor through the FUniver facade only — `insertSheet` /\n * `setActiveSheet` / `deleteSheet` / `FWorksheet.setName` — and stays live by\n * subscribing to the sheet-lifecycle facade events (plus the mutation-level\n * fallback so collab/replay-driven changes refresh too).\n *\n * Scope of this batch: switch / add / rename / delete. Drag-reorder, tab\n * colour, hide/unhide, and duplicate are richer host features deferred to\n * later parity batches (the reference app's SheetTabs has them).\n */\n\nimport { useEffect, useState, type CSSProperties, type KeyboardEvent } from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\ninterface SheetTab {\n id: string;\n name: string;\n hidden: boolean;\n}\n\ninterface SheetsSnapshot {\n tabs: SheetTab[];\n activeId: string | null;\n}\n\nconst EMPTY: SheetsSnapshot = { tabs: [], activeId: null };\n\n/** Sheet-list mutations that must refresh the strip even when they arrive via\n * the collab bridge's mutation-only replay (which bypasses facade events). */\nconst SHEET_LIST_MUTATIONS = new Set([\n 'sheet.mutation.insert-sheet',\n 'sheet.mutation.remove-sheet',\n 'sheet.mutation.set-worksheet-name',\n 'sheet.mutation.set-worksheet-order',\n 'sheet.mutation.set-worksheet-hidden',\n]);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFacade = any;\n\nfunction readSheets(api: CasualSheetsAPI): SheetsSnapshot {\n const wb = api.univer.getActiveWorkbook();\n if (!wb) return EMPTY;\n const tabs = wb.getSheets().map((s) => ({\n id: s.getSheetId(),\n name: s.getSheetName(),\n hidden: (s as AnyFacade).isSheetHidden?.() === true,\n }));\n return { tabs, activeId: wb.getActiveSheet()?.getSheetId() ?? null };\n}\n\nconst BAR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'stretch',\n gap: 2,\n height: 30,\n flex: '0 0 auto',\n padding: '0 6px',\n borderTop: '1px solid var(--cs-chrome-border, rgba(0,0,0,0.12))',\n background: 'var(--cs-chrome-bg, #f8f9fa)',\n font: 'inherit',\n fontSize: 13,\n overflowX: 'auto',\n overflowY: 'hidden',\n};\n\nconst ADD_BTN_STYLE: CSSProperties = {\n flex: '0 0 auto',\n width: 28,\n border: 'none',\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n fontSize: 18,\n lineHeight: 1,\n borderRadius: 4,\n};\n\nconst RENAME_INPUT_STYLE: CSSProperties = {\n height: 22,\n alignSelf: 'center',\n padding: '0 6px',\n border: '1px solid var(--cs-chrome-active-fg, #0e7490)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n width: 120,\n};\n\nconst MENU_STYLE: CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n minWidth: 140,\n padding: 4,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n borderRadius: 8,\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.16)',\n};\n\nconst MENU_ITEM_STYLE: CSSProperties = {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n height: 28,\n padding: '0 10px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n};\n\nexport interface SheetTabsProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function SheetTabs({ api }: SheetTabsProps) {\n const [{ tabs, activeId }, setSnapshot] = useState<SheetsSnapshot>(EMPTY);\n // Inline-rename target sheet id (null = not renaming) + its draft text.\n const [renaming, setRenaming] = useState<string | null>(null);\n const [draft, setDraft] = useState('');\n // Right-click context menu: anchor + target sheet id.\n const [menu, setMenu] = useState<{ x: number; y: number; sheetId: string } | null>(null);\n\n useEffect(() => {\n if (!api) return;\n const refresh = () => setSnapshot(readSheets(api));\n refresh();\n const f = api.univer as AnyFacade;\n const subs: Array<{ dispose(): void }> = [];\n try {\n subs.push(\n f.addEvent(f.Event.SheetCreated, refresh),\n f.addEvent(f.Event.SheetDeleted, refresh),\n f.addEvent(f.Event.SheetNameChanged, refresh),\n f.addEvent(f.Event.ActiveSheetChanged, refresh),\n f.addEvent(f.Event.SheetMoved, refresh),\n // Mutation-level fallback — catches collab/replay-driven changes that\n // don't emit the higher-level facade events.\n f.addEvent(f.Event.CommandExecuted, (e: { id?: string }) => {\n if (e?.id && SHEET_LIST_MUTATIONS.has(e.id)) refresh();\n }),\n );\n // Whole-unit swaps (loadSnapshot / File→Open) don't fire SheetCreated;\n // refresh a tick after the new unit is wired in.\n if (typeof f.onUniverSheetCreated === 'function') {\n subs.push(f.onUniverSheetCreated(() => queueMicrotask(refresh)));\n }\n } catch {\n /* facade event surface differs — the initial read still populated tabs */\n }\n return () => {\n for (const s of subs) s?.dispose?.();\n };\n }, [api]);\n\n // Close the context menu on any outside interaction.\n useEffect(() => {\n if (!menu) return;\n const close = () => setMenu(null);\n window.addEventListener('pointerdown', close);\n window.addEventListener('keydown', close);\n return () => {\n window.removeEventListener('pointerdown', close);\n window.removeEventListener('keydown', close);\n };\n }, [menu]);\n\n if (!api) {\n return <div style={BAR_STYLE} data-testid=\"casual-sheets-tabs\" />;\n }\n\n const visible = tabs.filter((t) => !t.hidden);\n const wb = () => api.univer.getActiveWorkbook();\n\n const switchTo = (id: string) => {\n if (id === activeId) return;\n wb()?.setActiveSheet(id);\n };\n\n const addSheet = () => {\n const created = (wb() as AnyFacade)?.insertSheet?.();\n created?.activate?.();\n };\n\n const startRename = (tab: SheetTab) => {\n setMenu(null);\n setRenaming(tab.id);\n setDraft(tab.name);\n };\n\n const commitRename = () => {\n const id = renaming;\n setRenaming(null);\n if (!id) return;\n const name = draft.trim();\n if (!name) return;\n const sheet = (wb() as AnyFacade)?.getSheetBySheetId?.(id);\n if (sheet && sheet.getSheetName?.() !== name) sheet.setName?.(name);\n };\n\n const deleteSheet = (id: string) => {\n setMenu(null);\n // Excel keeps at least one visible sheet — never delete the last one.\n if (visible.length <= 1) return;\n (wb() as AnyFacade)?.deleteSheet?.(id);\n };\n\n const onRenameKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitRename();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setRenaming(null);\n }\n };\n\n return (\n <div style={BAR_STYLE} data-testid=\"casual-sheets-tabs\" role=\"tablist\">\n {visible.map((tab) => {\n const active = tab.id === activeId;\n if (renaming === tab.id) {\n return (\n <input\n key={tab.id}\n autoFocus\n style={RENAME_INPUT_STYLE}\n value={draft}\n data-testid=\"cs-tab-rename-input\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onRenameKey}\n onBlur={commitRename}\n />\n );\n }\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-testid={`cs-tab-${tab.id}`}\n data-active={active || undefined}\n title={tab.name}\n style={{\n flex: '0 0 auto',\n maxWidth: 160,\n padding: '0 12px',\n border: 'none',\n borderTop: active\n ? '2px solid var(--cs-chrome-active-fg, #0e7490)'\n : '2px solid transparent',\n background: active ? 'var(--cs-chrome-input-bg, #fff)' : 'transparent',\n color: active\n ? 'var(--cs-chrome-active-fg, #0e7490)'\n : 'var(--cs-chrome-fg, #201f1e)',\n fontWeight: active ? 600 : 400,\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n // mousedown keeps the grid from stealing focus mid-switch.\n onMouseDown={(e) => {\n e.preventDefault();\n switchTo(tab.id);\n }}\n onDoubleClick={() => startRename(tab)}\n onContextMenu={(e) => {\n e.preventDefault();\n setMenu({ x: e.clientX, y: e.clientY, sheetId: tab.id });\n }}\n >\n {tab.name}\n </button>\n );\n })}\n <button\n type=\"button\"\n style={ADD_BTN_STYLE}\n aria-label=\"Add sheet\"\n title=\"Add sheet\"\n data-testid=\"cs-tab-add\"\n onMouseDown={(e) => {\n e.preventDefault();\n addSheet();\n }}\n >\n +\n </button>\n\n {menu && (\n <div\n style={{ ...MENU_STYLE, left: menu.x, top: menu.y }}\n data-testid=\"cs-tab-menu\"\n role=\"menu\"\n // Keep clicks inside the menu from closing it via the window handler.\n onPointerDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n style={MENU_ITEM_STYLE}\n data-testid=\"cs-tab-menu-rename\"\n onMouseDown={(e) => {\n e.preventDefault();\n const tab = tabs.find((t) => t.id === menu.sheetId);\n if (tab) startRename(tab);\n }}\n >\n Rename\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n style={{\n ...MENU_ITEM_STYLE,\n opacity: visible.length <= 1 ? 0.5 : 1,\n cursor: visible.length <= 1 ? 'not-allowed' : 'pointer',\n }}\n data-testid=\"cs-tab-menu-delete\"\n onMouseDown={(e) => {\n e.preventDefault();\n deleteSheet(menu.sheetId);\n }}\n >\n Delete\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * FindReplace — a custom find/replace dialog for `<CasualSheets chrome>`.\n *\n * Univer's own find-replace dialog doesn't render in the SDK's headless mount\n * (it needs Univer's UI/overlay layer, which is dormant when header/toolbar/\n * footer are off), so the chrome ships its own — driven purely through the\n * facade: search reads the active sheet's `cellData` from `getSnapshot()`,\n * navigation `activate()`s the matching cell, and replace `setValue()`s it.\n *\n * Opens on Ctrl/Cmd+F (find) or Ctrl/Cmd+H (replace) while the editor has focus;\n * Escape closes. Self-managing — just mount it in the chrome with the live api.\n */\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n} from 'react';\nimport type { CasualSheetsAPI } from '../sheets/api';\nimport { Icon } from './Icon';\n\ninterface Match {\n row: number;\n col: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySnapshot = any;\n\n/** Collect matches on the active sheet, in row-major order. Searches each\n * cell's value (`v`) and formula (`f`) text. */\nfunction findMatches(api: CasualSheetsAPI, query: string, matchCase: boolean): Match[] {\n if (!query) return [];\n const snap = api.getSnapshot() as AnySnapshot;\n const sheetId =\n api.getSelection()?.sheetId ?? api.univer.getActiveWorkbook()?.getActiveSheet()?.getSheetId();\n const sheet = sheetId ? snap?.sheets?.[sheetId] : undefined;\n const cellData = sheet?.cellData as Record<string, Record<string, AnySnapshot>> | undefined;\n if (!cellData) return [];\n const needle = matchCase ? query : query.toLowerCase();\n const out: Match[] = [];\n for (const rk of Object.keys(cellData).sort((a, b) => Number(a) - Number(b))) {\n const rowObj = cellData[rk];\n if (!rowObj) continue;\n for (const ck of Object.keys(rowObj).sort((a, b) => Number(a) - Number(b))) {\n const cell = rowObj[ck];\n if (!cell) continue;\n const hay = `${cell.v ?? ''}${cell.f ? ` ${cell.f}` : ''}`;\n const cmp = matchCase ? hay : hay.toLowerCase();\n if (cmp.includes(needle)) out.push({ row: Number(rk), col: Number(ck) });\n }\n }\n return out;\n}\n\nconst WRAP_STYLE: CSSProperties = {\n position: 'absolute',\n top: 8,\n right: 12,\n zIndex: 1100,\n width: 320,\n padding: 10,\n borderRadius: 8,\n border: '1px solid var(--cs-chrome-border, #e6e9ee)',\n background: 'var(--cs-chrome-input-bg, #fff)',\n boxShadow: '0 8px 28px rgba(0,0,0,0.18)',\n font: 'inherit',\n fontSize: 13,\n color: 'var(--cs-chrome-fg, #201f1e)',\n};\n\nconst ROW_STYLE: CSSProperties = { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 };\n\nconst INPUT_STYLE: CSSProperties = {\n flex: '1 1 auto',\n height: 26,\n padding: '0 8px',\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 4,\n background: 'var(--cs-chrome-input-bg, #fff)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 13,\n boxSizing: 'border-box',\n};\n\nconst BTN_STYLE: CSSProperties = {\n height: 26,\n padding: '0 10px',\n border: '1px solid var(--cs-chrome-border, #cdd3db)',\n borderRadius: 4,\n background: 'var(--cs-chrome-bg, #f3f5f8)',\n color: 'var(--cs-chrome-fg, #201f1e)',\n font: 'inherit',\n fontSize: 12,\n cursor: 'pointer',\n};\n\nconst ICON_BTN_STYLE: CSSProperties = {\n width: 26,\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--cs-chrome-fg, #201f1e)',\n cursor: 'pointer',\n padding: 0,\n};\n\nexport interface FindReplaceProps {\n /** Live API, or `null` until the editor is ready. */\n api: CasualSheetsAPI | null;\n}\n\nexport function FindReplace({ api }: FindReplaceProps) {\n const [open, setOpen] = useState(false);\n const [showReplace, setShowReplace] = useState(false);\n const [query, setQuery] = useState('');\n const [replaceText, setReplaceText] = useState('');\n const [matchCase, setMatchCase] = useState(false);\n const [idx, setIdx] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Open on Ctrl/Cmd+F (find) / Ctrl/Cmd+H (replace), close on Escape.\n useEffect(() => {\n const onKey = (e: globalThis.KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && (e.key === 'f' || e.key === 'F')) {\n e.preventDefault();\n setShowReplace(false);\n setOpen(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n } else if (mod && (e.key === 'h' || e.key === 'H')) {\n e.preventDefault();\n setShowReplace(true);\n setOpen(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n\n const matches = useMemo(\n () => (api && open && query ? findMatches(api, query, matchCase) : []),\n [api, open, query, matchCase],\n );\n\n // Keep idx in range as matches change.\n useEffect(() => {\n setIdx((i) => (matches.length === 0 ? 0 : Math.min(i, matches.length - 1)));\n }, [matches.length]);\n\n if (!open || !api) return null;\n\n const go = (delta: number) => {\n if (matches.length === 0) return;\n const next = (idx + delta + matches.length) % matches.length;\n setIdx(next);\n activate(matches[next]);\n };\n\n const activate = (m: Match) => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (sheet?.getRange(m.row, m.col) as any)?.activate?.();\n };\n\n const replaceOne = () => {\n if (matches.length === 0) return;\n const m = matches[Math.min(idx, matches.length - 1)];\n replaceAt(m);\n // Matches recompute via the query memo on next render; advance stays put.\n };\n\n const replaceAt = (m: Match) => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n const cur = String(sheet.getRange(m.row, m.col).getValue?.() ?? '');\n const next = replaceInString(cur, query, replaceText, matchCase);\n if (next !== cur) sheet.getRange(m.row, m.col).setValue(next);\n };\n\n const replaceAll = () => {\n const sheet = api.univer.getActiveWorkbook()?.getActiveSheet();\n if (!sheet) return;\n for (const m of matches) {\n const cur = String(sheet.getRange(m.row, m.col).getValue?.() ?? '');\n const next = replaceInString(cur, query, replaceText, matchCase);\n if (next !== cur) sheet.getRange(m.row, m.col).setValue(next);\n }\n };\n\n const onInputKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n go(e.shiftKey ? -1 : 1);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n }\n };\n\n const count = matches.length;\n const position = count === 0 ? 0 : Math.min(idx, count - 1) + 1;\n\n return (\n <div\n style={WRAP_STYLE}\n data-testid=\"cs-find-replace\"\n role=\"dialog\"\n aria-label=\"Find and replace\"\n >\n <div style={ROW_STYLE}>\n <input\n ref={inputRef}\n type=\"text\"\n aria-label=\"Find\"\n placeholder=\"Find\"\n data-testid=\"cs-find-input\"\n style={INPUT_STYLE}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onInputKey}\n />\n <span\n style={{ minWidth: 54, textAlign: 'center', color: 'var(--cs-chrome-muted, #6b7280)' }}\n data-testid=\"cs-find-count\"\n >\n {position}/{count}\n </span>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Previous match\"\n data-testid=\"cs-find-prev\"\n onMouseDown={(e) => {\n e.preventDefault();\n go(-1);\n }}\n >\n <Icon name=\"keyboard_arrow_up\" size={18} />\n </button>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Next match\"\n data-testid=\"cs-find-next\"\n onMouseDown={(e) => {\n e.preventDefault();\n go(1);\n }}\n >\n <Icon name=\"keyboard_arrow_down\" size={18} />\n </button>\n <button\n type=\"button\"\n style={ICON_BTN_STYLE}\n aria-label=\"Close\"\n data-testid=\"cs-find-close\"\n onMouseDown={(e) => {\n e.preventDefault();\n setOpen(false);\n }}\n >\n <Icon name=\"close\" size={18} />\n </button>\n </div>\n\n {showReplace && (\n <div style={ROW_STYLE}>\n <input\n type=\"text\"\n aria-label=\"Replace with\"\n placeholder=\"Replace with\"\n data-testid=\"cs-replace-input\"\n style={INPUT_STYLE}\n value={replaceText}\n onChange={(e) => setReplaceText(e.target.value)}\n />\n <button\n type=\"button\"\n style={BTN_STYLE}\n data-testid=\"cs-replace-one\"\n onMouseDown={(e) => {\n e.preventDefault();\n replaceOne();\n }}\n >\n Replace\n </button>\n <button\n type=\"button\"\n style={BTN_STYLE}\n data-testid=\"cs-replace-all\"\n onMouseDown={(e) => {\n e.preventDefault();\n replaceAll();\n }}\n >\n All\n </button>\n </div>\n )}\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <label style={{ display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n data-testid=\"cs-find-match-case\"\n checked={matchCase}\n onChange={(e) => setMatchCase(e.target.checked)}\n />\n Match case\n </label>\n {!showReplace && (\n <button\n type=\"button\"\n style={{\n ...BTN_STYLE,\n marginLeft: 'auto',\n border: 'none',\n background: 'transparent',\n color: 'var(--cs-chrome-active-fg, #0e7490)',\n }}\n data-testid=\"cs-find-toggle-replace\"\n onMouseDown={(e) => {\n e.preventDefault();\n setShowReplace(true);\n }}\n >\n Replace…\n </button>\n )}\n </div>\n </div>\n );\n}\n\n/** Replace all occurrences of `query` in `text` (case-(in)sensitive). */\nfunction replaceInString(\n text: string,\n query: string,\n replacement: string,\n matchCase: boolean,\n): string {\n if (!query) return text;\n if (matchCase) return text.split(query).join(replacement);\n // Case-insensitive: walk and rebuild preserving non-matched casing.\n const lower = text.toLowerCase();\n const needle = query.toLowerCase();\n let out = '';\n let i = 0;\n while (i < text.length) {\n if (lower.startsWith(needle, i)) {\n out += replacement;\n i += needle.length;\n } else {\n out += text[i];\n i += 1;\n }\n }\n return out;\n}\n","/**\n * ChromeTop — the chrome ABOVE the grid (menu bar + toolbar + formula bar).\n * Lives in the `@casualoffice/sheets/chrome` entry, lazy-imported by\n * `<CasualSheets>` only when `chrome !== 'none'` so bare-grid consumers (the\n * default; the apps/web host renders chrome=\"none\" + its own shell) never bundle\n * the chrome JS.\n */\nimport { MenuBar } from './MenuBar';\nimport { Toolbar } from './Toolbar';\nimport { FormulaBar } from './FormulaBar';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\nexport function ChromeTop({ api }: { api: CasualSheetsAPI | null }) {\n return (\n <>\n <MenuBar api={api} />\n <Toolbar api={api} />\n <FormulaBar api={api} />\n </>\n );\n}\n","/**\n * ChromeBottom — the chrome BELOW the grid (sheet tabs + status bar) plus the\n * Find & Replace overlay. Lazy-imported with ChromeTop (see ChromeTop).\n */\nimport { SheetTabs } from './SheetTabs';\nimport { StatusBar } from './StatusBar';\nimport { FindReplace } from './FindReplace';\nimport type { CasualSheetsAPI } from '../sheets/api';\n\nexport function ChromeBottom({ api }: { api: CasualSheetsAPI | null }) {\n return (\n <>\n <SheetTabs api={api} />\n <StatusBar api={api} />\n <FindReplace api={api} />\n </>\n );\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","ROW_STYLE","BTN_STYLE","POPOVER_STYLE","import_react","import_jsx_runtime","ROW_STYLE","BTN_STYLE","POPOVER_STYLE","ITEM_STYLE","import_jsx_runtime","BTN_STYLE","import_react","import_core","import_react","import_core","import_jsx_runtime","onKeyDown","import_jsx_runtime","colToLetters","BAR_STYLE","import_react","import_core","import_jsx_runtime","BAR_STYLE","import_react","import_core","import_jsx_runtime","NUMBER_FORMAT_PATTERNS","BAR_STYLE","ITEM_STYLE","import_react","import_jsx_runtime","BAR_STYLE","MENU_STYLE","MENU_ITEM_STYLE","import_react","import_jsx_runtime","ROW_STYLE","INPUT_STYLE","BTN_STYLE","import_jsx_runtime","import_jsx_runtime"]}