Style the canvas with a theme, CSS custom properties, cell styles, and borders.On this page
Sheetwrite paints cells on a canvas, so it has two style layers: the Theme (colors, fonts, and geometry for the renderer) and CellStyle (formatting for one cell or one column). A small stylesheet styles the host container and declares CSS custom properties.
Result: A1 is bold with a light #eef1f5 fill and a 2 px solid #111111 bottom border. The grid headers use #e8eef7 and #1f3a5f; Item is bold, and Qty cells are right-aligned.
The header row paints with the theme's headerBg and headerFg, and the "Item" header is bold. Cell A1 shows a bold "Total" on a light fill with a thick bottom border. The "Qty" column is right-aligned.
Theme
The Theme controls the canvas paint. Pass a Partial<Theme> as the theme option, or call grid.setTheme(partial) at runtime. Sheetwrite merges either one over the defaults.
The shipped styles.css declares different values for the search and highlight CSS custom properties (#fff47580, #fbbc04, #e8f0fe99). On a host that imports the stylesheet, those values win over DEFAULT_THEME, because of the resolution order.
Override the search-match colors at runtime with setTheme:
resolveThemeFromCss(host) reads CSS custom properties from the host's computed style into a partial theme. opts.theme wins last.
Method
Semantics
grid.setTheme(partial)
Imperative patch. Merges into the accumulated base theme and repaints. Use it for incremental changes.
grid.replaceTheme(partial | undefined)
Option-level replacement. Runs the construction-time resolution again with the new value. undefined restores the CSS-variable and default resolution. The framework adapters call it for their theme prop, so the prop is authoritative: when you remove the prop (or drop a field), the defaults come back; no stale merged values stay.
grid.getEffectiveTheme()
Returns the effective (post-zoom) theme that paints now.
grid.getTheme()
Returns a copy of the base theme, before zoom scaling.
After setTheme or replaceTheme changes the base theme, the Grid emits theme-change with a copy of the new theme. Use it to keep host controls in step with the canvas. The built-in toolbar uses it: its text and fill color swatches show the theme's fg and bg until the user picks a color.
Tailwind uses the same seam. Set --sheetwrite-* custom properties on the host with arbitrary-property utilities (for example class="[--sheetwrite-bg:#0b0b0c] [--sheetwrite-fg:#e7e7e7]") or with a @layer rule. Construction and replaceTheme(undefined) both read them from the computed style.
Import the stylesheet once. It styles the host container (the grid adds the .sheetwrite class to your host element) and declares the --sheetwrite-* defaults. It also ships a dark variant under [data-theme="dark"] or a .dark ancestor class (the Tailwind convention).
Import the stylesheet
import"@sheetwrite/core/styles.css";
resolveThemeFromCss maps these custom properties onto Theme fields:
CSS custom property
Theme field
--sheetwrite-bg
bg
--sheetwrite-fg
fg
--sheetwrite-grid-line
gridLine
--sheetwrite-header-bg
headerBg
--sheetwrite-header-fg
headerFg
--sheetwrite-selection
selection
--sheetwrite-selection-border
selectionBorder
--sheetwrite-row-height
rowHeight (parsed as a number)
--sheetwrite-search-match
searchMatch
--sheetwrite-search-active
searchActiveMatch
--sheetwrite-highlight
highlight
--sheetwrite-font
font (a / line-height segment is removed for the canvas)
headerHeight and rowHeaderWidth have no CSS variable. Set them with the theme option. An explicit --sheetwrite-* value on the .sheetwrite element itself wins over both dark selectors (the same element wins over an ancestor).
Widget and context-menu styling
The stylesheet also exposes widget variables, in addition to the canvas theme mapping:
CSS custom property
Widget use
Fallback
--sheetwrite-widget-border
Borders and separators for toolbar, find and menu chrome
--sheetwrite-grid-line
--sheetwrite-menu-hover
Context-menu item hover background
--sheetwrite-grid-line
--sheetwrite-menu-disabled-opacity
Disabled context-menu row opacity
0.5
The bundled menu uses these public classes:
Class
Element
.sheetwrite-context-menu
Container
.sheetwrite-context-menu-item
Row
.sheetwrite-context-menu-item-disabled
Disabled state
.sheetwrite-context-menu-shortcut
Shortcut hint
.sheetwrite-context-menu-sep
Separator
Scope overrides below the grid host. Do not replace positioning, visibility, or disabled behavior:
Context menu theme hooks
.sheetwrite {
--sheetwrite-widget-border: #334155;
--sheetwrite-menu-hover: #1e293b;
--sheetwrite-menu-disabled-opacity: 0.45;
}
.sheetwrite.sheetwrite-context-menu-item {
font-weight: 500;
}
The recommended runtime-theming pattern changes both layers together. Toggle data-theme on a wrapper so the CSS-variable chrome around the grid changes, and call setTheme so the canvas repaints.
CellStyle formats individual cells. It appears in three places:
Place
Effect
style on a set patch
Formatting for that one cell.
Column.cellStyle
A column-wide default that the renderer paints under every body cell of the column.
Column.headerStyle
The style of that column's header cell.
Column.cellStyle is a default, not a lock. A per-cell set style overrides the column default for that cell. A cell paints with its column's cellStyle until its own patch supplies styling.
const grid: Gridconstgrid:Gridconstgrid:GridThe imperative core grid this controller owns.API reference →Grid.setTheme(theme: Partial<Theme>): voidGrid.setTheme(theme: Partial<Theme>): voidGrid.setTheme(theme: Partial<Theme>): voidImperative patch: merge theme into the accumulated base theme.API reference →headerBg?: string | undefinedheaderBg?: string |undefinedheaderBg?: string |undefinedCSS color painted behind column and row headers.API reference →headerFg?: string | undefinedheaderFg?: string |undefinedheaderFg?: string |undefinedCSS color used for column letters and row numbers.API reference →Grid.applyTransaction(transaction: GridTransaction): ApplyTransactionResultGrid.applyTransaction(transaction: GridTransaction): ApplyTransactionResultGrid.applyTransaction(transaction: GridTransaction): ApplyTransactionResultApply arbitrary patches as one undoable Grid commit. No-op when read-only. Use Store.applyTransaction only for low-level writes that intentionally bypass Grid history and policy.Exampleimporttype { Grid } from"@sheetwrite/core";functionsetFirstCell(grid:Grid) {return grid.applyTransaction({ patches: [{ op: "set", addr: { sheet: grid.getActiveSheet(), row: 0, col: 0 },value: { kind: "literal", value: 42 } },] });}See alsoTransactionAPI reference →GridTransaction.patches: DocumentOp[]interfaceGridTransaction {patches:DocumentOp[];}interfaceGridTransaction {patches:DocumentOp[];}Ordered document operations submitted as one store commit.API reference →addr: CellAddresslet addr:CellAddresslet addr:CellAddressAPI reference →CellAddress.sheet: stringinterfaceCellAddress {sheet:string;}interfaceCellAddress {sheet:string;}Sheet identity used by the simple data-first adapter. Defaults to sheet1.API reference →CellAddress.row: numberinterfaceCellAddress {row:number;}interfaceCellAddress {row:number;}0-based row of the cell that holds the top-left corner.API reference →CellAddress.col: numberinterfaceCellAddress {col:number;}interfaceCellAddress {col:number;}0-based column of the cell that holds the top-left corner.API reference →value: CellValuelet value:CellValuelet value:CellValueAPI reference →value: CellScalarlet value:CellScalarlet value:CellScalarAPI reference →style?: CellStyle | undefinedstyle?: CellStyle |undefinedstyle?: CellStyle |undefinedOptional override merged over the deterministic blue/underline link style.API reference →CellStyle.bold?: boolean | undefinedinterfaceCellStyle {bold?:boolean|undefined;}interfaceCellStyle {bold?:boolean|undefined;}Uses the bold variant of the theme font.API reference →CellStyle.backgroundColor?: string | undefinedinterfaceCellStyle {backgroundColor?:string|undefined;}interfaceCellStyle {backgroundColor?:string|undefined;}hex color, e.g. "#ffffff"API reference →CellStyle.border?: CellBorders | undefinedinterfaceCellStyle {border?:CellBorders|undefined;}interfaceCellStyle {border?:CellBorders|undefined;}Border overrides for the cell's individual sides.API reference →CellBorders.bottom?: CellBorder | undefinedinterfaceCellBorders {bottom?:CellBorder|undefined;}interfaceCellBorders {bottom?:CellBorder|undefined;}CellBorder.color?: string | undefinedinterfaceCellBorder {color?:string|undefined;}interfaceCellBorder {color?:string|undefined;}hex color, e.g. "#111111"API reference →CellBorder.width?: number | undefinedinterfaceCellBorder {width?:number|undefined;}interfaceCellBorder {width?:number|undefined;}Unzoomed column width in CSS pixels.API reference →CellBorder.style?: "solid" | "dashed" | "dotted" | undefinedinterfaceCellBorder {style?:"solid"|"dashed"|"dotted"|undefined;}interfaceCellBorder {style?:|"solid"|"dashed"|"dotted"|undefined;}Optional override merged over the deterministic blue/underline link style.API reference →function createGrid(host: HTMLElement, opts: GridOptions): GridfunctioncreateGrid(host:HTMLElement,opts:GridOptions,):GridfunctioncreateGrid(host:HTMLElement,opts:GridOptions,):GridCreates and mounts an imperative Grid in the supplied host element.Exampleimport { createGrid, initSheetwrite } from"@sheetwrite/core";awaitinitSheetwrite();consthost= document.createElement("div");host.style.height ="400px";document.body.append(host);constgrid=createGrid(host, {workbook: {activeSheet: "sales",sheets: [{ id: "sales", name: "Sales", rowCount: 2,columns: [{ key: "amount", header: "Amount", type: "number", width: 120 }] }],},data: { rowCount: 2, columns: { amount: [12, 18] } },});grid.scrollToCell({ sheet: "sales", row: 1, col: 0 });// Call when the host view is removed.grid.destroy();See alsoGrid *See alsoGridOptionsAPI reference →function initSheetwrite(source?: BufferSource | URL | string | Request | WebAssembly.Module, engine?: SheetwriteEngine): Promise<void>functioninitSheetwrite(source?:BufferSource|URL|string|Request|WebAssembly.Module,engine?:SheetwriteEngine,):Promise<void>functioninitSheetwrite(source?:|BufferSource|URL|string|Request|WebAssembly.Module,engine?:SheetwriteEngine,):Promise<void>Load one WASM engine before createGrid. The default is @sheetwrite/wasm. Pass the @sheetwrite/formulas module as the second argument to select the full engine.Exampleimport { initSheetwrite } from"@sheetwrite/core";import*as formulas from"@sheetwrite/formulas";awaitinitSheetwrite(undefined, formulas);See also/docs/start/choose-an-engine/See alsocreateGridAPI reference →interface WorkbookinterfaceWorkbookinterfaceWorkbookLive workbook schema containing ordered sheets and the active sheet ID.API reference →const host: HTMLElement | nullconsthost:HTMLElement|nullconsthost:HTMLElement|nullvar document: Documentvar document:Documentvar document:Documentwindow.document returns a reference to the document contained in the window. MDN ReferenceAPI reference →ParentNode.querySelector<HTMLElement>(selectors: string): HTMLElement | null (+4 overloads)ParentNode.querySelector<HTMLElement>(selectors: string): HTMLElement |null (+4 overloads)ParentNode.querySelector<HTMLElement>(selectors: string): HTMLElement |null (+4 overloads)Returns the first element that is a descendant of node that matches selectors. MDN Referenceinterface HTMLElementinterfaceHTMLElementinterfaceHTMLElementThe HTMLElement interface represents any HTML element. MDN Referencevar Error: ErrorConstructor
new (message?: string, options?: ErrorOptions) => Error (+2 overloads)var Error:ErrorConstructornew (message?:string, options?:ErrorOptions) =>Error (+2 overloads)var Error:ErrorConstructornew (message?:string, options?:ErrorOptions) =>Error (+2 overloads)const host: HTMLElementconsthost:HTMLElementconsthost:HTMLElementElementCSSInlineStyle.style: CSSStyleDeclarationinterfaceElementCSSInlineStyle {style:CSSStyleDeclaration;}interfaceElementCSSInlineStyle {style:CSSStyleDeclaration;}MDN ReferenceAPI reference →CSSStyleDeclaration.height: stringinterfaceCSSStyleDeclaration {height:string;}interfaceCSSStyleDeclaration {height:string;}MDN ReferenceAPI reference →const workbook: Workbookconstworkbook:Workbookconstworkbook:WorkbookLive workbook schema adopted by the store and updated by document operations.API reference →Workbook.activeSheet: stringinterfaceWorkbook {activeSheet:string;}interfaceWorkbook {activeSheet:string;}Active sheet ID and initial tab presented when the grid is created.API reference →Workbook.sheets: Sheet[]interfaceWorkbook {sheets:Sheet[];}interfaceWorkbook {sheets:Sheet[];}Sheets in display/tab order.API reference →Sheet.id: stringinterfaceSheet {id:string;}interfaceSheet {id:string;}Stable identifier, unique within the workbook and used by every cell address.API reference →Sheet.name: stringinterfaceSheet {name:string;}interfaceSheet {name:string;}User-facing sheet name shown in tabs and workbook exports.API reference →Sheet.rowCount: numberinterfaceSheet {rowCount:number;}interfaceSheet {rowCount:number;}Row count for both in-memory and datasource-backed sheets.API reference →Sheet.columns: Column[]interfaceSheet {columns:Column[];}interfaceSheet {columns:Column[];}Ordered schema; array positions are the zero-based column coordinates.API reference →Column.key: stringinterfaceColumn {key:string;}interfaceColumn {key:string;}Non-empty key, unique within the sheet, used to map input and datasource values.API reference →Column.header: stringinterfaceColumn {header:string;}interfaceColumn {header:string;}Schema label used by table exports and data-grid presentation headers.API reference →Column.width: numberinterfaceColumn {width:number;}interfaceColumn {width:number;}Unzoomed column width in CSS pixels.API reference →Column.type: CellFormatinterfaceColumn {type:CellFormat;}interfaceColumn {type:CellFormat;}Controls cell input parsing and default value formatting for this column.API reference →Column.headerStyle?: CellStyle | undefinedinterfaceColumn {headerStyle?:CellStyle|undefined;}interfaceColumn {headerStyle?:CellStyle|undefined;}Overrides theme styling for the painted column header.API reference →Column.cellStyle?: CellStyle | undefinedinterfaceColumn {cellStyle?:CellStyle|undefined;}interfaceColumn {cellStyle?:CellStyle|undefined;}Base style merged beneath each cell's own style.API reference →CellStyle.align?: CellAlign | undefinedinterfaceCellStyle {align?:CellAlign|undefined;}interfaceCellStyle {align?:CellAlign|undefined;}Horizontal placement of cell text within its column.API reference →GridOptions.workbook: WorkbookinterfaceGridOptions {workbook:Workbook;}interfaceGridOptions {workbook:Workbook;}Live workbook schema adopted by the store and updated by document operations.API reference →GridOptions.theme?: Partial<Theme> | undefinedinterfaceGridOptions {theme?:Partial<Theme> |undefined;}interfaceGridOptions {theme?:Partial<Theme> |undefined;}Overrides merged over the default theme and host CSS custom properties.API reference →interface Theme
interface ThemeinterfaceThemeinterfaceThemeinterfaceThemeinterfaceThemeResolved canvas colors, typography, and geometry used for painting.API reference →Theme.font: stringinterfaceTheme {font:string;}interfaceTheme {font:string;}Canvas font shorthand used for unstyled cells.API reference →Theme.bg: stringinterfaceTheme {bg:string;}interfaceTheme {bg:string;}CSS color painted behind body cells.API reference →Theme.fg: stringinterfaceTheme {fg:string;}interfaceTheme {fg:string;}CSS color used for unstyled cell text.API reference →Theme.gridLine: stringinterfaceTheme {gridLine:string;}interfaceTheme {gridLine:string;}CSS color used for cell grid lines.API reference →Theme.headerBg: stringinterfaceTheme {headerBg:string;}interfaceTheme {headerBg:string;}CSS color painted behind column and row headers.API reference →Theme.headerFg: stringinterfaceTheme {headerFg:string;}interfaceTheme {headerFg:string;}CSS color used for column letters and row numbers.API reference →Theme.selection: stringinterfaceTheme {selection:string;}interfaceTheme {selection:string;}CSS color painted over the selected region.API reference →Theme.selectionBorder: stringinterfaceTheme {selectionBorder:string;}interfaceTheme {selectionBorder:string;}CSS color used for the active selection outline.API reference →Theme.rowHeight: numberinterfaceTheme {rowHeight:number;}interfaceTheme {rowHeight:number;}Default data-row height in unzoomed CSS pixels.API reference →Theme.headerHeight: numberinterfaceTheme {headerHeight:number;}interfaceTheme {headerHeight:number;}Column-header height in unzoomed CSS pixels.API reference →Theme.rowHeaderWidth: numberinterfaceTheme {rowHeaderWidth:number;}interfaceTheme {rowHeaderWidth:number;}Width of the left row-number gutter (0 hides it).API reference →Theme.searchMatch: stringinterfaceTheme {searchMatch:string;}interfaceTheme {searchMatch:string;}Fill behind a search match.API reference →Theme.searchActiveMatch: stringinterfaceTheme {searchActiveMatch:string;}interfaceTheme {searchActiveMatch:string;}Fill/outline for the active (current) search match.API reference →Theme.highlight: stringinterfaceTheme {highlight:string;}interfaceTheme {highlight:string;}Fill for cells highlighted via Grid.highlightCells.API reference →searchMatch?: string | undefinedsearchMatch?: string |undefinedsearchMatch?: string |undefinedFill behind a search match.API reference →searchActiveMatch?: string | undefinedsearchActiveMatch?: string |undefinedsearchActiveMatch?: string |undefinedFill/outline for the active (current) search match.API reference →const swatch: HTMLElementconstswatch:HTMLElementconstswatch:HTMLElementCSSStyleDeclaration.background: stringinterfaceCSSStyleDeclaration {background:string;}interfaceCSSStyleDeclaration {background:string;}MDN ReferenceGrid.getTheme(): ThemeGrid.getTheme(): ThemeGrid.getTheme(): ThemeResolved base theme, before zoom scaling. The returned object is a copy.API reference →Grid.on<"theme-change">(evt: "theme-change", fn: (e: {
theme: Theme;
}) => void): () => voidGrid.on<"theme-change">(evt: "theme-change", fn: (e: {theme:Theme;}) =>void): () =>voidGrid.on<"theme-change">(evt: "theme-change", fn: (e: {theme:Theme;}) =>void): () =>voidtheme: Themelet theme:Themelet theme:ThemeOverrides merged over the default theme and host CSS custom properties.API reference →type Partial<T> = { [P in keyof T]?: T[P] | undefined; }typePartial<T> = { [PinkeyofT]?:T[P] |undefined };typePartial<T> = {[PinkeyofT]?:T[P] |undefined;};Make all properties in T optionalinterface ThemeinterfaceThemeinterfaceThemeResolved canvas colors, typography, and geometry used for painting.API reference →bg?: string | undefinedbg?: string |undefinedbg?: string |undefinedCSS color painted behind body cells.API reference →fg?: string | undefinedfg?: string |undefinedfg?: string |undefinedCSS color used for unstyled cell text.API reference →gridLine?: string | undefinedgridLine?: string |undefinedgridLine?: string |undefinedCSS color used for cell grid lines.API reference →selection?: string | undefinedselection?: string |undefinedselection?: string |undefinedCSS color painted over the selected region.API reference →selectionBorder?: string | undefinedselectionBorder?: string |undefinedselectionBorder?: string |undefinedCSS color used for the active selection outline.API reference →const DARK: Partial<Theme>constDARK:Partial<Theme>constDARK:Partial<Theme>API reference →const darkBtn: HTMLButtonElementconstdarkBtn:HTMLButtonElementconstdarkBtn:HTMLButtonElementHTMLButtonElement.addEventListener<"click">(type: "click", listener: (this: HTMLButtonElement, ev: PointerEvent) => any, options?: boolean | AddEventListenerOptions): void (+1 overload)HTMLButtonElement.addEventListener<"click">(type: "click", listener: (this:HTMLButtonElement, ev:PointerEvent) => any, options?: boolean | AddEventListenerOptions): void (+1 overload)HTMLButtonElement.addEventListener<"click">(type: "click", listener: (this:HTMLButtonElement, ev:PointerEvent) => any, options?: boolean | AddEventListenerOptions): void (+1 overload)The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. MDN Reference The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. MDN Referenceconst stage: HTMLElementconststage:HTMLElementconststage:HTMLElementElement.setAttribute(qualifiedName: string, value: string): voidElement.setAttribute(qualifiedName: string, value: string): voidElement.setAttribute(qualifiedName: string, value: string): voidThe setAttribute() method of the Element interface sets the value of an attribute on the specified element. MDN Referenceinterface CellStyle
interface CellStyleinterfaceCellStyleinterfaceCellStyleinterfaceCellStyleinterfaceCellStyleSerializable formatting applied to a cell or used as a column default.API reference →CellStyle.italic?: boolean | undefinedinterfaceCellStyle {italic?:boolean|undefined;}interfaceCellStyle {italic?:boolean|undefined;}Uses the italic variant of the theme font.API reference →CellStyle.underline?: boolean | undefinedinterfaceCellStyle {underline?:boolean|undefined;}interfaceCellStyle {underline?:boolean|undefined;}Draws a line beneath each rendered text run.API reference →CellStyle.strikethrough?: boolean | undefinedinterfaceCellStyle {strikethrough?:boolean|undefined;}interfaceCellStyle {strikethrough?:boolean|undefined;}Draws a line through each rendered text run.API reference →CellStyle.fontSize?: number | undefinedinterfaceCellStyle {fontSize?:number|undefined;}interfaceCellStyle {fontSize?:number|undefined;}Font size in unzoomed CSS pixels; zoom is applied during painting.API reference →CellStyle.fontFamily?: string | undefinedinterfaceCellStyle {fontFamily?:string|undefined;}interfaceCellStyle {fontFamily?:string|undefined;}Font family name, e.g. "Calibri". The theme font family stays the fallback, so a font the browser lacks renders in the theme font. Letters, digits, spaces, ., _ and - only; at most 128 characters.API reference →CellStyle.color?: string | undefinedinterfaceCellStyle {color?:string|undefined;}interfaceCellStyle {color?:string|undefined;}hex color, e.g. "#111111"API reference →CellStyle.align?: "left" | "center" | "right" | undefinedinterfaceCellStyle {align?:"left"|"center"|"right"|undefined;}interfaceCellStyle {align?:|"left"|"center"|"right"|undefined;}Horizontal placement of cell text within its column.API reference →CellStyle.verticalAlign?: "top" | "middle" | "bottom" | undefinedinterfaceCellStyle {verticalAlign?:"top"|"middle"|"bottom"|undefined;}interfaceCellStyle {verticalAlign?:|"top"|"middle"|"bottom"|undefined;}Vertical placement of cell text; omitted keeps text centered.API reference →CellStyle.numberFormat?: string | undefinedinterfaceCellStyle {numberFormat?:string|undefined;}interfaceCellStyle {numberFormat?:string|undefined;}Excel number-format code for this cell, e.g. "0.00%". Overrides the column's numberFormat; at most 255 characters.API reference →CellStyle.wrap?: boolean | undefinedinterfaceCellStyle {wrap?:boolean|undefined;}interfaceCellStyle {wrap?:boolean|undefined;}Wraps text within the cell width; row auto-fit accounts for the resulting line count.API reference →interface CellBordersinterfaceCellBordersinterfaceCellBordersPer-side borders; all applies to any side not given its own border.API reference →Grid.store: StoreinterfaceGrid {store:Store;}interfaceGrid {store:Store;}Store.applyTransaction(tx: Transaction, options?: TransactionApplicationOptions): ApplyTransactionResultStore.applyTransaction(tx: Transaction, options?: TransactionApplicationOptions): ApplyTransactionResultStore.applyTransaction(tx: Transaction, options?: TransactionApplicationOptions): ApplyTransactionResultApply a low-level storage transaction. This bypasses Grid read-only checks and Grid undo/redo history. Use Grid.applyTransaction for normal host-driven edits. Queued and flushed at a barrier — never reentrant.API reference →Transaction.patches: DocumentOp[]interfaceTransaction {patches:DocumentOp[];}interfaceTransaction {patches:DocumentOp[];}Ordered document operations submitted as one store commit.API reference →interface CellBorders
interface CellBordersinterfaceCellBordersinterfaceCellBordersinterfaceCellBordersinterfaceCellBordersPer-side borders; all applies to any side not given its own border.API reference →CellBorders.all?: CellBorder | undefinedinterfaceCellBorders {all?:CellBorder|undefined;}interfaceCellBorders {all?:CellBorder|undefined;}interface CellBorderinterfaceCellBorderinterfaceCellBorderAPI reference →CellBorders.top?: CellBorder | undefinedinterfaceCellBorders {top?:CellBorder|undefined;}interfaceCellBorders {top?:CellBorder|undefined;}CellBorders.right?: CellBorder | undefinedinterfaceCellBorders {right?:CellBorder|undefined;}interfaceCellBorders {right?:CellBorder|undefined;}CellBorders.left?: CellBorder | undefinedinterfaceCellBorders {left?:CellBorder|undefined;}interfaceCellBorders {left?:CellBorder|undefined;}const style: CellStyleconststyle:CellStyleconststyle:CellStyleOptional override merged over the deterministic blue/underline link style.API reference →interface CellStyleinterfaceCellStyleinterfaceCellStyleSerializable formatting applied to a cell or used as a column default.API reference →