@casualoffice/sheets 0.11.1 → 0.12.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 if (document.querySelector(`link[href*=\"${href.split('?')[0]}\"]`)) 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/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"]}