@einfach-excel/react-excel 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE +9 -0
- package/README.md +218 -2
- package/dist/Spreadsheet.d.ts +8 -0
- package/dist/THIRD_PARTY_NOTICES.txt +14020 -0
- package/dist/artifact-manifest.json +46 -0
- package/dist/assets/workbook.worker-x_d_i2qm.js +6 -0
- package/dist/i18n/runtime.d.ts +5 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +10 -0
- package/dist/page/WorkbookPresentationProvider.d.ts +16 -0
- package/dist/page/WorkbookRuntimeProvider.d.ts +13 -0
- package/dist/page/WorkbookStoreProvider.d.ts +11 -0
- package/dist/style.css +2 -0
- package/dist/workbook/shell/WorkbookView.d.ts +2 -0
- package/docs/package/README.md +101 -0
- package/docs/package/host-data.md +61 -0
- package/docs/package/release.md +59 -0
- package/package.json +88 -3
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { I18n } from '@lingui/core';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import { type UiLocale } from '../i18n/runtime';
|
|
4
|
+
export interface WorkbookPresentationProps {
|
|
5
|
+
readonly locale?: UiLocale;
|
|
6
|
+
readonly i18n?: I18n;
|
|
7
|
+
readonly renderer?: 'dom' | 'canvas';
|
|
8
|
+
}
|
|
9
|
+
export declare const WorkbookPresentationContext: import("react").Context<{
|
|
10
|
+
controlledLocale: boolean;
|
|
11
|
+
renderer: "dom" | "canvas";
|
|
12
|
+
}>;
|
|
13
|
+
/** 展现状态由 Lingui 实例持有,不新增业务 atom;显式 locale 的选择权归宿主。 */
|
|
14
|
+
export declare function WorkbookPresentationProvider({ children, locale, i18n, renderer }: WorkbookPresentationProps & {
|
|
15
|
+
readonly children: ReactNode;
|
|
16
|
+
}): ReactNode;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Store } from '@einfach/core';
|
|
2
|
+
import { type RustWorkbookDefinition } from '@einfach-excel/spreadsheet-ui-core';
|
|
3
|
+
import type { WorkerLike } from '@einfach-excel/spreadsheet-ui-core/rust-worker';
|
|
4
|
+
import { type ReactNode } from 'react';
|
|
5
|
+
import { type WorkbookPresentationProps } from './WorkbookPresentationProvider';
|
|
6
|
+
export interface WorkbookRuntimeProviderProps extends WorkbookPresentationProps {
|
|
7
|
+
readonly children: ReactNode;
|
|
8
|
+
readonly definition: RustWorkbookDefinition;
|
|
9
|
+
readonly store?: Store;
|
|
10
|
+
readonly workerFactory?: () => WorkerLike;
|
|
11
|
+
}
|
|
12
|
+
/** Mounts one UI-core-owned Rust workbook runtime in an isolated store. */
|
|
13
|
+
export declare function WorkbookRuntimeProvider({ children, definition, store, workerFactory, ...presentation }: WorkbookRuntimeProviderProps): ReactNode;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Store } from '@einfach/core';
|
|
2
|
+
import { type RustWorkbookConnection } from '@einfach-excel/spreadsheet-ui-core';
|
|
3
|
+
import { type ReactNode } from 'react';
|
|
4
|
+
import { type WorkbookPresentationProps } from './WorkbookPresentationProvider';
|
|
5
|
+
export interface WorkbookStoreProviderProps extends WorkbookPresentationProps {
|
|
6
|
+
readonly children: ReactNode;
|
|
7
|
+
readonly connection?: RustWorkbookConnection;
|
|
8
|
+
readonly store?: Store;
|
|
9
|
+
}
|
|
10
|
+
/** Supplies an explicitly configured workbook store to controlled React consumers. */
|
|
11
|
+
export declare function WorkbookStoreProvider({ children, connection, store, ...presentation }: WorkbookStoreProviderProps): ReactNode;
|
package/dist/style.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
:where(.einfach-spreadsheet) .formula-parameter-help{color:var(--text);overflow-wrap:anywhere;min-width:0;line-height:1.5}:where(.einfach-spreadsheet) .formula-parameter-help code{font-size:inherit;white-space:pre-wrap}:where(.einfach-spreadsheet) .formula-help-signature{color:var(--primary-strong);display:block}:where(.einfach-spreadsheet) .formula-help-signature strong{text-underline-offset:3px;text-decoration:underline}:where(.einfach-spreadsheet) .formula-parameter-help h3{margin:10px 0 4px;font-size:12px;font-weight:650}:where(.einfach-spreadsheet) .formula-help-summary{margin:5px 0}:where(.einfach-spreadsheet) .formula-help-group,:where(.einfach-spreadsheet) .formula-help-qualifier{color:var(--text);font-size:11px}:where(.einfach-spreadsheet) .formula-help-group{margin:4px 0}:where(.einfach-spreadsheet) .formula-help-parameters{margin:0}:where(.einfach-spreadsheet) .formula-help-parameters>div{border-top:1px solid var(--border);padding:5px 0}:where(.einfach-spreadsheet) .formula-help-parameters dt{font-weight:600}:where(.einfach-spreadsheet) .formula-help-parameters dd{color:var(--text);margin:2px 0 0;font-size:12px}:where(.einfach-spreadsheet) .formula-help-examples>code{margin:3px 0;display:block}:where(.einfach-spreadsheet) .formula-help-limitations{border-left:2px solid var(--border-strong);padding-left:8px}:where(.einfach-spreadsheet) .formula-help-limitations ul{margin:4px 0;padding-left:16px}:where(.einfach-spreadsheet) .formula-help-limitations li+li{margin-top:4px}:where(.einfach-spreadsheet) .formula-parameter-help.is-compact{max-height:min(350px,40vh);overflow-y:auto}:where(.einfach-spreadsheet) .is-compact .formula-help-summary,:where(.einfach-spreadsheet) .formula-help-active{margin:5px 0}:where(.einfach-spreadsheet) .is-compact h3{margin-top:6px;font-size:11px}@container einfach-spreadsheet (width<=480px){:where(.einfach-spreadsheet) .formula-help-parameters dt{flex-wrap:wrap;gap:2px 6px;display:flex}}:where(.einfach-spreadsheet) .formula-assist{z-index:40;border:1px solid var(--border-strong);background:var(--surface);width:340px;max-width:calc(100% - 16px);color:var(--text);border-radius:6px;font-size:12px;position:absolute;overflow:hidden;box-shadow:0 4px 14px #292b3520}:where(.einfach-spreadsheet) .formula-assist-heading{border-bottom:1px solid var(--border);background:var(--chrome);justify-content:space-between;padding:6px 9px;display:flex}:where(.einfach-spreadsheet) .formula-assist-heading span{color:#535867}:where(.einfach-spreadsheet) .formula-assist-signature{pointer-events:none}:where(.einfach-spreadsheet) .formula-function-list{max-height:min(240px,40vh);overflow-y:auto}:where(.einfach-spreadsheet) .formula-function-list button{background:var(--surface);width:100%;color:var(--text);text-align:left;cursor:pointer;font:inherit;border:0;grid-template-columns:74px minmax(0,1fr);gap:8px;padding:7px 9px;display:grid}:where(.einfach-spreadsheet) .formula-function-list button[aria-selected=true]{background:var(--primary-soft)}:where(.einfach-spreadsheet) .formula-function-list button:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .formula-function-list code{color:var(--primary-strong);font-size:12px}:where(.einfach-spreadsheet) .formula-function-list button>span{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}:where(.einfach-spreadsheet) .formula-signature{overflow-wrap:anywhere;padding:8px 10px;line-height:1.6}:where(.einfach-spreadsheet) .formula-signature strong{color:var(--primary-strong);text-decoration:underline}:where(.einfach-spreadsheet) .grid-surface .cell-filter-header{position:relative}:where(.einfach-spreadsheet) .cell-filter-header .cell-content{padding-right:22px}:where(.einfach-spreadsheet) .cell-filter-button{border:1px solid var(--border);background:var(--surface,white);width:20px;height:20px;color:var(--text-secondary,#5f6570);cursor:pointer;border-radius:3px;place-items:center;padding:0;display:grid;position:absolute;top:50%;right:2px;transform:translateY(-50%)}:where(.einfach-spreadsheet) .cell-filter-button[data-filtered=true]{color:var(--primary);border-color:currentColor}:where(.einfach-spreadsheet) .cell-filter-button:hover{background:var(--primary-light,#eef1ff)}:where(.einfach-spreadsheet) .cell-filter-button:focus-visible{outline:2px solid var(--primary);outline-offset:1px}:where(.einfach-spreadsheet) .cell-filter-button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .cell-data-bar-host{position:relative}:where(.einfach-spreadsheet) .cell-data-bar-host>.cell-content{z-index:1;position:relative}:where(.einfach-spreadsheet) .cell-data-bar{pointer-events:none;z-index:0;position:absolute;inset:3px 2px}:where(.einfach-spreadsheet) .cell-data-bar-fill{opacity:.6;position:absolute;top:0;bottom:0}:where(.einfach-spreadsheet) .cell-data-bar-axis{border-left:1px solid var(--muted);position:absolute;top:0;bottom:0}:where(.einfach-spreadsheet) .grid-surface td.cell-metadata-host{position:relative}:where(.einfach-spreadsheet) .cell-conditional-icon{z-index:1;text-align:center;pointer-events:none;width:14px;font-family:Arial,sans-serif;font-size:14px;font-weight:700;line-height:1;position:absolute;top:50%;left:4px;transform:translateY(-50%)}:where(.einfach-spreadsheet) .cell-content[data-conditional-icon-value=visible]{padding-left:15px}:where(.einfach-spreadsheet) .cell-content[data-conditional-icon-value=hidden]{opacity:0}:where(.einfach-spreadsheet) .cell-note-indicator,:where(.einfach-spreadsheet) .cell-comment-indicator{z-index:2;pointer-events:none;position:absolute;top:1px;right:1px}:where(.einfach-spreadsheet) .cell-note-indicator{border-top:6px solid #c93639;border-left:6px solid #0000;width:0;height:0}:where(.einfach-spreadsheet) .cell-comment-indicator{background:#6b4fbb;border-radius:50%;width:5px;height:5px}:where(.einfach-spreadsheet) .cell-note-indicator+.cell-comment-indicator{right:9px}:where(.einfach-spreadsheet) .merged-cell-layer{pointer-events:none;position:absolute;inset:0;overflow:hidden}:where(.einfach-spreadsheet) .grid-surface .merged-cell{pointer-events:auto;flex-direction:column;font-size:12px;display:flex;position:absolute}:where(.einfach-spreadsheet) .grid-surface .merged-cell:last-child{border-right:1px solid var(--gridline)}:where(.einfach-spreadsheet) .grid-surface[data-projection-retained=true] .merged-cell{pointer-events:none}:where(.einfach-spreadsheet) .formula-bar{border-bottom:1px solid var(--border);background:var(--chrome);flex:none;align-items:center;gap:7px;min-height:36px;padding:4px 8px;font-size:12px;display:flex}:where(.einfach-spreadsheet) .name-box-control{flex:none;display:flex;position:relative}:where(.einfach-spreadsheet) .name-box-feedback{z-index:10;color:#a52334;background:var(--surface);white-space:normal;border:1px solid #c72f42;border-radius:4px;width:max-content;max-width:min(300px,70vw);padding:6px 8px;font-size:12px;position:absolute;top:calc(100% + 4px);left:0}:where(.einfach-spreadsheet) .name-box{border:1px solid var(--border);width:86px;height:27px;color:var(--text);font:inherit;text-overflow:ellipsis;white-space:nowrap;background:#fff;border-radius:6px;outline:none;flex:none;padding:5px 9px;overflow:hidden}:where(.einfach-spreadsheet) .name-box:focus{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary-soft)}:where(.einfach-spreadsheet) .name-box-error{color:#a52334;border-color:#c72f42}:where(.einfach-spreadsheet) .formula-divider{display:none}:where(.einfach-spreadsheet) .insert-function{width:28px;height:27px;color:var(--primary);background:var(--primary-soft);border-radius:6px;flex:none;place-items:center;font-family:Georgia,serif;font-size:14px;font-style:italic;display:grid}:where(.einfach-spreadsheet) .formula-value{resize:none;border:1px solid var(--border);min-width:0;min-height:27px;max-height:90px;color:var(--text);font:inherit;text-overflow:ellipsis;white-space:pre-wrap;background:#fff;border-radius:6px;outline:none;flex:1;padding:5px 9px;overflow:auto}:where(.einfach-spreadsheet) .formula-value:focus{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary-soft)}:where(.einfach-spreadsheet) .formula-value:disabled{color:var(--muted);background:var(--chrome)}:where(.einfach-spreadsheet) .formula-edit-feedback{color:#8e2525;background:#fff5f5;border-bottom:1px solid #c93c3c;flex:none;margin:0;padding:6px 8px;font-size:12px}:where(.einfach-spreadsheet) .workbook-footer{border-top:1px solid var(--border);color:#505463;background:#fff;flex:none;justify-content:space-between;align-items:stretch;min-height:34px;font-size:11px;display:flex}:where(.einfach-spreadsheet) .sheet-tabs,:where(.einfach-spreadsheet) .status-items{align-items:center;min-width:0;display:flex}:where(.einfach-spreadsheet) .sheet-tabs button,:where(.einfach-spreadsheet) .status-items button{background:0 0;border:0;height:100%}:where(.einfach-spreadsheet) .sheet-nav,:where(.einfach-spreadsheet) .add-sheet{flex:none;width:30px;font-size:17px}:where(.einfach-spreadsheet) .sheet-nav:hover,:where(.einfach-spreadsheet) .add-sheet:hover,:where(.einfach-spreadsheet) .status-items button:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .sheet-tab{white-space:nowrap;border-radius:6px;flex:none;justify-content:center;align-items:center;gap:6px;min-width:108px;margin-block:4px;padding:0 14px;font-size:11px;font-weight:600;display:flex}:where(.einfach-spreadsheet) .workbook-sheet-controls{flex:1;min-width:0}:where(.einfach-spreadsheet) .sheet-tabs{min-height:34px}:where(.einfach-spreadsheet) .sheet-tab-list{align-self:stretch;min-width:0;display:flex;overflow-x:auto}:where(.einfach-spreadsheet) .sheet-tabs .rename-sheet{flex:none;width:30px;font-size:17px}:where(.einfach-spreadsheet) .sheet-tabs .sheet-action{flex:none;width:26px;font-size:17px}:where(.einfach-spreadsheet) .sheet-action:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .sheet-delete-dialog{box-sizing:border-box;border:1px solid var(--border);color:#242735;background:#fff;border-radius:8px;width:360px;max-width:calc(100vw - 32px);padding:20px;font-size:13px;box-shadow:0 12px 40px #20243433}:where(.einfach-spreadsheet) .sheet-delete-dialog::backdrop{background:#20243455}:where(.einfach-spreadsheet) .sheet-delete-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .sheet-delete-dialog p{overflow-wrap:anywhere;line-height:1.5}:where(.einfach-spreadsheet) .sheet-delete-actions{justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .sheet-delete-actions button{border:1px solid var(--border);border-radius:4px;padding:7px 10px}:where(.einfach-spreadsheet) .sheet-delete-actions .sheet-delete-confirm{color:#fff;background:#a12622;border-color:#a12622}:where(.einfach-spreadsheet) .sheet-delete-actions button:disabled{opacity:.5}:where(.einfach-spreadsheet) .sheet-tabs button:disabled{opacity:.45;cursor:default}:where(.einfach-spreadsheet) .sheet-rename{gap:6px;padding:5px 8px;display:flex}:where(.einfach-spreadsheet) .sheet-rename input{border:1px solid var(--primary);width:180px;min-width:0;padding:4px}:where(.einfach-spreadsheet) .sheet-rename button{border:1px solid var(--border);background:var(--control-hover);border-radius:4px}:where(.einfach-spreadsheet) .sheet-command-error{color:#a12622;overflow-wrap:anywhere;margin:0;padding:4px 8px}:where(.einfach-spreadsheet) .sheet-tab.active{color:var(--primary-strong);background:var(--primary-soft)}:where(.einfach-spreadsheet) .sheet-tab>span{background:var(--primary);border-radius:50%;width:6px;height:6px}:where(.einfach-spreadsheet) .status-items{gap:18px;padding-left:18px}:where(.einfach-spreadsheet) .clipboard-feedback{overflow-wrap:anywhere;max-width:320px;padding-block:5px}:where(.einfach-spreadsheet) .clipboard-feedback[data-error=true]{color:#a12622}:where(.einfach-spreadsheet) .selection-limit-note{box-sizing:border-box;border-bottom:1px solid var(--border);overflow-wrap:anywhere;flex:0 0 100%;min-width:0;padding:5px 8px}:where(.einfach-spreadsheet) .zoom-control{border-left:1px solid #ddd;align-items:center;gap:8px;height:100%;padding-left:8px;display:flex}:where(.einfach-spreadsheet) .zoom-control button{width:28px;padding:0;font-size:16px}:where(.einfach-spreadsheet) .zoom-track{background:#9d9d9d;width:54px;height:2px;display:block;position:relative}:where(.einfach-spreadsheet) .zoom-track>span{border:1px solid var(--primary);background:#fff;border-radius:50%;width:10px;height:10px;position:absolute;top:-4px;left:50%;transform:translate(-50%)}@container einfach-spreadsheet (width<=760px){:where(.einfach-spreadsheet) .workbook-footer{flex-wrap:wrap;min-height:30px}:where(.einfach-spreadsheet) .status-items{gap:8px;padding-left:8px}:where(.einfach-spreadsheet) .status-items>span,:where(.einfach-spreadsheet) .zoom-track,:where(.einfach-spreadsheet) .zoom-control>button{display:none}:where(.einfach-spreadsheet) .zoom-control{border-left:0;padding:0 10px}:where(.einfach-spreadsheet) .sheet-nav{display:none}:where(.einfach-spreadsheet) .sheet-tab{min-width:96px}}:where(.einfach-spreadsheet) .workbook-footer{flex-wrap:wrap}:where(.einfach-spreadsheet) .workbook-footer .workbook-sheet-controls{flex:1 0 min(100%,480px)}:where(.einfach-spreadsheet) .workbook-footer .status-items{box-sizing:border-box;max-width:100%}:where(.einfach-spreadsheet) .selection-statistics{scrollbar-width:none;font-variant-numeric:tabular-nums;flex-wrap:nowrap;flex:1;align-items:center;gap:4px 12px;min-width:0;height:28px;padding-block:6px;display:flex;overflow-x:auto}:where(.einfach-spreadsheet) .selection-statistics>span,:where(.einfach-spreadsheet) .selection-statistic{white-space:nowrap;flex:none}:where(.einfach-spreadsheet) .selection-status{flex-wrap:wrap;align-items:center;gap:0 6px;min-width:0;display:flex}:where(.einfach-spreadsheet) .status-items .selection-statistic{height:auto;color:inherit;font:inherit;text-align:left;padding:0}:where(.einfach-spreadsheet) .selection-statistic:focus-visible,:where(.einfach-spreadsheet) .statistics-settings-button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .status-items .statistics-settings-button{flex:none;width:26px;height:26px}:where(.einfach-spreadsheet) .statistic-copy-feedback{overflow-wrap:anywhere;flex-basis:100%;padding-bottom:4px}:where(.einfach-spreadsheet) .statistic-copy-feedback[role=alert]{color:#a12622}:where(.einfach-spreadsheet) .statistics-settings{box-sizing:border-box;border:1px solid var(--border);color:#242735;background:#fff;border-radius:8px;width:320px;max-width:calc(100vw - 32px);padding:20px;font-size:13px}:where(.einfach-spreadsheet) .statistics-settings::backdrop{background:#20243455}:where(.einfach-spreadsheet) .statistics-settings h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .statistics-settings p{line-height:1.5}:where(.einfach-spreadsheet) .statistics-settings label{align-items:center;gap:8px;padding-block:4px;display:flex}:where(.einfach-spreadsheet) .statistics-settings-actions{justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .status-items .statistics-settings-actions button{border:1px solid var(--border);border-radius:4px;height:auto;padding:7px 10px}:where(.einfach-spreadsheet) .selection-statistics-error{color:#a12622}@container einfach-spreadsheet (width<=1400px){:where(.einfach-spreadsheet) .workbook-footer{flex-wrap:wrap}:where(.einfach-spreadsheet) .workbook-footer .workbook-sheet-controls{flex:1 0 100%;max-width:100%}:where(.einfach-spreadsheet) .workbook-footer .status-items{box-sizing:border-box;border-top:1px solid var(--border);gap:8px;width:100%;padding-inline:8px}:where(.einfach-spreadsheet) .selection-status{flex:1}}@container einfach-spreadsheet (width<=760px){:where(.einfach-spreadsheet) .selection-statistics{grid-template-rows:repeat(3,18px);grid-template-columns:repeat(2,minmax(max-content,1fr));height:74px;display:grid}:where(.einfach-spreadsheet) .selection-statistics>span{grid-column:1/-1}}:where(.einfach-spreadsheet) .workbook-header{border-bottom:1px solid var(--border);min-height:48px;color:var(--text);background:#fff;align-items:center;gap:12px;padding:0 14px;display:flex}:where(.einfach-spreadsheet) .univer-mark{background:var(--primary);border-radius:8px;flex:none;grid-template-rows:repeat(2,7px);grid-template-columns:repeat(2,7px);place-content:center;gap:2px;width:30px;height:30px;display:grid;box-shadow:0 3px 8px #274fee38}:where(.einfach-spreadsheet) .univer-mark span{background:#fff;border-radius:2px}:where(.einfach-spreadsheet) .univer-mark span:nth-child(2),:where(.einfach-spreadsheet) .univer-mark span:nth-child(3){opacity:.68}:where(.einfach-spreadsheet) .workbook-identity{align-items:baseline;gap:9px;min-width:220px;display:flex}:where(.einfach-spreadsheet) .workbook-name{letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:650;overflow:hidden}:where(.einfach-spreadsheet) .workbook-subtitle{color:var(--muted);white-space:nowrap;font-size:11px}:where(.einfach-spreadsheet) .header-spacer{flex:1}:where(.einfach-spreadsheet) .language-select{border:1px solid var(--border);max-width:88px;min-height:28px;color:var(--text);font:inherit;background:#fff;border-radius:5px;flex:none;font-size:12px}:where(.einfach-spreadsheet) .save-state{color:var(--muted);align-items:center;gap:5px;font-size:11px;display:flex}:where(.einfach-spreadsheet) .row-count-badge{color:#535a74;background:#f7f8ff;border:1px solid #dfe3f7;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:600}@container einfach-spreadsheet (width<=640px){:where(.einfach-spreadsheet) .workbook-header{gap:9px;min-height:44px;padding:0 10px}:where(.einfach-spreadsheet) .univer-mark{width:28px;height:28px}:where(.einfach-spreadsheet) .workbook-identity{flex-direction:column;gap:0;min-width:0;overflow:hidden}:where(.einfach-spreadsheet) .workbook-subtitle,:where(.einfach-spreadsheet) .row-count-badge,:where(.einfach-spreadsheet) .save-state{display:none}}:where(.einfach-spreadsheet) .workbook-file-trigger{border:1px solid var(--border);color:var(--text);background:#fff;border-radius:6px;padding:6px 10px}:where(.einfach-spreadsheet) .workbook-file-dialog{box-sizing:border-box;border:1px solid var(--border);width:min(400px,100vw - 24px);max-height:calc(100dvh - 32px);color:var(--text);font:inherit;background:#fff;border-radius:10px;padding:20px;overflow:auto}:where(.einfach-spreadsheet) .workbook-file-dialog::backdrop{background:#1c233c3d}:where(.einfach-spreadsheet) .workbook-file-dialog h2{margin:0 0 10px;font-size:16px}:where(.einfach-spreadsheet) .workbook-file-dialog p{font-size:12px;line-height:1.5}:where(.einfach-spreadsheet) .workbook-file-dialog button,:where(.einfach-spreadsheet) .workbook-file-picker{box-sizing:border-box;border:1px solid var(--border);width:100%;color:var(--text);font:inherit;text-align:left;background:#fff;border-radius:6px;margin-top:12px;padding:9px 12px;font-size:12px;display:block}:where(.einfach-spreadsheet) .workbook-file-picker input{width:100%;font:inherit;margin-top:7px;display:block}:where(.einfach-spreadsheet) .workbook-file-dialog .workbook-file-close{text-align:center;width:auto;margin-left:auto}:where(.einfach-spreadsheet) .workbook-file-hint{color:var(--muted)}:where(.einfach-spreadsheet) .workbook-file-dialog [role=alert]{color:#b42318}:where(.einfach-spreadsheet) .workbook-file-dialog button:hover,:where(.einfach-spreadsheet) .workbook-file-trigger:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .workbook-file-dialog button:disabled,:where(.einfach-spreadsheet) .workbook-file-trigger:disabled{opacity:.5}:where(.einfach-spreadsheet) .workbook-file-dialog :focus-visible,:where(.einfach-spreadsheet) .workbook-file-trigger:focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .paste-special-dialog{box-sizing:border-box;border:1px solid var(--border);width:400px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 32px);color:var(--text);background:#fff;border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .paste-special-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .paste-special-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .paste-special-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .paste-special-dialog form{gap:10px;display:grid}:where(.einfach-spreadsheet) .paste-special-dialog select,:where(.einfach-spreadsheet) .paste-special-dialog button{border:1px solid var(--border);min-width:0;min-height:32px;font:inherit;color:inherit;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .paste-special-dialog button{background:var(--control-hover)}:where(.einfach-spreadsheet) .paste-special-dialog button:hover{background:var(--primary-soft)}:where(.einfach-spreadsheet) .paste-special-dialog button:disabled{opacity:.5}:where(.einfach-spreadsheet) .paste-special-checks{flex-wrap:wrap;gap:16px;display:flex}:where(.einfach-spreadsheet) .paste-special-checks label{align-items:center;gap:4px;min-height:32px;display:flex}:where(.einfach-spreadsheet) .paste-special-actions{justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .paste-special-error{color:#b42318}:where(.einfach-spreadsheet) .selection-size-dialog{box-sizing:border-box;border:1px solid var(--border);width:420px;max-width:calc(100vw - 32px);color:var(--text);background:#fff;border-radius:8px;padding:20px;font-size:13px}:where(.einfach-spreadsheet) .selection-size-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .selection-size-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .selection-size-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .selection-size-dialog form{grid-template-columns:1fr 80px;align-items:center;gap:8px;margin:16px 0;display:grid}:where(.einfach-spreadsheet) .selection-size-dialog form button{grid-column:1/-1}:where(.einfach-spreadsheet) .selection-size-dialog input{box-sizing:border-box;width:100%}:where(.einfach-spreadsheet) .selection-size-dialog input,:where(.einfach-spreadsheet) .selection-size-dialog button{border:1px solid var(--border);min-height:32px;font:inherit;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .selection-size-dialog button{background:var(--control-hover);color:inherit}:where(.einfach-spreadsheet) .selection-size-dialog button:hover{background:var(--primary-soft)}:where(.einfach-spreadsheet) .selection-size-dialog button:disabled{opacity:.5}:where(.einfach-spreadsheet) .size-actions{justify-content:space-between;gap:8px;display:flex}:where(.einfach-spreadsheet) .size-hint{color:#626777;font-size:12px}:where(.einfach-spreadsheet) .size-error{color:#b42318}:where(.einfach-spreadsheet) .history-dialog{box-sizing:border-box;border:1px solid var(--border);width:400px;max-width:calc(100vw - 32px);max-height:calc(100vh - 48px);color:var(--text);background:var(--surface);border-radius:8px;padding:20px;font-size:13px}:where(.einfach-spreadsheet) .history-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .history-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .history-dialog ol{max-height:300px;padding-left:24px;overflow-y:auto}:where(.einfach-spreadsheet) .history-dialog li{border-bottom:1px solid var(--border);padding:8px 0}:where(.einfach-spreadsheet) .history-dialog small{color:#626777;overflow-wrap:anywhere;margin-top:4px;display:block}:where(.einfach-spreadsheet) .history-undone{color:#626777}:where(.einfach-spreadsheet) .history-hint{color:#626777;line-height:1.5}:where(.einfach-spreadsheet) .history-error{color:#b42318;font-size:12px}:where(.einfach-spreadsheet) .history-close{border:1px solid var(--border);background:var(--control-hover);min-height:32px;font:inherit;border-radius:5px;padding:4px 12px}:where(.einfach-spreadsheet) .fill-series-dialog form{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}:where(.einfach-spreadsheet) .fill-series-dialog form>p,:where(.einfach-spreadsheet) .fill-series-dialog form>.size-actions,:where(.einfach-spreadsheet) .fill-series-dialog form>fieldset{grid-column:1/-1}:where(.einfach-spreadsheet) .fill-series-dialog select,:where(.einfach-spreadsheet) .fill-series-dialog textarea{border:1px solid var(--border);max-width:100%;min-height:34px;color:inherit;font:inherit;background:#fff;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .fill-series-dialog textarea{resize:vertical;min-height:100px}:where(.einfach-spreadsheet) .fill-series-dialog .size-actions{justify-content:flex-end}:where(.einfach-spreadsheet) .custom-fill-lists{border:1px solid var(--border);border-radius:5px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;min-width:0;margin:0;padding:10px;display:grid}:where(.einfach-spreadsheet) .custom-fill-lists legend{padding:0 4px;font-weight:600}:where(.einfach-spreadsheet) .custom-fill-lists label[for$=-items],:where(.einfach-spreadsheet) .custom-fill-lists textarea,:where(.einfach-spreadsheet) .custom-fill-lists .size-hint,:where(.einfach-spreadsheet) .custom-list-actions{grid-column:1/-1}:where(.einfach-spreadsheet) .custom-fill-lists textarea{min-height:76px}:where(.einfach-spreadsheet) .custom-fill-lists .size-hint{margin:0}:where(.einfach-spreadsheet) .custom-list-actions{flex-wrap:wrap;gap:6px;display:flex}:where(.einfach-spreadsheet) .sort-dialog{width:460px;max-height:calc(100dvh - 32px);overflow-y:auto}:where(.einfach-spreadsheet) .sort-dialog form{flex-direction:column;align-items:stretch;display:flex}:where(.einfach-spreadsheet) .sort-dialog .sort-header{align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .sort-options,:where(.einfach-spreadsheet) .sort-level-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .sort-options{justify-content:space-between;margin:8px 0}:where(.einfach-spreadsheet) .sort-options>label{align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .sort-level-actions{grid-column:1/-1}:where(.einfach-spreadsheet) .sort-dialog input[type=checkbox]{width:16px;min-height:16px;margin:0}:where(.einfach-spreadsheet) .sort-dialog fieldset{border:1px solid var(--border);border-radius:5px;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:8px;min-width:0;margin:4px 0;padding:12px;display:grid}:where(.einfach-spreadsheet) .sort-dialog legend{padding:0 4px;font-weight:600}:where(.einfach-spreadsheet) .sort-dialog select{border:1px solid var(--border);min-width:0;min-height:32px;color:inherit;font:inherit;background:#fff;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .sort-dialog :is(button,input,select):focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .sort-dialog .size-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .advanced-filter-groups{gap:10px;min-width:0;display:grid}:where(.einfach-spreadsheet) .advanced-filter-group{min-width:0}:where(.einfach-spreadsheet) .filter-dialog .advanced-filter-group>fieldset{border:1px solid var(--border);border-radius:6px;margin:0;padding:10px;display:block}:where(.einfach-spreadsheet) .advanced-filter-group>fieldset>legend{padding:0 5px;font-weight:600}:where(.einfach-spreadsheet) .advanced-filter-group-actions{flex-wrap:wrap;gap:8px;display:flex}:where(.einfach-spreadsheet) .advanced-filter-or{text-align:center;margin:0 0 8px;font-weight:600}@container einfach-spreadsheet (width<=480px){:where(.einfach-spreadsheet) .filter-dialog .advanced-filter-group>fieldset{padding:8px}:where(.einfach-spreadsheet) .advanced-filter-group-actions>button{flex:auto}}:where(.einfach-spreadsheet) .filter-dialog{width:460px;max-height:calc(100dvh - 32px);overflow-y:auto}:where(.einfach-spreadsheet) .filter-dialog form{flex-direction:column;align-items:stretch;display:flex}:where(.einfach-spreadsheet) .filter-dialog fieldset{border:1px solid var(--border);border-radius:5px;grid-template-columns:minmax(0,1fr) minmax(0,2fr);align-items:center;gap:8px;min-width:0;margin:4px 0;padding:12px;display:grid}:where(.einfach-spreadsheet) .filter-dialog legend{padding:0 4px;font-weight:600}:where(.einfach-spreadsheet) .filter-dialog :is(select,textarea){border:1px solid var(--border);min-width:0;min-height:32px;color:inherit;font:inherit;background:#fff;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .filter-dialog textarea{resize:vertical}:where(.einfach-spreadsheet) .filter-dialog .filter-number-bound{grid-column:1/-1;grid-template-columns:minmax(0,1fr) minmax(0,2fr);align-items:center;gap:8px;display:grid}:where(.einfach-spreadsheet) .filter-dialog .filter-case{grid-column:1/-1;align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .filter-dialog input[type=checkbox]{width:16px;min-height:16px;margin:0}:where(.einfach-spreadsheet) .filter-dialog :is(button,input,select,textarea):focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .filter-dialog .size-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .filter-feedback{text-overflow:ellipsis;white-space:nowrap;max-width:320px;color:var(--text);flex:none;font-size:12px;line-height:16px;overflow:hidden}:where(.einfach-spreadsheet) .filter-feedback[role=alert]{color:#a12622}:where(.einfach-spreadsheet) .filter-values,:where(.einfach-spreadsheet) .filter-values-hint{grid-column:1/-1;min-width:0}:where(.einfach-spreadsheet) .filter-values section{margin-top:8px}:where(.einfach-spreadsheet) .filter-values p{margin:8px 0}:where(.einfach-spreadsheet) .filter-values-search{gap:8px;display:flex}:where(.einfach-spreadsheet) .filter-values-search input{flex:1;min-width:0}:where(.einfach-spreadsheet) .filter-values-actions,:where(.einfach-spreadsheet) .filter-values-pages{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}:where(.einfach-spreadsheet) .filter-values-actions span,:where(.einfach-spreadsheet) .filter-values-pages span{font-variant-numeric:tabular-nums}:where(.einfach-spreadsheet) .filter-values-pages{justify-content:space-between}:where(.einfach-spreadsheet) .filter-values-list{border:1px solid var(--border);max-height:180px;margin-top:8px;overflow-y:auto}:where(.einfach-spreadsheet) .filter-values-list label{cursor:pointer;align-items:flex-start;gap:8px;padding:6px 8px;display:flex}:where(.einfach-spreadsheet) .filter-values-list label:hover,:where(.einfach-spreadsheet) .filter-values-list label:focus-within{background:var(--primary-soft)}:where(.einfach-spreadsheet) .filter-values-list input[type=checkbox]{flex:none;margin-top:2px}:where(.einfach-spreadsheet) .filter-values-label{white-space:pre-wrap;overflow-wrap:anywhere;flex:1;min-width:0}:where(.einfach-spreadsheet) .filter-values-count{font-variant-numeric:tabular-nums;flex:none}:where(.einfach-spreadsheet) .text-columns-dialog{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:660px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .text-columns-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .text-columns-dialog h2{margin:0;font-size:16px}:where(.einfach-spreadsheet) .text-columns-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .text-columns-dialog form{gap:14px;display:grid}:where(.einfach-spreadsheet) .text-columns-fields{grid-template-columns:1fr 1fr;gap:14px;display:grid}:where(.einfach-spreadsheet) .text-columns-dialog label{gap:6px;min-width:0;display:grid}:where(.einfach-spreadsheet) .text-columns-dialog input:not([type=checkbox]),:where(.einfach-spreadsheet) .text-columns-dialog select,:where(.einfach-spreadsheet) .text-columns-dialog button{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:100%;min-width:0;min-height:34px;color:inherit;font:inherit;border-radius:4px;padding:6px 8px}:where(.einfach-spreadsheet) .text-columns-dialog fieldset{border:1px solid var(--border);margin:0;padding:10px}:where(.einfach-spreadsheet) .text-columns-delimiters{flex-wrap:wrap;gap:8px 20px;display:flex}:where(.einfach-spreadsheet) .text-columns-delimiters label,:where(.einfach-spreadsheet) .text-columns-dialog .text-columns-check{align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .text-columns-hint{color:#596174;font-size:12px;line-height:1.5}:where(.einfach-spreadsheet) .text-columns-source{font-variant-numeric:tabular-nums}:where(.einfach-spreadsheet) .text-columns-type-summary{max-height:90px;margin-bottom:0;padding-left:20px;overflow:auto}:where(.einfach-spreadsheet) .text-columns-number-options summary{cursor:pointer;padding:6px 0}:where(.einfach-spreadsheet) .text-columns-number-options .text-columns-check{margin-top:12px}:where(.einfach-spreadsheet) .text-columns-preview{gap:10px;min-width:0;display:grid}:where(.einfach-spreadsheet) .text-columns-table-scroll{border:1px solid var(--border);max-height:180px;overflow:auto}:where(.einfach-spreadsheet) .text-columns-dialog table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}:where(.einfach-spreadsheet) .text-columns-dialog caption{text-align:left;padding:8px;font-weight:600}:where(.einfach-spreadsheet) .text-columns-dialog th,:where(.einfach-spreadsheet) .text-columns-dialog td{text-align:left;border:1px solid var(--border);overflow-wrap:anywhere;white-space:pre-wrap;min-width:70px;max-width:200px;padding:7px 10px}:where(.einfach-spreadsheet) .text-columns-dialog th{background:#f5f6fa;font-weight:500}:where(.einfach-spreadsheet) .text-columns-warning{background:#fff9ec;border:1px solid #c99b42;border-radius:4px;padding:10px}:where(.einfach-spreadsheet) .text-columns-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .text-columns-actions button{width:auto}:where(.einfach-spreadsheet) .text-columns-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .text-columns-dialog [role=alert]{color:#a12622;overflow-wrap:anywhere;margin:0}:where(.einfach-spreadsheet) .text-columns-dialog :disabled{opacity:.5}:where(.einfach-spreadsheet) .text-columns-dialog :focus-visible{outline:2px solid var(--primary);outline-offset:2px}@container einfach-spreadsheet (width<=480px){:where(.einfach-spreadsheet) .text-columns-dialog{padding:14px}:where(.einfach-spreadsheet) .text-columns-fields{grid-template-columns:1fr;gap:10px}}:where(.einfach-spreadsheet) .duplicates-dialog{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:640px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .duplicates-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .duplicates-dialog h2{margin:0;font-size:16px}:where(.einfach-spreadsheet) .duplicates-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .duplicates-dialog form{gap:14px;display:grid}:where(.einfach-spreadsheet) .duplicates-dialog label{gap:6px;min-width:0;display:grid}:where(.einfach-spreadsheet) .duplicates-dialog select,:where(.einfach-spreadsheet) .duplicates-dialog button{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);min-width:0;min-height:34px;color:inherit;font:inherit;border-radius:4px;padding:6px 8px}:where(.einfach-spreadsheet) .duplicates-dialog .duplicates-check{overflow-wrap:anywhere;align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .duplicates-dialog input[type=checkbox]{flex-shrink:0}:where(.einfach-spreadsheet) .duplicates-dialog fieldset{border:1px solid var(--border);min-width:0;margin:0;padding:10px}:where(.einfach-spreadsheet) .duplicates-columns{gap:8px;max-height:160px;margin-top:10px;display:grid;overflow:auto}:where(.einfach-spreadsheet) .duplicates-hint{color:#596174;font-size:12px}:where(.einfach-spreadsheet) .duplicates-table-scroll{border:1px solid var(--border);max-height:200px;overflow:auto}:where(.einfach-spreadsheet) .duplicates-dialog table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}:where(.einfach-spreadsheet) .duplicates-dialog caption{text-align:left;padding:8px;font-weight:600}:where(.einfach-spreadsheet) .duplicates-dialog th,:where(.einfach-spreadsheet) .duplicates-dialog td{text-align:left;border:1px solid var(--border);padding:7px 10px}:where(.einfach-spreadsheet) .duplicates-dialog td:last-child{overflow-wrap:anywhere;white-space:pre-wrap;max-width:220px}:where(.einfach-spreadsheet) .duplicates-dialog th{background:#f5f6fa;font-weight:500}:where(.einfach-spreadsheet) .duplicates-warning{background:#fff9ec;border:1px solid #c99b42;border-radius:4px;margin-top:12px;padding:10px}:where(.einfach-spreadsheet) .duplicates-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .duplicates-pagination{flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px;display:flex}:where(.einfach-spreadsheet) .duplicates-pagination span{flex:180px}:where(.einfach-spreadsheet) .duplicates-dialog .duplicates-row-link{color:var(--primary);background:0 0;border:0;padding:0 4px;text-decoration:underline}:where(.einfach-spreadsheet) .duplicates-dialog button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .duplicates-dialog [role=alert]{color:#a12622;overflow-wrap:anywhere;margin:0}:where(.einfach-spreadsheet) .duplicates-dialog :disabled{opacity:.5}:where(.einfach-spreadsheet) .duplicates-dialog :focus-visible{outline:2px solid var(--primary);outline-offset:1px}@container einfach-spreadsheet (width<=480px){:where(.einfach-spreadsheet) .duplicates-dialog{padding:14px}:where(.einfach-spreadsheet) .duplicates-pagination span{flex-basis:100%}}:where(.einfach-spreadsheet) .find-replace-dialog{box-sizing:border-box;border:1px solid var(--border);width:440px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);background:var(--surface);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .find-replace-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .find-replace-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .find-replace-dialog p{overflow-wrap:anywhere;line-height:1.5}:where(.einfach-spreadsheet) .find-replace-dialog form{gap:8px;display:grid}:where(.einfach-spreadsheet) .find-tabs{gap:8px;margin-bottom:16px;display:flex}:where(.einfach-spreadsheet) .find-replace-dialog button,:where(.einfach-spreadsheet) .find-replace-dialog select,:where(.einfach-spreadsheet) .find-replace-dialog input:not([type=checkbox]){box-sizing:border-box;border:1px solid var(--border);min-height:32px;font:inherit;color:inherit;border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .find-replace-dialog input:not([type=checkbox]),:where(.einfach-spreadsheet) .find-replace-dialog select{background:var(--surface);width:100%;min-width:0}:where(.einfach-spreadsheet) .find-replace-dialog button{background:var(--control-hover);cursor:pointer}:where(.einfach-spreadsheet) .find-replace-dialog button[aria-selected=true],:where(.einfach-spreadsheet) .find-replace-dialog button.find-primary{background:var(--primary-soft);color:var(--primary-strong)}:where(.einfach-spreadsheet) .find-replace-dialog button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .find-replace-dialog :focus-visible{outline:2px solid var(--primary-strong);outline-offset:2px}:where(.einfach-spreadsheet) .find-options{grid-template-columns:1fr 1.3fr;gap:12px;margin:8px 0;display:grid}:where(.einfach-spreadsheet) .find-options label{gap:6px;min-width:0;display:grid}:where(.einfach-spreadsheet) .find-checks,:where(.einfach-spreadsheet) .find-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .find-checks label{align-items:center;gap:4px;display:inline-flex}:where(.einfach-spreadsheet) .find-actions{justify-content:flex-end;margin-top:8px}:where(.einfach-spreadsheet) .find-error{color:#b42318}:where(.einfach-spreadsheet) .find-hint{color:#626777;margin-bottom:0;font-size:12px}:where(.einfach-spreadsheet) .find-results-scroll{border:1px solid var(--border);border-radius:5px;max-height:180px;overflow:auto}:where(.einfach-spreadsheet) .find-results table{border-collapse:collapse;width:100%}:where(.einfach-spreadsheet) .find-results th,:where(.einfach-spreadsheet) .find-results td{text-align:left;padding:4px 6px}:where(.einfach-spreadsheet) .find-results th{background:var(--surface);z-index:1;position:sticky;top:0}:where(.einfach-spreadsheet) .find-results tr[aria-selected=true]{background:var(--primary-soft)}:where(.einfach-spreadsheet) .find-results td button{text-align:left;overflow-wrap:anywhere}@container einfach-spreadsheet (width<=450px){:where(.einfach-spreadsheet) .find-options{grid-template-columns:1fr}}:where(.einfach-spreadsheet) .go-to-dialog{box-sizing:border-box;border:1px solid var(--border);width:400px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);background:var(--surface);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .go-to-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .go-to-dialog h2{margin:0 0 12px;font-size:16px}:where(.einfach-spreadsheet) .go-to-dialog h3{margin:8px 0;font-size:13px}:where(.einfach-spreadsheet) .go-to-dialog form{gap:8px;display:grid}:where(.einfach-spreadsheet) .go-to-dialog button,:where(.einfach-spreadsheet) .go-to-dialog input{box-sizing:border-box;border:1px solid var(--border);min-width:0;min-height:32px;font:inherit;color:inherit;background:var(--surface);border-radius:5px;padding:4px 8px}:where(.einfach-spreadsheet) .go-to-dialog input{width:100%}:where(.einfach-spreadsheet) .go-to-dialog button{cursor:pointer;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .go-to-dialog button:disabled{cursor:default;opacity:.5}:where(.einfach-spreadsheet) .go-to-dialog :focus-visible{outline:2px solid var(--primary-strong);outline-offset:2px}:where(.einfach-spreadsheet) .go-to-hint{color:#626777;overflow-wrap:anywhere;margin:0;line-height:1.5}:where(.einfach-spreadsheet) .go-to-recent{max-height:200px;margin:0;padding:3px;list-style:none;overflow:auto}:where(.einfach-spreadsheet) .go-to-recent button{text-align:left;width:100%;margin-bottom:4px}:where(.einfach-spreadsheet) .go-to-recent button:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .go-to-actions{justify-content:flex-end;gap:8px;margin-top:8px;display:flex}:where(.einfach-spreadsheet) .go-to-dialog .go-to-primary{color:var(--primary-strong);background:var(--primary-soft)}:where(.einfach-spreadsheet) .go-to-error{color:#b42318;overflow-wrap:anywhere;margin:0}:where(.einfach-spreadsheet) .go-to-special-options{gap:8px;margin:16px 0;display:grid}:where(.einfach-spreadsheet) .go-to-special-options button{text-align:left}:where(.einfach-spreadsheet) .formula-arguments-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:560px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .formula-arguments-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .formula-arguments-panel h2{overflow-wrap:anywhere;margin:0 0 10px;font-size:17px}:where(.einfach-spreadsheet) .formula-arguments-panel form{gap:12px;min-width:0;display:grid}:where(.einfach-spreadsheet) .formula-arguments-hint{color:var(--muted-text,#596579);font-size:12px;line-height:1.5}:where(.einfach-spreadsheet) .formula-argument-field{min-width:0}:where(.einfach-spreadsheet) .formula-argument-field label{flex-wrap:wrap;gap:4px 10px;margin-bottom:5px;display:flex}:where(.einfach-spreadsheet) .formula-argument-field label code{overflow-wrap:anywhere}:where(.einfach-spreadsheet) .formula-argument-field label span{color:var(--muted-text,#596579);font-size:12px}:where(.einfach-spreadsheet) .formula-argument-field p{overflow-wrap:anywhere;margin:4px 0 0;font-size:12px;line-height:1.5}:where(.einfach-spreadsheet) .formula-arguments-panel button,:where(.einfach-spreadsheet) .formula-arguments-panel input{box-sizing:border-box;min-width:0;min-height:36px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:7px 9px}:where(.einfach-spreadsheet) .formula-arguments-panel input{width:100%;font-family:ui-monospace,monospace}:where(.einfach-spreadsheet) .formula-arguments-panel input[aria-invalid=true]{border-color:#a12622}:where(.einfach-spreadsheet) .formula-arguments-panel fieldset{border:1px solid var(--border);min-width:0;margin:0;padding:10px}:where(.einfach-spreadsheet) .formula-argument-group{border-radius:5px;gap:10px;display:grid}:where(.einfach-spreadsheet) .formula-argument-group legend{color:var(--muted-text,#596579);padding:0 5px;font-size:12px}:where(.einfach-spreadsheet) .formula-argument-group>button,:where(.einfach-spreadsheet) .formula-arguments-add{justify-self:start}:where(.einfach-spreadsheet) .formula-arguments-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .formula-arguments-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .formula-arguments-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .formula-arguments-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .formula-arguments-panel [role=alert]{color:#a12622;overflow-wrap:anywhere;margin:0}:where(.einfach-spreadsheet) .formula-arguments-panel .formula-parameter-help.is-compact{max-height:160px}@container einfach-spreadsheet (width<=480px){:where(.einfach-spreadsheet) .formula-arguments-panel{padding:16px}:where(.einfach-spreadsheet) .formula-arguments-actions>button{flex:110px}}:where(.einfach-spreadsheet) .insert-function-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:440px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .insert-function-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .insert-function-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .insert-function-panel p{line-height:1.5}:where(.einfach-spreadsheet) .insert-function-panel form{gap:8px;display:grid}:where(.einfach-spreadsheet) .insert-function-panel button,:where(.einfach-spreadsheet) .insert-function-panel input,:where(.einfach-spreadsheet) .insert-function-panel select{box-sizing:border-box;min-width:0;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .insert-function-panel select[size]{padding:0;font-family:ui-monospace,monospace}:where(.einfach-spreadsheet) .insert-function-panel option{padding:5px 8px}:where(.einfach-spreadsheet) .insert-function-description{overflow-wrap:anywhere;min-height:62px}:where(.einfach-spreadsheet) .insert-function-description code{margin-top:8px;display:block}:where(.einfach-spreadsheet) .insert-function-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .insert-function-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .insert-function-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .insert-function-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .insert-function-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .named-range-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:520px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .named-range-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .named-range-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .named-range-panel h3{margin:0;font-size:13px}:where(.einfach-spreadsheet) .named-range-panel p{line-height:1.5}:where(.einfach-spreadsheet) .named-range-panel button,:where(.einfach-spreadsheet) .named-range-panel input,:where(.einfach-spreadsheet) .named-range-panel select{box-sizing:border-box;min-width:0;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .named-range-list{border-block:1px solid var(--border);max-height:200px;overflow:auto}:where(.einfach-spreadsheet) .named-range-list>button{text-align:left;overflow-wrap:anywhere;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;width:100%;display:grid}:where(.einfach-spreadsheet) .named-range-list>button:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .named-range-list>button[aria-pressed=true]{background:var(--primary-soft);color:var(--primary)}:where(.einfach-spreadsheet) .named-range-list span{font-family:ui-monospace,monospace;font-size:12px}:where(.einfach-spreadsheet) .named-range-heading{justify-content:space-between;align-items:center;margin:16px 0;display:flex}:where(.einfach-spreadsheet) .named-range-panel fieldset{border:0;grid-template-columns:100px minmax(0,1fr);align-items:center;gap:10px;min-width:0;margin:0;padding:0;display:grid}:where(.einfach-spreadsheet) .named-range-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .named-range-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .named-range-actions button:first-child{margin-right:auto}:where(.einfach-spreadsheet) .named-range-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .named-range-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .named-range-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}@container einfach-spreadsheet (width<=420px){:where(.einfach-spreadsheet) .named-range-panel fieldset{grid-template-columns:1fr;gap:6px}:where(.einfach-spreadsheet) .named-range-list>button{grid-template-columns:minmax(0,1fr);gap:4px}}:where(.einfach-spreadsheet) .table-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:500px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .table-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .table-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .table-panel h3{margin:0;font-size:13px}:where(.einfach-spreadsheet) .table-panel p{line-height:1.5}:where(.einfach-spreadsheet) .table-panel button,:where(.einfach-spreadsheet) .table-panel input,:where(.einfach-spreadsheet) .table-panel select{box-sizing:border-box;min-width:0;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .table-panel-list{border-block:1px solid var(--border);max-height:180px;overflow:auto}:where(.einfach-spreadsheet) .table-panel-list>button{text-align:left;overflow-wrap:anywhere;border:0;border-radius:0;justify-content:space-between;gap:12px;width:100%;display:flex}:where(.einfach-spreadsheet) .table-panel-list>button:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .table-panel-list>button[aria-pressed=true]{background:var(--primary-soft);color:var(--primary)}:where(.einfach-spreadsheet) .table-panel-list span{font-family:ui-monospace,monospace;font-size:12px}:where(.einfach-spreadsheet) .table-panel-heading{justify-content:space-between;align-items:center;margin:16px 0;display:flex}:where(.einfach-spreadsheet) .table-panel fieldset{border:0;grid-template-columns:100px minmax(0,1fr);align-items:center;gap:10px;min-width:0;margin:0;padding:0;display:grid}:where(.einfach-spreadsheet) .table-panel-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .table-panel-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .table-panel-actions button:first-child{margin-right:auto}:where(.einfach-spreadsheet) .table-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .table-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .table-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .table-panel-totals{border-top:1px solid var(--border);margin-top:16px}:where(.einfach-spreadsheet) .table-panel-columns{border-top:1px solid var(--border);margin-top:16px;padding-top:16px}:where(.einfach-spreadsheet) .table-panel-totals select{width:100%}:where(.einfach-spreadsheet) .table-panel-totals .table-panel-actions button{margin-left:auto;margin-right:0}:where(.einfach-spreadsheet) .table-panel-appearance{border-top:1px solid var(--border);margin-top:16px;padding-top:16px}:where(.einfach-spreadsheet) .table-style-option{grid-column:1/-1;align-items:center;gap:8px;min-height:34px;display:flex}:where(.einfach-spreadsheet) .table-style-option input{width:16px;min-height:16px;accent-color:var(--primary);flex:none;margin:0}@container einfach-spreadsheet (width<=420px){:where(.einfach-spreadsheet) .table-panel fieldset{grid-template-columns:1fr;gap:6px}:where(.einfach-spreadsheet) .table-panel-list>button{flex-wrap:wrap;gap:4px}}:where(.einfach-spreadsheet) .conditional-format-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:460px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .conditional-format-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .conditional-format-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .conditional-format-panel h3{margin:16px 0 8px;font-size:13px}:where(.einfach-spreadsheet) .conditional-format-panel p{line-height:1.5}:where(.einfach-spreadsheet) .conditional-format-panel fieldset p{color:var(--muted);grid-column:1/-1;margin:0}:where(.einfach-spreadsheet) .conditional-format-panel ul{overscroll-behavior:contain;max-height:200px;margin:0 0 8px;padding:0;list-style:none;overflow:auto}:where(.einfach-spreadsheet) .conditional-format-panel li{gap:6px;margin:10px 0;display:grid}:where(.einfach-spreadsheet) .conditional-format-panel li span{overflow-wrap:anywhere;flex:1;min-width:0}:where(.einfach-spreadsheet) .conditional-rule-actions{flex-wrap:wrap;gap:6px;display:flex}:where(.einfach-spreadsheet) .conditional-format-panel fieldset{border:0;grid-template-columns:minmax(90px,1fr) minmax(0,180px);align-items:center;gap:10px;min-width:0;margin:0;padding:0;display:grid}:where(.einfach-spreadsheet) .conditional-format-panel input,:where(.einfach-spreadsheet) .conditional-format-panel select,:where(.einfach-spreadsheet) .conditional-format-panel button{box-sizing:border-box;min-width:0;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .conditional-format-panel input[type=color]{width:100%;padding:3px}:where(.einfach-spreadsheet) .conditional-format-panel input[type=checkbox]{justify-self:start;width:18px;min-height:18px}:where(.einfach-spreadsheet) .conditional-format-actions{background:var(--surface);border-top:1px solid var(--border);justify-content:flex-end;gap:8px;margin-top:16px;padding:8px 0;display:flex;position:sticky;bottom:0}:where(.einfach-spreadsheet) .conditional-format-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .conditional-format-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .conditional-format-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .conditional-format-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .data-validation-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:440px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .data-validation-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .data-validation-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .data-validation-panel p{line-height:1.5}:where(.einfach-spreadsheet) .data-validation-panel fieldset{border:0;grid-template-columns:minmax(100px,1fr) minmax(0,180px);align-items:center;gap:10px;min-width:0;margin:0;padding:0;display:grid}:where(.einfach-spreadsheet) .data-validation-panel fieldset p{grid-column:1/-1}:where(.einfach-spreadsheet) .data-validation-panel input,:where(.einfach-spreadsheet) .data-validation-panel select,:where(.einfach-spreadsheet) .data-validation-panel textarea,:where(.einfach-spreadsheet) .data-validation-panel button{box-sizing:border-box;min-width:0;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .data-validation-panel textarea{resize:vertical}:where(.einfach-spreadsheet) .data-validation-panel input[type=checkbox]{justify-self:start;min-height:18px}:where(.einfach-spreadsheet) .data-validation-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .data-validation-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .data-validation-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .data-validation-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .data-validation-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}@container einfach-spreadsheet (width<=420px){:where(.einfach-spreadsheet) .data-validation-panel fieldset{grid-template-columns:1fr;gap:6px}}:where(.einfach-spreadsheet) .color-tool{flex:none;display:inline-flex}:where(.einfach-spreadsheet) .color-tool .color-apply{border-radius:6px 0 0 6px}:where(.einfach-spreadsheet) .color-tool .color-apply span{border-bottom:3px solid var(--swatch);line-height:17px}:where(.einfach-spreadsheet) .color-tool .color-open{border-radius:0 6px 6px 0;width:16px;font-size:10px}:where(.einfach-spreadsheet) .color-palette{box-sizing:border-box;border:1px solid var(--border);width:264px;max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);color:var(--text);background:#fff;border-radius:8px;margin:0;padding:12px;font-size:12px;position:fixed;overflow:auto;box-shadow:0 6px 20px #19234629}:where(.einfach-spreadsheet) .color-palette::backdrop{background:0 0}:where(.einfach-spreadsheet) .color-palette header{justify-content:space-between;align-items:center;display:flex}:where(.einfach-spreadsheet) .color-palette h2{margin:0;font-size:13px;font-weight:600}:where(.einfach-spreadsheet) .color-palette button,:where(.einfach-spreadsheet) .color-palette input{font:inherit;color:inherit}:where(.einfach-spreadsheet) .color-palette button{cursor:pointer}:where(.einfach-spreadsheet) .color-palette button:disabled,:where(.einfach-spreadsheet) .color-palette input:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .color-palette header button{background:0 0;border:0;width:28px;height:28px}:where(.einfach-spreadsheet) .color-palette .color-reset{border:1px solid var(--border);text-align:left;background:#fff;border-radius:4px;width:100%;margin:8px 0 12px;padding:7px;display:block}:where(.einfach-spreadsheet) .color-palette .color-reset:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .color-swatches{grid-template-columns:repeat(8,1fr);gap:5px;display:grid}:where(.einfach-spreadsheet) .color-swatches button{border:1px solid #0000001f;border-radius:3px;height:25px;padding:0}:where(.einfach-spreadsheet) .color-swatches button[aria-pressed=true]{outline:2px solid var(--primary);outline-offset:1px}:where(.einfach-spreadsheet) .color-swatches span{color:#fff;text-shadow:0 1px 2px #000,0 -1px 2px #000}:where(.einfach-spreadsheet) .color-palette :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .color-palette form{border-top:1px solid var(--border);margin-top:12px;padding-top:12px}:where(.einfach-spreadsheet) .color-palette label{margin-bottom:6px;display:block}:where(.einfach-spreadsheet) .color-custom{gap:6px;display:flex}:where(.einfach-spreadsheet) .color-custom input,:where(.einfach-spreadsheet) .color-custom button{box-sizing:border-box;border:1px solid var(--border);border-radius:4px;min-width:0;height:30px}:where(.einfach-spreadsheet) .color-custom input[type=color]{background:#fff;flex:none;width:30px;padding:2px}:where(.einfach-spreadsheet) .color-custom input[type=text]{flex:1;width:80px;padding:4px 6px;font-family:monospace}:where(.einfach-spreadsheet) .color-custom button{background:var(--primary);color:#fff;padding:4px 10px}:where(.einfach-spreadsheet) .color-palette p{margin:10px 0 0;line-height:1.4}:where(.einfach-spreadsheet) .color-palette p[role=alert]{color:#a12622}:where(.einfach-spreadsheet) .font-size-dialog{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:300px;max-width:calc(100vw - 24px);color:var(--text);border-radius:8px;padding:16px;font-size:13px}:where(.einfach-spreadsheet) .font-size-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .font-size-dialog h2{margin:0;font-size:16px}:where(.einfach-spreadsheet) .font-size-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .font-size-dialog form{grid-template-columns:1fr 90px;align-items:center;gap:12px;display:grid}:where(.einfach-spreadsheet) .font-size-dialog input,:where(.einfach-spreadsheet) .font-size-dialog button{box-sizing:border-box;border:1px solid var(--border);min-width:0;min-height:32px;font:inherit;color:inherit;background:var(--surface);border-radius:4px;padding:4px 8px}:where(.einfach-spreadsheet) .font-size-actions{grid-column:1/-1;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .font-size-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .font-size-dialog :disabled{opacity:.5}:where(.einfach-spreadsheet) .font-size-dialog :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .font-size-dialog [role=alert]{color:#a12622}:where(.einfach-spreadsheet) .number-format-dialog{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:360px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:16px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .number-format-dialog::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .number-format-dialog h2{margin:0;font-size:16px}:where(.einfach-spreadsheet) .number-format-dialog p{line-height:1.5}:where(.einfach-spreadsheet) .number-format-dialog form{grid-template-columns:1fr 140px;align-items:center;gap:12px;display:grid}:where(.einfach-spreadsheet) .number-format-dialog input:not([type=checkbox]),:where(.einfach-spreadsheet) .number-format-dialog select,:where(.einfach-spreadsheet) .number-format-dialog button{box-sizing:border-box;border:1px solid var(--border);width:100%;min-width:0;min-height:32px;font:inherit;color:inherit;background:var(--surface);border-radius:4px;padding:4px 8px}:where(.einfach-spreadsheet) .number-format-check{grid-column:1/-1;align-items:center;gap:8px;display:flex}:where(.einfach-spreadsheet) .number-format-hint{grid-column:1/-1;margin:0}:where(.einfach-spreadsheet) .number-format-wide{grid-column:1/-1}:where(.einfach-spreadsheet) .number-format-preview{grid-column:1/-1;min-width:0}:where(.einfach-spreadsheet) .number-format-preview>span{margin-bottom:6px;display:block}:where(.einfach-spreadsheet) .number-format-preview [role=status]{box-sizing:border-box;border:1px solid var(--border);white-space:pre-wrap;overflow-wrap:anywhere;font-variant-numeric:tabular-nums;border-radius:4px;min-height:40px;max-height:96px;padding:8px;overflow:auto}:where(.einfach-spreadsheet) .number-format-actions{grid-column:1/-1;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .number-format-actions button{width:auto}:where(.einfach-spreadsheet) .number-format-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .number-format-dialog :disabled{opacity:.5}:where(.einfach-spreadsheet) .number-format-dialog :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .number-format-dialog [role=alert]{color:#a12622;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .border-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:360px;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);color:var(--text);border-radius:8px;padding:16px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .border-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .border-panel h2{margin:0;font-size:16px}:where(.einfach-spreadsheet) .border-panel p{line-height:1.5}:where(.einfach-spreadsheet) .border-panel form{grid-template-columns:1fr 160px;align-items:center;gap:12px;display:grid}:where(.einfach-spreadsheet) .border-panel input,:where(.einfach-spreadsheet) .border-panel select,:where(.einfach-spreadsheet) .border-panel button{box-sizing:border-box;border:1px solid var(--border);min-width:0;min-height:32px;font:inherit;color:inherit;background:var(--surface);border-radius:4px;padding:4px 8px}:where(.einfach-spreadsheet) .border-panel fieldset{border:0;grid-column:1/-1;min-width:0;margin:0;padding:0}:where(.einfach-spreadsheet) .border-panel legend{margin-bottom:8px;padding:0}:where(.einfach-spreadsheet) .border-swatches{grid-template-columns:repeat(8,1fr);gap:6px;display:grid}:where(.einfach-spreadsheet) .border-swatches button{width:100%;padding:0}:where(.einfach-spreadsheet) .border-swatches [aria-pressed=true]{outline:2px solid var(--primary);outline-offset:1px}:where(.einfach-spreadsheet) .border-custom-color{grid-template-columns:36px auto minmax(0,1fr);align-items:center;gap:8px;margin-top:12px;display:grid}:where(.einfach-spreadsheet) .border-custom-color input{width:100%}:where(.einfach-spreadsheet) .border-custom-color input[type=color]{height:32px;padding:2px}:where(.einfach-spreadsheet) .border-panel-actions{grid-column:1/-1;justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .border-panel-actions button[type=submit]{background:var(--primary);color:#fff}:where(.einfach-spreadsheet) .border-panel :disabled{opacity:.5}:where(.einfach-spreadsheet) .border-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .border-panel [role=alert]{color:#a12622;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .hyperlink-panel{box-sizing:border-box;border:1px solid var(--border,#dce1e8);background:var(--surface,#fff);width:min(440px,100vw - 32px);max-height:calc(100dvh - 32px);color:var(--text,#252b37);border-radius:8px;padding:20px;font:13px/1.5 Arial,sans-serif;overflow-y:auto}:where(.einfach-spreadsheet) .hyperlink-panel::backdrop{background:#19203042}:where(.einfach-spreadsheet) .hyperlink-panel h2{margin:0 0 10px;font-size:16px}:where(.einfach-spreadsheet) .hyperlink-panel p{margin:8px 0 14px}:where(.einfach-spreadsheet) .hyperlink-panel fieldset{border:0;gap:6px;margin:0;padding:0;display:grid}:where(.einfach-spreadsheet) .hyperlink-panel input{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:100%;min-height:32px;font:inherit;border-radius:4px;padding:5px 8px}:where(.einfach-spreadsheet) .hyperlink-panel button{border:1px solid var(--border,#dce1e8);background:var(--surface,#fff);min-height:32px;color:inherit;font:inherit;cursor:pointer;border-radius:4px;padding:4px 10px}:where(.einfach-spreadsheet) .hyperlink-panel button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .hyperlink-panel :focus-visible{outline:2px solid var(--primary,#315cda);outline-offset:2px}:where(.einfach-spreadsheet) .hyperlink-hint{color:var(--muted-text,#596579)}:where(.einfach-spreadsheet) .hyperlink-error{color:#b42318}:where(.einfach-spreadsheet) .hyperlink-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .hyperlink-panel button[type=submit]{background:var(--primary,#315cda);border-color:var(--primary,#315cda);color:#fff}:where(.einfach-spreadsheet) .hyperlink-open{color:var(--primary,#315cda);margin-top:14px;display:inline-block}:where(.einfach-spreadsheet) .note-panel{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:min(440px,100vw - 24px);max-height:calc(100dvh - 32px);color:var(--text,#252b37);background:var(--surface,#fff);border-radius:10px;padding:20px;font:13px/1.5 Arial,sans-serif;overflow:auto;box-shadow:0 12px 40px #0003}:where(.einfach-spreadsheet) .note-panel::backdrop{background:#0004}:where(.einfach-spreadsheet) .note-panel h2{margin:0 0 8px;font-size:16px}:where(.einfach-spreadsheet) .note-panel p{line-height:1.45}:where(.einfach-spreadsheet) .note-panel label{margin-bottom:6px;font-weight:600;display:block}:where(.einfach-spreadsheet) .note-panel textarea{box-sizing:border-box;resize:vertical;border:1px solid var(--border,#dce1e8);width:100%;min-height:150px;color:inherit;background:var(--surface,#fff);font:inherit;border-radius:5px;padding:10px;line-height:1.5}:where(.einfach-spreadsheet) .note-panel :focus-visible{outline:2px solid var(--primary,#315cda);outline-offset:2px}:where(.einfach-spreadsheet) .note-hint{color:var(--muted-text,#596579);font-size:12px}:where(.einfach-spreadsheet) .note-count{font-variant-numeric:tabular-nums;margin-top:4px;display:block}:where(.einfach-spreadsheet) .note-error{color:var(--danger,#b42318);overflow-wrap:anywhere}:where(.einfach-spreadsheet) .note-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .note-actions button{min-height:32px;font:inherit;border:1px solid var(--border,#dce1e8);background:var(--surface,#fff);color:inherit;cursor:pointer;border-radius:4px;padding:5px 10px}:where(.einfach-spreadsheet) .note-actions button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .note-actions button[type=submit]{color:#fff;background:var(--primary,#315cda);border-color:var(--primary,#315cda)}:where(.einfach-spreadsheet) .comment-panel{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:min(500px,100vw - 24px);max-height:calc(100dvh - 32px);color:var(--text,#252b37);background:var(--surface,#fff);border-radius:10px;padding:20px;font:13px/1.5 Arial,sans-serif;overflow:auto;box-shadow:0 12px 40px #0003}:where(.einfach-spreadsheet) .comment-panel::backdrop{background:#0004}:where(.einfach-spreadsheet) .comment-panel h2{margin:0 0 8px;font-size:16px}:where(.einfach-spreadsheet) .comment-panel p{line-height:1.45}:where(.einfach-spreadsheet) .comment-panel label{margin-bottom:6px;font-weight:600;display:block}:where(.einfach-spreadsheet) .comment-panel input,:where(.einfach-spreadsheet) .comment-panel textarea{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:100%;color:inherit;background:var(--surface,#fff);font:inherit;border-radius:5px;padding:9px;line-height:1.5}:where(.einfach-spreadsheet) .comment-panel textarea{resize:vertical;min-height:100px}:where(.einfach-spreadsheet) .comment-panel :focus-visible{outline:2px solid var(--primary,#315cda);outline-offset:2px}:where(.einfach-spreadsheet) .comment-hint{color:var(--muted-text,#596579);font-size:12px}:where(.einfach-spreadsheet) .comment-count{font-variant-numeric:tabular-nums;margin-top:4px;display:block}:where(.einfach-spreadsheet) .comment-error{color:var(--danger,#b42318);overflow-wrap:anywhere}:where(.einfach-spreadsheet) .comment-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .comment-actions button{min-height:32px;font:inherit;border:1px solid var(--border,#dce1e8);background:var(--surface,#fff);color:inherit;cursor:pointer;border-radius:4px;padding:5px 10px}:where(.einfach-spreadsheet) .comment-actions button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .comment-actions button[type=submit]{color:#fff;background:var(--primary,#315cda);border-color:var(--primary,#315cda)}:where(.einfach-spreadsheet) .comment-timeline{margin:12px 0 18px;padding:0;list-style:none}:where(.einfach-spreadsheet) .comment-entry{border-bottom:1px solid var(--border,#dce1e8);padding:10px 0}:where(.einfach-spreadsheet) .comment-byline{flex-wrap:wrap;align-items:baseline;gap:4px 12px;display:flex}:where(.einfach-spreadsheet) .comment-byline strong{overflow-wrap:anywhere}:where(.einfach-spreadsheet) .comment-byline time{color:var(--muted-text,#596579);font-size:12px}:where(.einfach-spreadsheet) .comment-entry p{margin:6px 0 0}:where(.einfach-spreadsheet) .comment-body{white-space:pre-wrap;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .comment-state{color:var(--muted-text,#596579)}:where(.einfach-spreadsheet) .protection-panel{box-sizing:border-box;border:1px solid var(--border);background:var(--surface);width:480px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);color:var(--text);border-radius:8px;padding:20px;font-size:13px;overflow:auto}:where(.einfach-spreadsheet) .protection-panel::backdrop{background:#14192d40}:where(.einfach-spreadsheet) .protection-panel h2{margin:0;font-size:17px}:where(.einfach-spreadsheet) .protection-panel h3{margin:18px 0 0;font-size:13px}:where(.einfach-spreadsheet) .protection-panel p{line-height:1.5}:where(.einfach-spreadsheet) .protection-sheet{overflow-wrap:anywhere;font-weight:600}:where(.einfach-spreadsheet) .protection-status{background:var(--primary-soft);border-radius:4px;padding:10px}:where(.einfach-spreadsheet) .protection-panel button{box-sizing:border-box;min-height:34px;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:6px 10px}:where(.einfach-spreadsheet) .protection-panel button:hover:enabled{background:var(--control-hover)}:where(.einfach-spreadsheet) .protection-panel button:disabled{opacity:.5}:where(.einfach-spreadsheet) .protection-panel :focus-visible{outline:2px solid var(--primary);outline-offset:2px}:where(.einfach-spreadsheet) .protection-ranges{max-height:180px;padding:0;list-style:none;overflow:auto}:where(.einfach-spreadsheet) .protection-ranges li{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;padding:6px 0;display:flex}:where(.einfach-spreadsheet) .protection-panel code{overflow-wrap:anywhere}:where(.einfach-spreadsheet) .protection-allow{flex-wrap:wrap;justify-content:space-between;gap:10px;width:100%;display:flex}:where(.einfach-spreadsheet) .protection-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:20px;display:flex}:where(.einfach-spreadsheet) .protection-actions .protection-primary{color:#fff;background:var(--primary)}:where(.einfach-spreadsheet) .protection-panel [role=alert]{color:var(--danger,#a12622);overflow-wrap:anywhere}@container einfach-spreadsheet (width<=420px){:where(.einfach-spreadsheet) .protection-panel{padding:16px}:where(.einfach-spreadsheet) .protection-actions button{flex:auto}}:where(.einfach-spreadsheet) .custom-formula-panel{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:min(480px,100vw - 24px);max-height:calc(100dvh - 32px);color:var(--text,#252b37);background:var(--surface,#fff);border-radius:10px;padding:20px;font:13px/1.5 Arial,sans-serif;overflow:auto;box-shadow:0 12px 40px #0003}:where(.einfach-spreadsheet) .custom-formula-panel::backdrop{background:#0004}:where(.einfach-spreadsheet) .custom-formula-panel h2{margin:0 0 8px;font-size:16px}:where(.einfach-spreadsheet) .custom-formula-panel label{margin:12px 0 6px;font-weight:600;display:block}:where(.einfach-spreadsheet) .custom-formula-panel input,:where(.einfach-spreadsheet) .custom-formula-panel textarea,:where(.einfach-spreadsheet) .custom-formula-panel select{box-sizing:border-box;border:1px solid var(--border,#dce1e8);width:100%;min-height:34px;color:inherit;background:var(--surface,#fff);font:inherit;border-radius:5px;padding:7px 9px}:where(.einfach-spreadsheet) .custom-formula-panel textarea{resize:vertical;font-family:ui-monospace,monospace}:where(.einfach-spreadsheet) .custom-formula-panel :focus-visible{outline:2px solid var(--primary,#315cda);outline-offset:2px}:where(.einfach-spreadsheet) .custom-formula-hint{color:var(--muted-text,#596579);overflow-wrap:anywhere;font-size:12px}:where(.einfach-spreadsheet) .custom-formula-library{border-bottom:1px solid var(--border,#dce1e8);padding-bottom:12px}:where(.einfach-spreadsheet) .custom-formula-error{color:var(--danger,#b42318);overflow-wrap:anywhere}:where(.einfach-spreadsheet) .custom-formula-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}:where(.einfach-spreadsheet) .custom-formula-actions button{min-height:34px;font:inherit;border:1px solid var(--border,#dce1e8);background:var(--surface,#fff);color:inherit;cursor:pointer;border-radius:4px;padding:5px 10px}:where(.einfach-spreadsheet) .custom-formula-actions button:disabled{opacity:.5;cursor:default}:where(.einfach-spreadsheet) .custom-formula-actions button[type=submit]{color:#fff;background:var(--primary,#315cda)}:where(.einfach-spreadsheet) .ribbon-shell{border-bottom:1px solid var(--border);background:#fff;flex:none;align-items:center;gap:8px;min-height:46px;padding:0 10px;display:flex;overflow:hidden}:where(.einfach-spreadsheet) .ribbon-tabs{flex:none;align-items:center;gap:2px;height:34px;display:flex}:where(.einfach-spreadsheet) .ribbon-panel{flex:1;min-width:0;display:flex}:where(.einfach-spreadsheet) .ribbon-tool-group{flex:none;align-items:center;gap:2px;display:flex}:where(.einfach-spreadsheet) .ribbon-tool-group[data-inactive=true]{display:contents}:where(.einfach-spreadsheet) .ribbon-tool-group[data-inactive=true]>:not(dialog){display:none}:where(.einfach-spreadsheet) .ribbon-tab{color:#515568;background:0 0;border:0;border-radius:7px;height:28px;padding:0 9px;font-size:11px}:where(.einfach-spreadsheet) .ribbon-tab:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .ribbon-tab.active{color:var(--primary);background:var(--primary-soft);font-weight:650}:where(.einfach-spreadsheet) .toolbar-divider,:where(.einfach-spreadsheet) .tool-separator{background:var(--border);flex:none;width:1px;height:22px;display:block}:where(.einfach-spreadsheet) .ribbon-tools{scrollbar-width:none;flex:1;align-items:center;gap:2px;min-width:0;display:flex;overflow:auto hidden}:where(.einfach-spreadsheet) .ribbon-tools::-webkit-scrollbar{display:none}:where(.einfach-spreadsheet) .text-layout-tools{flex:none;align-items:center;gap:2px;display:inline-flex}:where(.einfach-spreadsheet) .text-layout-select{width:76px;padding:0 4px}:where(.einfach-spreadsheet) .text-layout-error{color:#a12622;align-items:center;max-width:260px;display:inline-flex}:where(.einfach-spreadsheet) .tool-button,:where(.einfach-spreadsheet) .tool-select{color:#3f4352;background:0 0;border:0;border-radius:6px;flex:none;height:28px;font-size:12px}:where(.einfach-spreadsheet) .tool-button{place-items:center;width:28px;padding:0;display:grid}:where(.einfach-spreadsheet) .tool-button:hover,:where(.einfach-spreadsheet) .tool-select:hover{background:var(--control-hover)}:where(.einfach-spreadsheet) .tool-button:disabled,:where(.einfach-spreadsheet) .tool-select:disabled{opacity:.4;cursor:default}:where(.einfach-spreadsheet) .tool-button[aria-label=Bold]{font-weight:700}:where(.einfach-spreadsheet) .tool-button[aria-pressed=true]{color:var(--primary);background:var(--primary-soft)}:where(.einfach-spreadsheet) .tool-select{cursor:pointer;border:1px solid #0000;padding:0 8px}:where(.einfach-spreadsheet) .tool-select:hover{border-color:var(--border)}:where(.einfach-spreadsheet) .font-family-select{width:108px}:where(.einfach-spreadsheet) .paste-options-select{width:132px}:where(.einfach-spreadsheet) .copy-as-select{width:100px}:where(.einfach-spreadsheet) .fill-feedback{color:#3f4352;overflow-wrap:anywhere;flex:none;max-width:280px;font-size:12px;line-height:16px}:where(.einfach-spreadsheet) .fill-feedback[role=alert]{color:#a12622}:where(.einfach-spreadsheet) .font-size-select{width:56px}:where(.einfach-spreadsheet) .number-format-select{width:78px}:where(.einfach-spreadsheet) .tool-separator{height:18px;margin:0 3px}:where(.einfach-spreadsheet) .toolbar-spacer{flex:1;min-width:8px}@container einfach-spreadsheet (width<=760px){:where(.einfach-spreadsheet) .ribbon-shell{flex-wrap:wrap;gap:5px;min-height:43px;padding-inline:7px}:where(.einfach-spreadsheet) .ribbon-tabs{background:#fff;width:100%;padding-right:5px;overflow-x:auto}:where(.einfach-spreadsheet) .toolbar-divider{display:none}:where(.einfach-spreadsheet) .ribbon-tools{min-width:0;overflow-x:auto}:where(.einfach-spreadsheet) .toolbar-spacer{display:none}}:where(.einfach-spreadsheet) .cell-editor{z-index:8;top:var(--editor-top);left:var(--editor-left);width:var(--editor-width);height:var(--editor-height);position:absolute}:where(.einfach-spreadsheet) .cell-editor textarea{border:2px solid var(--primary);width:100%;height:100%;color:var(--text);background:var(--surface);resize:none;font:inherit;border-radius:0;outline:0;padding:2px 6px;line-height:18px}:where(.einfach-spreadsheet) .cell-editor-feedback{color:#8e2525;background:#fff5f5;border:1px solid #c93c3c;align-items:center;gap:8px;width:max-content;max-width:360px;padding:6px 8px;font-size:11px;display:flex;box-shadow:0 2px 8px #0000001f}:where(.einfach-spreadsheet) .cell-editor-feedback button{flex:none}:where(.einfach-spreadsheet) .cell-validation-list{z-index:7;box-sizing:border-box;border:1px solid var(--primary);background:var(--surface);color:var(--text);font:inherit;cursor:pointer;border-radius:0;padding:0;position:absolute}:where(.einfach-spreadsheet) .cell-validation-list:focus-visible{outline:2px solid var(--primary)}:where(.einfach-spreadsheet) .grid-validation-feedback{z-index:8;inset-inline:8px;pointer-events:none;justify-items:start;gap:8px;display:grid;position:absolute;bottom:8px}:where(.einfach-spreadsheet) .validation-input-message{box-sizing:border-box;width:min(320px,100%);color:var(--text);background:var(--surface);border:1px solid var(--border);white-space:pre-wrap;overflow-wrap:anywhere;pointer-events:none;border-radius:6px;padding:10px 12px;box-shadow:0 3px 12px #0000001a}:where(.einfach-spreadsheet) .validation-input-message p{margin:4px 0 0}:where(.einfach-spreadsheet) .validation-error-alert{pointer-events:auto;width:min(420px,100vw - 32px);max-height:calc(100dvh - 32px);color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:20px;overflow:auto}:where(.einfach-spreadsheet) .validation-error-alert::backdrop{background:#0c162040}:where(.einfach-spreadsheet) .validation-error-alert h2{margin:0 0 12px;font-size:17px}:where(.einfach-spreadsheet) .validation-error-alert p{white-space:pre-wrap;overflow-wrap:anywhere}:where(.einfach-spreadsheet) .validation-alert-actions{justify-content:flex-end;gap:8px;display:flex}:where(.einfach-spreadsheet) .validation-alert-actions button{min-height:32px;padding:4px 12px}:where(.einfach-spreadsheet) .validation-stop-message{box-sizing:border-box;width:min(360px,100%);color:var(--text);background:var(--surface);border:1px solid var(--border);overflow-wrap:anywhere;border-radius:6px;padding:10px 32px 10px 12px;position:relative}:where(.einfach-spreadsheet) .validation-stop-message p{white-space:pre-wrap;margin:4px 0 0}:where(.einfach-spreadsheet) .validation-stop-message button{pointer-events:auto;position:absolute;top:4px;right:4px}:where(.einfach-spreadsheet) .sheet-heading{position:relative}:where(.einfach-spreadsheet) .sheet-heading-button{border:0;border-right:1px solid var(--border);width:100%;height:100%;color:inherit;font:inherit;cursor:inherit;background:0 0;place-items:center;padding:0;display:grid}:where(.einfach-spreadsheet) .sheet-heading-button:focus-visible{outline:1px solid var(--primary);outline-offset:-1px}:where(.einfach-spreadsheet) .grid-resize-handle{touch-action:none;z-index:1;position:absolute}:where(.einfach-spreadsheet) .grid-resize-column{cursor:col-resize;width:6px;top:0;bottom:0;right:0}:where(.einfach-spreadsheet) .grid-resize-row{cursor:row-resize;height:6px;bottom:0;left:0;right:0}:where(.einfach-spreadsheet) .grid-resize-handle:hover,:where(.einfach-spreadsheet) .grid-resize-handle:focus-visible{background:var(--primary)}:where(.einfach-spreadsheet) .grid-resize-handle[aria-disabled=true]{cursor:default}:where(.einfach-spreadsheet) .resize-guide{z-index:9;pointer-events:none;position:absolute}:where(.einfach-spreadsheet) .resize-guide-row{border-top:1px dashed var(--primary)}:where(.einfach-spreadsheet) .resize-guide-column{border-left:1px dashed var(--primary)}:where(.einfach-spreadsheet) .resize-guide output{white-space:nowrap;background:var(--primary);color:#fff;padding:2px 4px;font-size:11px;position:absolute;top:4px;left:8px}:where(.einfach-spreadsheet) .frozen-viewport{z-index:6;pointer-events:none;grid-area:1/1/3/3;place-self:start;position:sticky;top:0;left:0;overflow:hidden}:where(.einfach-spreadsheet) .frozen-pane,:where(.einfach-spreadsheet) .frozen-row-headers,:where(.einfach-spreadsheet) .frozen-column-headers{pointer-events:auto;background:var(--surface);position:absolute;overflow:hidden}:where(.einfach-spreadsheet) .frozen-pane .cell:last-child{border-right:1px solid var(--gridline)}:where(.einfach-spreadsheet) .frozen-row-headers,:where(.einfach-spreadsheet) .frozen-column-headers{background:var(--chrome)}:where(.einfach-spreadsheet) .frozen-row-headers .sheet-heading-button{border-bottom:1px solid var(--border)}:where(.einfach-spreadsheet) .outline-corner,:where(.einfach-spreadsheet) .outline-gutter{background:var(--chrome);min-width:0;min-height:0;color:var(--muted);position:relative;overflow:hidden}:where(.einfach-spreadsheet) .outline-corner{grid-area:1/1;align-items:end;display:flex}:where(.einfach-spreadsheet) .outline-row{grid-area:2/1}:where(.einfach-spreadsheet) .outline-column{grid-area:1/2}:where(.einfach-spreadsheet) .outline-corner button,:where(.einfach-spreadsheet) .outline-gutter button{border:1px solid var(--border-strong);background:var(--surface);width:18px;height:18px;color:inherit;cursor:pointer;border-radius:2px;flex:0 0 18px;margin:1px;padding:0;font-size:11px;line-height:16px}:where(.einfach-spreadsheet) .outline-gutter button:hover,:where(.einfach-spreadsheet) .outline-corner button:hover{background:var(--selection-fill,#e5e9ff)}:where(.einfach-spreadsheet) .outline-gutter button:focus-visible,:where(.einfach-spreadsheet) .outline-corner button:focus-visible{outline:2px solid var(--accent,#315eff)}:where(.einfach-spreadsheet) .outline-gutter button:disabled,:where(.einfach-spreadsheet) .outline-corner button:disabled{cursor:default;opacity:.5}:where(.einfach-spreadsheet) .outline-toggle{z-index:1;position:absolute}:where(.einfach-spreadsheet) .outline-line{border-color:var(--border-strong);position:absolute}:where(.einfach-spreadsheet) .outline-row .outline-line{border-left:1px solid}:where(.einfach-spreadsheet) .outline-column .outline-line{border-top:1px solid}:where(.einfach-spreadsheet) .outline-column-levels{z-index:2;flex-direction:column;display:flex;position:absolute}:where(.einfach-spreadsheet) .fill-handle-viewport{z-index:7;pointer-events:none;grid-area:1/1/3/3;place-self:start;position:sticky;top:0;left:0;overflow:hidden}:where(.einfach-spreadsheet) .fill-handle{background:var(--primary);cursor:crosshair;pointer-events:auto;touch-action:none;background-clip:padding-box;border:3px solid #0000;border-radius:0;width:12px;height:12px;padding:0;position:absolute}:where(.einfach-spreadsheet) .fill-handle[data-mode=copy]{cursor:copy}:where(.einfach-spreadsheet) .fill-handle-preview{box-sizing:border-box;border:1px dashed var(--primary);position:absolute}:where(.einfach-spreadsheet) .worksheet-panel{grid-template-rows:auto minmax(0,1fr);grid-template-columns:auto minmax(0,1fr);display:grid;position:relative}:where(.einfach-spreadsheet) .grid-visibility-state{z-index:1;color:var(--muted);font-size:12px;line-height:1.5;position:absolute;top:48px;left:56px;right:16px}:where(.einfach-spreadsheet) .grid-viewport-frame{min-height:var(--grid-sheet-height);min-width:var(--grid-sheet-width)}:where(.einfach-spreadsheet) .grid-window{will-change:transform;align-self:start}:where(.einfach-spreadsheet) .grid-projection-state{border-bottom:1px solid var(--gridline);min-height:112px;color:var(--muted);background:var(--surface);place-items:center;font-size:12px;display:grid}:where(.einfach-spreadsheet) .sheet-scroll{overflow-anchor:none;overscroll-behavior:contain;grid-area:2/2;width:100%;height:100%;overflow:auto}:where(.einfach-spreadsheet) .sheet-grid-frame{width:max(100%, var(--grid-sheet-width));grid-template-columns:var(--grid-row-header-width) var(--grid-sheet-content-width);grid-template-rows:var(--grid-row-height) auto;display:grid;position:relative}:where(.einfach-spreadsheet) .sheet-corner{z-index:7;border:0;border-right:1px solid var(--border-strong);border-bottom:1px solid var(--border-strong);background:var(--chrome);color:var(--muted);cursor:pointer;grid-area:1/1;padding:0;position:sticky;top:0;left:0}:where(.einfach-spreadsheet) .column-headers{z-index:4;box-sizing:border-box;width:var(--grid-sheet-content-width);padding-left:var(--grid-window-offset-x);grid-area:1/2;grid-template-columns:var(--grid-window-column-widths);border-bottom:1px solid var(--border-strong);background:var(--chrome);display:grid;position:sticky;top:0}:where(.einfach-spreadsheet) .sheet-heading{color:#444;background:var(--chrome);-webkit-user-select:none;user-select:none;cursor:pointer;border:0;place-items:center;min-width:0;padding:0;font-size:11px;font-weight:400;display:grid}:where(.einfach-spreadsheet) .sheet-heading:hover,:where(.einfach-spreadsheet) .sheet-corner:hover,:where(.einfach-spreadsheet) .sheet-corner[aria-pressed=true]{background:#e5e9ff}:where(.einfach-spreadsheet) .sheet-heading:focus-visible,:where(.einfach-spreadsheet) .sheet-corner:focus-visible{outline:1px solid var(--primary);outline-offset:-1px}:where(.einfach-spreadsheet) .column-headers .sheet-heading:last-child .sheet-heading-button{border-right:0}:where(.einfach-spreadsheet) .heading-selected{color:var(--primary-strong);background:#e5e9ff;font-weight:600}:where(.einfach-spreadsheet) .row-headers{z-index:3;grid-area:2/1;grid-template-rows:var(--grid-window-row-heights);transform:translateY(var(--grid-window-offset));background:var(--chrome);align-self:start;display:grid;position:sticky;left:0}:where(.einfach-spreadsheet) .row-headers .sheet-heading-button{border-right:1px solid var(--border-strong);border-bottom:1px solid var(--border)}:where(.einfach-spreadsheet) .grid-surface{width:var(--grid-window-width);min-width:var(--grid-window-width);transform:translate(var(--grid-window-offset-x), var(--grid-window-offset));touch-action:none;-webkit-user-select:none;user-select:none;position:relative}:where(.einfach-spreadsheet) .sheet-grid-frame>.grid-surface{grid-area:2/2}:where(.einfach-spreadsheet) .grid-viewport-frame[data-format-painter] [data-cell],:where(.einfach-spreadsheet) .grid-viewport-frame[data-format-painter] [data-merged-cell]{cursor:crosshair}.einfach-spreadsheet.workbook{background:var(--surface);flex-direction:column;width:100%;height:100%;min-height:0;display:flex}:where(.einfach-spreadsheet) .worksheet-panel{background:#fff;flex:1;min-height:0}:where(.einfach-spreadsheet) .rust-runtime-status{color:var(--primary-strong);background:var(--primary-soft);padding:4px 12px;font-size:11px}.einfach-spreadsheet{color:#292b35;font-synthesis:none;text-rendering:optimizelegibility;--primary:#274fee;--primary-strong:#1e3dbe;--primary-soft:#eef1ff;--border:#e2e4ea;--border-strong:#c8cbd4;--chrome:#f6f7f9;--control-hover:#f1f2f5;--gridline:#e3e5ea;--muted:#777b8c;--surface:#fff;--text:#292b35;background:#fff;width:100%;min-width:0;height:100%;min-height:0;font-family:Inter,Segoe UI,ui-sans-serif,-apple-system,BlinkMacSystemFont,sans-serif;font-size:16px;line-height:normal;position:relative;overflow:hidden;container:einfach-spreadsheet/inline-size}.einfach-spreadsheet,:where(.einfach-spreadsheet) *,:where(.einfach-spreadsheet) :before,:where(.einfach-spreadsheet) :after{box-sizing:border-box}:where(.einfach-spreadsheet) :is(button,input,table,select,textarea){font:inherit}:where(.einfach-spreadsheet) button{color:inherit}:where(.einfach-spreadsheet) .visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){:where(.einfach-spreadsheet) *,:where(.einfach-spreadsheet) :before,:where(.einfach-spreadsheet) :after{scroll-behavior:auto!important}}
|
|
2
|
+
/*$vite$:1*/
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# 嵌入 React 工作簿
|
|
2
|
+
|
|
3
|
+
此包的目标是浏览器 ESM、React 18.3、`@einfach/core` / `@einfach/react` 0.4。
|
|
4
|
+
宿主与工作簿必须解析到同一份 Einfach Store、React 绑定和 UI Core;旧 Store 版本或
|
|
5
|
+
React 19 不在兼容范围内,需要先对齐版本。预期发行是 React 0.1.0 与 Core/WASM 0.2.0;
|
|
6
|
+
工作区保留 pending changesets,尚未应用版本或发布 npm。React 的 UI Core peer 最低为
|
|
7
|
+
`^0.2.0`,旧 0.1.0 没有本轮宿主接口。
|
|
8
|
+
|
|
9
|
+
发布后安装:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install @einfach-excel/react-excel@^0.1.0 @einfach-excel/spreadsheet-ui-core@^0.2.0 \
|
|
13
|
+
@einfach/core@^0.4.0 @einfach/react@^0.4.0 react@^18.3.1 react-dom@^18.3.1
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
未发布候选用仓库根 `pnpm prepare:package-consumers`:在系统 mktemp 副本运行既有
|
|
17
|
+
Changesets version、pnpm pack,由仓外 Vite/Rspack 严格安装 tarball 与 registry 依赖。
|
|
18
|
+
脚本不修改工作区版本和在途 changesets;消费者不安装 Rust 工具链。
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { Spreadsheet } from '@einfach-excel/react-excel'
|
|
22
|
+
import type { RustWorkbookDefinition } from '@einfach-excel/spreadsheet-ui-core'
|
|
23
|
+
import '@einfach-excel/react-excel/style.css'
|
|
24
|
+
|
|
25
|
+
const definition: RustWorkbookDefinition = {
|
|
26
|
+
title: 'My workbook',
|
|
27
|
+
sheets: [{ id: 'sheet-1', name: 'Sheet 1', rowCount: 1000, colCount: 20 }],
|
|
28
|
+
createImportChunks: () => [],
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function App() {
|
|
32
|
+
return <Spreadsheet definition={definition} style={{ width: '100%', height: 640 }} />
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`definition` 应保持引用稳定。组件会创建一个独立 Store,启动 Core 现有的 Rust runtime,
|
|
37
|
+
初始化工作簿和原生函数目录,然后渲染完整工具栏、公式栏、表格和页签。
|
|
38
|
+
可传入 `store` 与宿主共享状态;一个 Store 同时只能归属一个挂载中的工作簿。
|
|
39
|
+
更换 definition、Store 或 workerFactory 会清理旧 runtime 并启动新的实例。
|
|
40
|
+
卸载和失败资源由 Core 统一清理,宿主无需再次终止 Worker。
|
|
41
|
+
|
|
42
|
+
默认 Worker 通过模块 URL 加载包内编译产物。宿主无需 Lingui 宏插件、`.po` loader、
|
|
43
|
+
源码 alias 或 Rust 工具链;`@einfach-excel/spreadsheet-ui-core` 及其 `@einfach-excel/excel-wasm`
|
|
44
|
+
必须提供已构建的匹配发行物。受 CSP、资源路径或特殊打包约束时,可明确传入
|
|
45
|
+
`workerFactory={() => new Worker(/* 宿主自己的模块 URL */, { type: 'module' })}`。
|
|
46
|
+
每次工厂调用必须返回一个全新的、实现 Core `WorkerLike` 协议的 Worker,不能共享活动实例。
|
|
47
|
+
|
|
48
|
+
自定义入口可直接复用 Core 发行叶,Vite/Rspack 无需专属 Worker loader:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
// workbook.worker.ts
|
|
52
|
+
import '@einfach-excel/spreadsheet-ui-core/rust-runtime'
|
|
53
|
+
// 宿主组件的稳定 factory:() => new Worker(
|
|
54
|
+
// new URL('./workbook.worker.ts', import.meta.url), { type: 'module' })
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
将 workerFactory 保持为稳定函数,避免每次宿主 render 重建工作簿。默认 Worker 包含预编译
|
|
58
|
+
WASM;自定义入口由消费者 bundler 处理 Core 对 WASM 的引用。CSP 需允许实际脚本、Worker 与
|
|
59
|
+
WASM 来源;本轮只验证本地同源 Vite/Rspack,未验证严格 CSP 或 CDN 跨域部署。
|
|
60
|
+
|
|
61
|
+
包根还导出 `WorkbookRuntimeProvider`、`WorkbookStoreProvider`、`WorkbookView` 及其 props
|
|
62
|
+
类型。前者允许在同一 runtime 中挂载自定义 React 子树;后两者用于已经由宿主配置好的
|
|
63
|
+
Core Store/connection。仅向 `WorkbookStoreProvider` 传入 connection 不会初始化文档和
|
|
64
|
+
原生函数目录,不能据此取得完整初始工作簿。Core 类型从 Core 包导入,本包不转导出 Core barrel。
|
|
65
|
+
|
|
66
|
+
## 尺寸与展现配置
|
|
67
|
+
|
|
68
|
+
`Spreadsheet` 的 `className`、`style` 作用于 `.einfach-spreadsheet` 根。根默认填满父容器,
|
|
69
|
+
父容器需有明确高度,或像示例一样直接设置 `height`。组件只滚动自己的网格,不修改
|
|
70
|
+
宿主 `html`、`body`、`#root` 或文档滚动;主题 token 与 reset 均限定在组件根。
|
|
71
|
+
响应式工具栏按组件容器宽度换行,因此同一桌面页面中的窄工作簿也可使用完整入口。
|
|
72
|
+
也可直接使用 Provider + `WorkbookView`,视图会提供同一个样式域。
|
|
73
|
+
|
|
74
|
+
两个 Provider 与 `Spreadsheet` 都接受 `locale?: 'en' | 'zh'`、`i18n?: I18n`、
|
|
75
|
+
`renderer?: 'dom' | 'canvas'`。默认各自创建英文 Lingui 实例,语言下拉仅切换本实例;
|
|
76
|
+
显式 `locale` 表示宿主控制语言,下拉会禁用,宿主通过更新该 prop 切换。
|
|
77
|
+
提供 `i18n` 而不提供 `locale` 时,保留该实例当前语言及宿主词典,包含 en/zh 以外的语言。
|
|
78
|
+
宿主负责该实例所需的词典;只有显式传入同一个 I18n 才会共享语言变化。
|
|
79
|
+
共享 I18n 的多个工作簿应使用一致的受控 locale,避免同一实例接收相互矛盾的配置。
|
|
80
|
+
|
|
81
|
+
默认 renderer 为 DOM;Canvas 只能通过 `renderer="canvas"` 选择。语言和 renderer
|
|
82
|
+
变化不会重建工作簿或清空历史。库不读取或改写宿主 URL、浏览器语言和 localStorage。
|
|
83
|
+
演示站继续独立读取 `?locale=`、`?renderer=canvas`,并保存语言偏好。
|
|
84
|
+
|
|
85
|
+
## 构建与检查
|
|
86
|
+
|
|
87
|
+
先构建 Core 的发行版 JS/声明并准备预编译 WASM,然后在仓库执行:
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
pnpm --filter @einfach-excel/react-excel build:lib
|
|
91
|
+
pnpm --filter @einfach-excel/react-excel build:demo
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
库位于 `dist/`,demo 位于 `dist-demo/`;`build` 依次构建两者。
|
|
95
|
+
`dist/artifact-manifest.json` 列出产物、外部依赖、peer 及内联实现,可供集成自动检查。
|
|
96
|
+
`files` 白名单只打包库与本文档,排除 demo、源码、test、e2e 与构建脚本。
|
|
97
|
+
React、react-dom、Einfach core/react、UI Core 保留 peer 身份;私有 cells/canvas 实现已内联。
|
|
98
|
+
Lingui 运行时为普通发行依赖,宏和中英目录已在库侧编译。
|
|
99
|
+
|
|
100
|
+
[原始值、事务、事件与控制](host-data.md)说明宿主契约;[发行清单](release.md)列出
|
|
101
|
+
消费者命令与兼容边界。工作区的构建成功不等于 npm 已发布。
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# 同 Store 数据与交互控制
|
|
2
|
+
|
|
3
|
+
从 `@einfach/core` 创建 Store,将同一个实例传入 `<Spreadsheet store={store} />`。
|
|
4
|
+
React 产品组件使用 `@einfach/react` hooks;以下是宿主服务代码,不是 React 工作簿状态副本。
|
|
5
|
+
UI Core 的所有公开 atom/类型从 `@einfach-excel/spreadsheet-ui-core` 根导入。
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { createStore } from '@einfach/core'
|
|
9
|
+
import { readWorkbookRangesAtom, writeWorkbookCellsAtom, workbookChangeAtom,
|
|
10
|
+
configureHostControlsAtom } from '@einfach-excel/spreadsheet-ui-core'
|
|
11
|
+
|
|
12
|
+
export const store = createStore()
|
|
13
|
+
const stop = store.sub(workbookChangeAtom, () => {
|
|
14
|
+
const change = store.getter(workbookChangeAtom)
|
|
15
|
+
if (change) enqueueForSaving(change) // 同步取走事件,自行管理异步保存队列
|
|
16
|
+
})
|
|
17
|
+
const written = await store.setter(writeWorkbookCellsAtom, { cells: [
|
|
18
|
+
{ sheetId: 'orders', row: 0, col: 0,
|
|
19
|
+
input: { kind: 'literal', value: { kind: 'string', value: '00123' } } },
|
|
20
|
+
{ sheetId: 'orders', row: 0, col: 1, input: { kind: 'formula', formula: '=1+2' } },
|
|
21
|
+
] })
|
|
22
|
+
if (written.status === 'error') console.error(written.error)
|
|
23
|
+
const read = await store.setter(readWorkbookRangesAtom, { targets: [
|
|
24
|
+
{ sheetId: 'orders', range: { rowStart: 0, rowEnd: 0, colStart: 0, colEnd: 1 } },
|
|
25
|
+
] })
|
|
26
|
+
if (read.status === 'ok') console.log(read.ranges)
|
|
27
|
+
await store.setter(configureHostControlsAtom, { busy: true, allowSheetStructure: false })
|
|
28
|
+
// 宿主释放订阅时调用 stop();Worker 释放仍由组件/Core 所有。
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
坐标零基,范围包含两端。读接口一次 native 调用,返回各区域同一 revision 的稀疏 cells。
|
|
32
|
+
每格提供原始 input、可选 formula 和 typed 当前 value;value 为 number/string/boolean/blank/error
|
|
33
|
+
判别联合。公式源独立于计算值,`12.5%` 的 number 仍为 `0.125`。字面量不经过输入解析,
|
|
34
|
+
`00123`、`=1+2`、空格及空字符串可精确写回。空格单元和 spill 子格省略,空字符串保留。
|
|
35
|
+
|
|
36
|
+
每次读最多 64 区域、4096 个返回格与约 4 MiB 文本;写最多 4096 格与约 4 MiB 输入及前像。
|
|
37
|
+
一批写入只产生一次 Rust 原子事务和一次 undo。非法公式、越界、保护或任一非法目标使整批拒绝。
|
|
38
|
+
首版 patch 拒绝 Table 内容、已有 spill/blocked anchor、合并非锚点;复杂对象用已有专用命令
|
|
39
|
+
或原生文件换簿。业务格式的转换由宿主完成,RustWorkbookDefinition 与 `.einfach.json` 是本轮输入。
|
|
40
|
+
|
|
41
|
+
`workbookChangeAtom` 只保存最近成功事件,不是可靠事件日志。订阅者应同步取走事件,自行排队。
|
|
42
|
+
事件包含 connectionId、operationId、revision、source、kind 和各 sheetId 的真实修改 ranges。
|
|
43
|
+
source 是 user/api/history/import/refresh:宿主通常只把 user/api/history 记为需要保存的用户修改。
|
|
44
|
+
失败、noop、投影、纯重算及异步计算缓存不会生成用户输入事件。跨表剪切包括源、目标和被改写
|
|
45
|
+
公式所在的各自坐标;undo/redo 同样给出真实范围。换簿成功发一次 import,失败保留旧簿。
|
|
46
|
+
导入会分配新 sheetId;从同 Store 的 `workbookDocumentAtom` 读取当前表目录,不沿用旧连接的 ID。
|
|
47
|
+
|
|
48
|
+
值输入变更可按事件范围读 typed 增量;元数据请用既有原生 export 保存。空 ranges 表示表元数据,
|
|
49
|
+
非空 ranges 也可能是格式/尺寸的全轴范围,超过逻辑画布或读预算,不能无条件原样传给 typed read。
|
|
50
|
+
格式、规则、保护、表目录等不由 typed cell read 完整表达。
|
|
51
|
+
`${kind}.committed-unmapped` 且 changes 为空表示已提交后的整簿失效,必须 export/重同步。
|
|
52
|
+
|
|
53
|
+
read/write/configure 都返回 `status: 'ok' | 'error'`。写成功给 changed/revision,可附 displayError:
|
|
54
|
+
原生已提交而展示失败不能当作回滚。连接断线导致 error.commitStatus 为 unknown 时先读回确认,
|
|
55
|
+
不可盲重试。旧连接结果不进入新簿。事件通道本身失效时不能保证送达,宿主需恢复和读回。
|
|
56
|
+
|
|
57
|
+
hostControls 默认 `{ readOnly: false, busy: false, allowSheetStructure: true }`。
|
|
58
|
+
readOnly 拒绝所有持久修改;busy 拒绝用户/历史、允许明确 api/refresh 更新;结构策略拒绝 sheet
|
|
59
|
+
增删改名移动与行列插删及相关历史回放。它们不是工作簿保存内容,不生成 dirty 事件。
|
|
60
|
+
原生保护始终生效;宿主锁解除不会解除原生保护,允许区也不能越过宿主 readOnly。
|
|
61
|
+
导出、typed 读取和查询在 readOnly 下仍可使用。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 兼容与发行检查
|
|
2
|
+
|
|
3
|
+
首版支持现代浏览器、React/react-dom 18.3、Einfach core/react `^0.4.0`、UI Core `^0.2.0`,
|
|
4
|
+
提供 ESM 与公开声明。构建工具要求 Node 22.19+。本轮以 Vite 8.3.4 与 Rspack 2.2.9 验证。
|
|
5
|
+
不承诺 SSR、CJS、React 19、旧 Einfach Store、任意 CSP/CDN 或旧浏览器兼容。
|
|
6
|
+
一个 Store 同时只属于一个工作簿;不同组件用不同 Store,避免重复 core/UI Core 模块身份。
|
|
7
|
+
样式限定组件根,不是 Shadow DOM,不承诺抵御宿主对内部选择器的高优先级覆盖。
|
|
8
|
+
|
|
9
|
+
已知非阻断限制:当前 Rspack 消费构建中的工具栏、语言控件字号大于 Vite,状态区可能多行。
|
|
10
|
+
两者的实际包场景没有发现入口缺失、文案裁断或功能阻断,但首版不承诺跨打包器像素一致。
|
|
11
|
+
此差异已登记为样式一致性 Minor,后续单独收敛;本轮不为它修改冻结中的产品或降低测试断言。
|
|
12
|
+
|
|
13
|
+
React 18当前候选的包级44项及同候选最终完整浏览器门禁均已通过。2026-10-23唯一最终序列
|
|
14
|
+
自然退出0:370文件2679/2679、同JSON主绑定1026/1026,零失败、跳过、重试或flaky;
|
|
15
|
+
6276个冻结输入结束零差异。真实包44项与嵌入18项包含在该次完整运行中。
|
|
16
|
+
历史attempt2的两处输入长停顿本次均未复现,原因仍unknown,不能声称已完成卡顿修复;
|
|
17
|
+
历史attempt3的格式重开、向左填充及冻结插入三项失败经定向收敛后在本次完整序列均通过。
|
|
18
|
+
最终完整门禁已获独审APPROVED_WITH_CONCERNS,004/验收7/PKG-13本地通过,原I2按其完整门禁定义关闭;
|
|
19
|
+
历史卡顿原因及修复仍未证实。本地验收时尚未推送,推送状态以Git/最终交接为准;未npm发布。
|
|
20
|
+
原始失败与各候选冻结见本任务004报告。
|
|
21
|
+
本段是完整回归结束后的docs-only状态更新。已验tarball与消费者内文档保持打包时快照,
|
|
22
|
+
未为状态文字重新build或pack,既有tgz不包含本次新增文字。
|
|
23
|
+
|
|
24
|
+
仓库根命令:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
pnpm --filter @einfach-excel/excel-wasm build:wasm:both
|
|
28
|
+
pnpm build:publish
|
|
29
|
+
pnpm prepare:package-consumers
|
|
30
|
+
pnpm --filter @einfach-excel/react-excel exec playwright test --config playwright.package.config.ts
|
|
31
|
+
pnpm --filter @einfach-excel/react-excel e2e # 准备仓外消费者,再运行 demo + embedding + package-host 全部用例
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
pack 准备脚本在 mktemp 副本运行现有 Changesets version + lockfile 流程,pnpm pack 五个发行包。
|
|
35
|
+
源码仍为原版本,模拟发行是 React 0.1.0 与 fixed 组 Core/styles/TS core/WASM 0.2.0。
|
|
36
|
+
Vite/Rspack 安装的是 tarball 与 registry 包;无源码 alias、workspace link、宏插件或消费者 Rust。
|
|
37
|
+
消费者只安装 React、UI Core、WASM 三份 tarball;另外两包仅验证关联发行计划,不进入 React 依赖树。
|
|
38
|
+
依赖树、构建/声明日志、tarball SHA 和临时路径在 `.codex-artifacts/react-excel-package-004/`。
|
|
39
|
+
`consumers.json` 可续跑静态 server 和包 E2E,测试使用生产构建后的页面。
|
|
40
|
+
默认完整 Playwright 配置包含这两个 server,包测试不会只被采集却无法实际执行。
|
|
41
|
+
|
|
42
|
+
发行准备检查:
|
|
43
|
+
|
|
44
|
+
1. 构建匹配 Rust 源码的 lite/full WASM,验证 default/lite/native/browser 与公开 API 快照。
|
|
45
|
+
2. 根静态门禁、全量 Vitest、Core/React 类型和根 build 通过。
|
|
46
|
+
3. 验 tarball 的 JS/声明/CSS/Worker/WASM/许可证、依赖闭包与 strict peer 安装。
|
|
47
|
+
4. 运行仓外 Vite/Rspack、千行多表、宿主 API/控制/隔离/资源与完整 React DOM 回归,保存同次 JSON。
|
|
48
|
+
5. 核对 FEATURES 的原主绑定与新增操作,保留失败历史,不拼接多份报告冒充单次全绿。
|
|
49
|
+
6. 另行授权后创建/合并 Version PR,再另行执行 npm 发布。本地验收时实现已分批提交但尚未推送,
|
|
50
|
+
推送状态以Git/最终交接为准;未npm发布。
|
|
51
|
+
|
|
52
|
+
React 的 private:false 与 publishConfig 仅准备元数据。pending changesets 留在工作区,不能在工作区
|
|
53
|
+
运行 release:version 消费它们。现有 publish workflow 在主分支有 changeset 时开 Version PR,
|
|
54
|
+
无 changeset 时会直接发布,故未来版本应用/合并/发布仍需独立授权。
|
|
55
|
+
根 build:publish 显式执行 React build:lib;React 不声明旧 Rollup 发现器使用的冗余 module 字段,
|
|
56
|
+
保留 type:module、main、exports.import,避免 ESM-only 库被旧 CJS+ESM 扫描覆盖。
|
|
57
|
+
|
|
58
|
+
包沿用仓库 MIT 许可,随包包含 LICENSE、NOTICE 与生成的第三方 Worker 许可证正文。
|
|
59
|
+
Lingui/React/Einfach 等外部依赖保留自身许可,本轮不改变仓库授权。
|
package/package.json
CHANGED
|
@@ -1,6 +1,91 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@einfach-excel/react-excel",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "React workbook product powered by the Einfach Rust/WASM engine",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./style.css": "./dist/style.css",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"docs/package",
|
|
20
|
+
"LICENSE",
|
|
21
|
+
"NOTICE"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/allroad88888888/einfach-excel.git",
|
|
27
|
+
"directory": "excel/react-excel"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"sideEffects": [
|
|
33
|
+
"**/*.css"
|
|
34
|
+
],
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=22.19.0"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@lingui/core": "6.9.1",
|
|
40
|
+
"@lingui/react": "6.9.1"
|
|
41
|
+
},
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"@einfach/core": "^0.4.0",
|
|
44
|
+
"@einfach/react": "^0.4.0",
|
|
45
|
+
"@einfach-excel/spreadsheet-ui-core": "^0.2.0",
|
|
46
|
+
"react": "^18.3.1",
|
|
47
|
+
"react-dom": "^18.3.1"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@einfach/core": "^0.4.0",
|
|
51
|
+
"@einfach/react": "^0.4.0",
|
|
52
|
+
"@lingui/cli": "6.9.1",
|
|
53
|
+
"@lingui/format-po": "6.9.1",
|
|
54
|
+
"@lingui/vite-plugin": "6.9.1",
|
|
55
|
+
"@playwright/test": "1.64.0",
|
|
56
|
+
"@testing-library/jest-dom": "^6.4.5",
|
|
57
|
+
"@testing-library/react": "^16.3.0",
|
|
58
|
+
"@types/node": "^22.19.0",
|
|
59
|
+
"@types/react": "^18.3.20",
|
|
60
|
+
"@types/react-dom": "^18.3.6",
|
|
61
|
+
"@vitejs/plugin-react": "6.1.2",
|
|
62
|
+
"jsdom": "^25.0.1",
|
|
63
|
+
"react": "^18.3.1",
|
|
64
|
+
"react-dom": "^18.3.1",
|
|
65
|
+
"typescript": "^5.7.2",
|
|
66
|
+
"vite": "8.3.4",
|
|
67
|
+
"vitest": "5.0.5",
|
|
68
|
+
"@einfach-excel/canvas-cells": "1.0.0",
|
|
69
|
+
"@einfach-excel/spreadsheet-ui-core": "0.2.0",
|
|
70
|
+
"@einfach-excel/react-cells": "1.0.0"
|
|
71
|
+
},
|
|
72
|
+
"scripts": {
|
|
73
|
+
"build": "pnpm build:lib && pnpm build:demo",
|
|
74
|
+
"build:lib": "vite build --config vite.lib.config.ts && node scripts/build-declarations.mjs && node ../../scripts/generate-package-notices.mjs && node scripts/verify-package-artifact.mjs",
|
|
75
|
+
"build:demo": "vite build",
|
|
76
|
+
"dev": "vite",
|
|
77
|
+
"e2e": "node ../../scripts/check-react-e2e-features.mjs && pnpm package:prepare && playwright test",
|
|
78
|
+
"e2e:serial": "pnpm e2e --workers=1",
|
|
79
|
+
"e2e:input-stall": "playwright test --config playwright.input-stall.config.ts",
|
|
80
|
+
"e2e:install": "playwright install chromium",
|
|
81
|
+
"package:prepare": "node ../../scripts/prepare-react-package-consumers.mjs",
|
|
82
|
+
"e2e:package": "pnpm package:prepare && playwright test --config playwright.package.config.ts",
|
|
83
|
+
"i18n:extract": "lingui extract --clean",
|
|
84
|
+
"i18n:check": "lingui compile --strict",
|
|
85
|
+
"test": "vitest run",
|
|
86
|
+
"test:package": "vitest run test/package test/page/workbook-runtime-provider.test.tsx && tsc -p tsconfig.package-test.json",
|
|
87
|
+
"verify:package-artifact": "node scripts/verify-package-artifact.mjs && node scripts/check-package-contents.mjs",
|
|
88
|
+
"test:watch": "vitest",
|
|
89
|
+
"typecheck": "tsc -p tsconfig.json --noEmit --pretty false"
|
|
90
|
+
}
|
|
6
91
|
}
|