@xlcalc/vue 0.0.0-stage → 0.21.2
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/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +75 -2
- package/dist/abort.d.ts +6 -0
- package/dist/components/CellDraft.vue.d.ts +7 -0
- package/dist/components/CellEditor.vue.d.ts +3 -0
- package/dist/components/ColourSwatches.vue.d.ts +13 -0
- package/dist/components/DialogShell.vue.d.ts +37 -0
- package/dist/components/ExplainPanel.vue.d.ts +3 -0
- package/dist/components/FilterPopover.vue.d.ts +3 -0
- package/dist/components/FindBar.vue.d.ts +3 -0
- package/dist/components/FormatBorders.vue.d.ts +14 -0
- package/dist/components/FormatColour.vue.d.ts +19 -0
- package/dist/components/FormatDialog.vue.d.ts +24 -0
- package/dist/components/FormulaBar.vue.d.ts +3 -0
- package/dist/components/FunctionList.vue.d.ts +28 -0
- package/dist/components/FunctionTip.vue.d.ts +14 -0
- package/dist/components/InsertFunction.vue.d.ts +9 -0
- package/dist/components/OutlineCell.vue.d.ts +8 -0
- package/dist/components/OutlineLevels.vue.d.ts +7 -0
- package/dist/components/SheetGrid.vue.d.ts +3 -0
- package/dist/components/SheetMarks.vue.d.ts +3 -0
- package/dist/components/SheetMenu.vue.d.ts +3 -0
- package/dist/components/SheetRow.vue.d.ts +18 -0
- package/dist/components/SheetTabs.vue.d.ts +3 -0
- package/dist/components/SheetToolbar.vue.d.ts +43 -0
- package/dist/components/SheetView.vue.d.ts +56 -0
- package/dist/components/ValidationAlert.vue.d.ts +16 -0
- package/dist/components/ValidationDropdown.vue.d.ts +33 -0
- package/dist/components/ValidationPrompt.vue.d.ts +16 -0
- package/dist/components/cf-icons.d.ts +6 -0
- package/dist/components/context.d.ts +4 -0
- package/dist/components/dom.d.ts +7 -0
- package/dist/components/icons.d.ts +33 -0
- package/dist/components/popup.d.ts +29 -0
- package/dist/components/toolbar-icons.d.ts +24 -0
- package/dist/contract/memory.d.ts +108 -0
- package/dist/contract/messages.d.ts +260 -0
- package/dist/contract/source.d.ts +433 -0
- package/dist/contract/view.d.ts +108 -0
- package/dist/contract.d.ts +9 -0
- package/dist/core/ask.d.ts +2 -0
- package/dist/core/autocomplete.d.ts +28 -0
- package/dist/core/cell-style.d.ts +33 -0
- package/dist/core/cell-view.d.ts +104 -0
- package/dist/core/clip.d.ts +43 -0
- package/dist/core/commands.d.ts +47 -0
- package/dist/core/conditional.d.ts +16 -0
- package/dist/core/editing.d.ts +85 -0
- package/dist/core/explain.d.ts +36 -0
- package/dist/core/fill.d.ts +42 -0
- package/dist/core/filter.d.ts +72 -0
- package/dist/core/find.d.ts +53 -0
- package/dist/core/formula.d.ts +41 -0
- package/dist/core/function-tip.d.ts +34 -0
- package/dist/core/geometry.d.ts +55 -0
- package/dist/core/keys.d.ts +8 -0
- package/dist/core/list-keys.d.ts +4 -0
- package/dist/core/list.d.ts +17 -0
- package/dist/core/menu.d.ts +155 -0
- package/dist/core/merge.d.ts +19 -0
- package/dist/core/navigation.d.ts +72 -0
- package/dist/core/outline.d.ts +34 -0
- package/dist/core/point.d.ts +34 -0
- package/dist/core/ref-paint.d.ts +21 -0
- package/dist/core/selection.d.ts +45 -0
- package/dist/core/sheet.d.ts +774 -0
- package/dist/core/state.d.ts +107 -0
- package/dist/core/storage.d.ts +6 -0
- package/dist/core/totals.d.ts +16 -0
- package/dist/core/validation.d.ts +95 -0
- package/dist/core/viewport.d.ts +83 -0
- package/dist/core/windows.d.ts +102 -0
- package/dist/entry.d.ts +3 -0
- package/dist/failure.d.ts +5 -0
- package/dist/filter-key.d.ts +3 -0
- package/dist/find-match.d.ts +24 -0
- package/dist/format-cells.d.ts +85 -0
- package/dist/frame.d.ts +5 -0
- package/dist/grid-ref.d.ts +3 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +12767 -0
- package/dist/lines.d.ts +16 -0
- package/dist/local/find.d.ts +15 -0
- package/dist/local/index.d.ts +3 -0
- package/dist/local/locale.d.ts +5 -0
- package/dist/local/outcome.d.ts +21 -0
- package/dist/local/query.d.ts +23 -0
- package/dist/local/source.d.ts +4 -0
- package/dist/local/types.d.ts +37 -0
- package/dist/local/validation.d.ts +8 -0
- package/dist/local/window.d.ts +16 -0
- package/dist/local/xlsx.d.ts +23 -0
- package/dist/local.js +1025 -0
- package/dist/locale-ref.d.ts +7 -0
- package/dist/locales.d.ts +3 -0
- package/dist/memory-outline.d.ts +31 -0
- package/dist/memory-query.d.ts +26 -0
- package/dist/memory-source.d.ts +3 -0
- package/dist/memory-validation.d.ts +17 -0
- package/dist/messages.d.ts +6 -0
- package/dist/number-formats.d.ts +13 -0
- package/dist/rect.d.ts +9 -0
- package/dist/ru-RU-BVeg6JGM.js +931 -0
- package/dist/sheet-query.d.ts +22 -0
- package/dist/stats.d.ts +8 -0
- package/dist/style.css +2 -0
- package/dist/toolbar.d.ts +39 -0
- package/dist/typed-entry-2l9Ay-hV.js +4559 -0
- package/dist/window-size.d.ts +4 -0
- package/docs/api.md +520 -0
- package/docs/autocomplete.md +60 -0
- package/docs/checks.md +40 -0
- package/docs/clipboard.md +48 -0
- package/docs/editing.md +97 -0
- package/docs/example-app.md +26 -0
- package/docs/find-replace.md +26 -0
- package/docs/list-mode.md +86 -0
- package/docs/local.md +94 -0
- package/docs/quick-start.md +221 -0
- package/docs/sheets.md +61 -0
- package/docs/toolbar.md +72 -0
- package/docs/validation.md +41 -0
- package/docs/view.md +50 -0
- package/package.json +92 -4
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CellValue } from 'xlcalc/contract';
|
|
2
|
+
import type { SheetFilter } from './contract/source.js';
|
|
3
|
+
/** What the display filter reads of a sheet: where its rows end, a cell's displayed text ('' when empty) and its value. */
|
|
4
|
+
export interface QuerySheet {
|
|
5
|
+
readonly maxRow: number;
|
|
6
|
+
textAt(row: number, col: number): string;
|
|
7
|
+
valueAt(row: number, col: number): CellValue | undefined;
|
|
8
|
+
}
|
|
9
|
+
/** Whether a filter requests anything: a sort, or a condition on a column (text of spaces requests nothing). */
|
|
10
|
+
export declare function filterActive(filter: SheetFilter | undefined): filter is SheetFilter;
|
|
11
|
+
/** The columns a filter reads: those of its conditions and of its sort. */
|
|
12
|
+
export declare function filterColumns(filter: SheetFilter): number[];
|
|
13
|
+
/** The sheet's rows in display order: the header rows as they are, then the rows that match every condition, sorted when requested (stable, empty cells last), with text in `locale`'s order. */
|
|
14
|
+
export declare function visibleList(sheet: QuerySheet, filter: SheetFilter, locale?: string): number[];
|
|
15
|
+
/** A column's funnel list: its displayed texts with their counts over the rows the other columns' conditions keep, '' for empty cells, in the sort's order. */
|
|
16
|
+
export declare function columnList(sheet: QuerySheet, col: number, filter: SheetFilter, locale?: string): {
|
|
17
|
+
values: {
|
|
18
|
+
text: string;
|
|
19
|
+
count: number;
|
|
20
|
+
}[];
|
|
21
|
+
more: number;
|
|
22
|
+
};
|
package/dist/stats.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CellValue } from 'xlcalc/contract';
|
|
2
|
+
import type { RangeStats } from './contract/source.js';
|
|
3
|
+
/** The totals of no cells. */
|
|
4
|
+
export declare const noStats: () => RangeStats;
|
|
5
|
+
/** A cell that displays nothing and contains no value (formulas aside, which the caller handles where they count). */
|
|
6
|
+
export declare const isBlank: (text: string | undefined, value: CellValue | undefined) => boolean;
|
|
7
|
+
/** Adds a cell to the totals: a blank one does not count; a number goes into the sum, min and max. */
|
|
8
|
+
export declare function addCell(st: RangeStats, text: string, value: CellValue | undefined): void;
|
package/dist/style.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.xs-icon{flex-shrink:0;width:14px;height:14px}.xs-tool{width:24px;height:22px;color:var(--xs-muted);cursor:pointer;background:0 0;border:0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.xs-tool:hover:not(:disabled),.xs-tool-on{background:var(--xs-head-bg);color:var(--xs-fg)}.xs-tool:disabled{opacity:.4;cursor:default}.xs-button{border:1px solid var(--xs-grid);background:var(--xs-bg);color:var(--xs-fg);font:inherit;cursor:pointer;border-radius:6px;justify-content:center;align-items:center;gap:6px;padding:5px 12px;display:inline-flex}.xs-button:hover:not(:disabled){background:var(--xs-head-bg)}.xs-button-main{border-color:var(--xs-accent);background:var(--xs-accent);color:var(--xs-on-accent)}.xs-button-main:hover:not(:disabled){background:color-mix(in srgb, var(--xs-accent) 88%, #000)}.xs-button:disabled{opacity:.5;cursor:default}.xs-button:focus-visible{outline:2px solid var(--xs-accent);outline-offset:2px}.xs-field,.xs-address{border:1px solid var(--xs-grid);background:var(--xs-bg);height:26px;color:var(--xs-fg);font:inherit;border-radius:4px;outline:none;padding:0 8px}.xs-field:focus,.xs-address:focus{border-color:var(--xs-accent)}.xs-field-s{height:22px;padding:0 4px}.xs-field-m{height:24px}.xs-field-l{height:28px}.xs-swatches{--xs-swatch:20px;grid-template-columns:repeat(10, var(--xs-swatch));gap:4px;display:grid}.xs-swatch{width:var(--xs-swatch);height:var(--xs-swatch);cursor:pointer;border:1px solid #0000002e;border-radius:3px;padding:0}.xs-swatch[aria-pressed=true]{outline:2px solid var(--xs-accent);outline-offset:1px}.xs-touch .xs-swatches{--xs-swatch:var(--xs-touch-target);grid-template-columns:repeat(5, var(--xs-swatch));gap:6px}.xs-touch .xs-tool{width:var(--xs-touch-target);height:var(--xs-touch-target)}.xs-touch .xs-tool .xs-icon{width:18px;height:18px}.xs-touch .xs-button{min-width:var(--xs-touch-target);min-height:var(--xs-touch-target);font-size:14px}.xs-touch .xs-field,.xs-touch .xs-address{height:var(--xs-touch-target);font-size:16px}.xs-main{flex:auto;min-height:0;display:flex}.xs-main>.xs-body{min-width:0}.xs-narrow .xs-main{flex-direction:column}.xs-explain{flex:0 0 var(--xs-explain-w,340px);border-left:1px solid var(--xs-grid);background:var(--xs-bg);flex-direction:column;min-width:0;max-width:50%;min-height:0;display:flex}.xs-narrow .xs-explain{flex-basis:var(--xs-explain-h,45%);border-top:1px solid var(--xs-grid);border-left:0;max-width:none}.xs-explain-head{border-bottom:1px solid var(--xs-grid);background:var(--xs-bar-bg);flex-shrink:0;align-items:center;gap:6px;padding:3px 4px 3px 10px;display:flex}.xs-explain-title{flex-shrink:0;font-weight:600}.xs-explain-place{min-width:0;color:var(--xs-muted);text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.xs-explain-busy{color:var(--xs-muted)}.xs-explain-body{overscroll-behavior:contain;-webkit-user-select:text;user-select:text;flex:auto;min-height:0;padding:6px 0;overflow:auto}.xs-explain-note{color:var(--xs-muted);margin:0;padding:4px 10px}.xs-explain-line{padding:2px 10px 2px calc(10px + var(--xs-explain-depth,0) * 14px);background:repeating-linear-gradient(to right, var(--xs-grid) 0 1px, transparent 1px 14px) no-repeat 14px 0 / calc(var(--xs-explain-depth,0) * 14px) 100%;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.45}.xs-explain-ref{color:var(--xs-link);font:inherit;text-align:left;text-underline-offset:2px;cursor:pointer;background:0 0;border:0;padding:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xs-explain-ref:hover,.xs-explain-ref:focus-visible{outline:none;text-decoration-style:solid}.xs-explain-from{color:var(--xs-muted)}.xs-touch .xs-explain-line{min-height:var(--xs-touch-target);flex-wrap:wrap;align-items:center;display:flex}.xs-touch .xs-explain-ref{min-width:var(--xs-touch-target);min-height:var(--xs-touch-target);text-align:center}.xs-popover{z-index:var(--xs-z-menu);border:1px solid var(--xs-grid);background:var(--xs-bg);width:280px;color:var(--xs-fg);font-size:var(--xs-font-size);box-shadow:var(--xs-shadow-menu);border-radius:6px;flex-direction:column;gap:6px;padding:8px;display:flex;position:fixed}.xs-popover-full{border:0;border-radius:0;width:auto;padding:12px;font-size:15px;inset:0}.xs-popover-head{align-items:center;gap:4px;display:flex}.xs-popover-title{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:600;overflow:hidden}.xs-popover-input{width:100%}.xs-popover-search{background:var(--xs-head-bg)}.xs-values{border:1px solid var(--xs-grid);border-radius:4px;max-height:320px;overflow-y:auto}.xs-popover-full .xs-values{flex:auto;max-height:none}.xs-values-note{margin:0;padding:6px 8px}.xs-value{cursor:pointer;align-items:center;gap:6px;padding:3px 8px;display:flex}.xs-popover-full .xs-value{padding:8px 10px}.xs-value:hover{background:var(--xs-head-bg)}.xs-value-all{border-bottom:1px solid var(--xs-grid);font-weight:600}.xs-value-text{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.xs-popover-foot{gap:6px;display:flex}.xs-popover-full .xs-popover-foot .xs-button{flex:1 1 0;padding:10px;font-size:15px}.xs-touch .xs-value{min-height:var(--xs-touch-target)}.xs-modal-back{z-index:var(--xs-z-modal);background:var(--xs-backdrop);-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.xs-modal-back.xs-modal-alert{z-index:var(--xs-z-alert)}.xs-modal-back *,.xs-modal-back :before,.xs-modal-back :after{box-sizing:border-box}.xs-modal{background:var(--xs-bg);max-height:calc(100vh - 32px);color:var(--xs-fg);font:var(--xs-font-size) var(--xs-font);box-shadow:var(--xs-shadow-modal);border-radius:8px;flex-direction:column;display:flex}.xs-modal:focus{outline:none}.xs-modal p{margin:0}.xs-modal-title{font-weight:600}.xs-narrow .xs-modal-full{padding:0}.xs-narrow .xs-modal-full>.xs-modal{border-radius:0;width:100%;height:100%;max-height:none}.xs-fmt{width:min(600px,100%)}.xs-fmt-head{justify-content:space-between;align-items:center;padding:8px 8px 4px 14px;display:flex}.xs-fmt-title{font-size:14px}.xs-tool.xs-fmt-x{width:26px;height:26px}.xs-fmt-tabs{border-bottom:1px solid var(--xs-grid);flex-wrap:wrap;padding:0 10px;display:flex}.xs-fmt-tab{color:var(--xs-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;padding:6px 10px}.xs-fmt-tab[aria-selected=true]{border-bottom-color:var(--xs-accent);color:var(--xs-fg)}.xs-fmt-body{flex:auto;min-height:320px;padding:12px 14px;overflow:auto}.xs-fmt-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));align-items:start;gap:12px;display:grid}.xs-fmt-stack{flex-direction:column;gap:12px;min-width:0;display:flex}.xs-fmt-wide{grid-column:1/-1}.xs-fmt-field{flex-direction:column;gap:4px;min-width:0;display:flex}.xs-fmt-label{color:var(--xs-muted)}.xs-fmt-category{color:var(--xs-muted);margin:0}.xs-fmt-category b{color:var(--xs-fg);font-weight:600}.xs-field.xs-fmt-input,.xs-field.xs-fmt-select{width:100%;min-width:0;padding:0 6px}.xs-fmt-input[readonly],.xs-fmt-input:disabled{background:var(--xs-head-bg);color:var(--xs-muted)}.xs-fmt-input[aria-invalid=true]{border-color:var(--xs-error)}.xs-fmt-check,.xs-fmt-choice{cursor:pointer;align-items:center;gap:6px;display:flex}.xs-fmt-choice{border-radius:4px;padding:3px 4px}.xs-fmt-choice:hover{background:var(--xs-head-bg)}.xs-fmt-box{border:1px solid var(--xs-grid);border-radius:6px;flex-direction:column;gap:8px;min-width:0;margin:0;padding:8px 10px 10px;display:flex}.xs-fmt-box legend{color:var(--xs-muted);padding:0 4px}.xs-fmt-list{flex-direction:column;max-height:240px;display:flex;overflow:auto}.xs-fmt-error{color:var(--xs-error);grid-column:1/-1;margin:0;font-size:12px}.xs-fmt-foot{border-top:1px solid var(--xs-grid);justify-content:flex-end;gap:8px;padding:10px 14px;display:flex}.xs-button.xs-fmt-btn{min-width:84px;font-size:inherit;padding:5px 14px}.xs-fmt-colour{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.xs-fmt-none{border:1px solid var(--xs-grid);background:var(--xs-bg);color:var(--xs-fg);font:inherit;cursor:pointer;border-radius:4px;padding:3px 10px}.xs-fmt-none[aria-pressed=true]{outline:2px solid var(--xs-accent);outline-offset:1px}.xs-field.xs-fmt-hex{width:110px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.xs-fmt-lines{grid-template-columns:1fr 1fr;gap:2px;display:grid}.xs-fmt-line{height:22px;color:var(--xs-fg);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;padding:0 6px}.xs-fmt-line svg{width:100%;height:8px;display:block}.xs-fmt-line[aria-checked=true]{border-color:var(--xs-accent);background:var(--xs-sel-tint)}.xs-fmt-presets{flex-wrap:wrap;gap:8px;display:flex}.xs-fmt-preset,.xs-fmt-edge{border:1px solid var(--xs-grid);background:var(--xs-bg);color:var(--xs-fg);font:inherit;cursor:pointer;border-radius:4px;justify-content:center;align-items:center;gap:4px;display:inline-flex}.xs-fmt-preset{flex-direction:column;padding:4px 10px}.xs-fmt-preset .xs-icon,.xs-fmt-edge .xs-icon{width:22px;height:22px}.xs-fmt-edge{width:30px;height:30px;padding:0}.xs-fmt-edge[aria-pressed=true]{border-color:var(--xs-accent);background:var(--xs-sel-tint)}.xs-fmt-preset:disabled,.xs-fmt-edge:disabled{opacity:.35;cursor:default}.xs-fmt-edges{grid-template-columns:auto 1fr;gap:6px;display:grid}.xs-fmt-edge-col{flex-direction:column;grid-area:1/1;justify-content:space-between;gap:4px;display:flex}.xs-fmt-edge-row{grid-area:2/2;justify-content:space-between;gap:4px;display:flex}.xs-fmt-preview{border:1px solid var(--xs-grid);background:var(--xs-bg);border-radius:4px;grid-area:1/2;min-height:110px;padding:10px;display:grid}.xs-fmt-pcell{color:var(--xs-muted);justify-content:center;align-items:center;font-size:11px;display:flex}@media (width<=599px){.xs-modal-back.xs-fmt-back{padding:0}.xs-modal.xs-fmt{border-radius:0;width:100%;height:100%;max-height:none}.xs-fmt-body{min-height:0}}@media (width<=599px),(pointer:coarse){.xs-modal.xs-fmt{font-size:15px}.xs-tool.xs-fmt-x{width:var(--xs-touch-target);height:var(--xs-touch-target)}.xs-fmt-tab{min-height:var(--xs-touch-target);flex:auto}.xs-field.xs-fmt-input,.xs-field.xs-fmt-select{height:var(--xs-touch-target);font-size:16px}.xs-fmt-check,.xs-fmt-choice,.xs-fmt-none,.xs-fmt-line,.xs-fmt-preset,.xs-button.xs-fmt-btn{min-width:var(--xs-touch-target);min-height:var(--xs-touch-target)}.xs-fmt-check input,.xs-fmt-choice input{width:20px;height:20px}.xs-fmt-line svg{height:10px}.xs-fmt-edge{width:var(--xs-touch-target);height:var(--xs-touch-target)}.xs-fmt .xs-swatches{--xs-swatch:var(--xs-touch-target);grid-template-columns:repeat(5, var(--xs-swatch));gap:6px}.xs-fmt-edges .xs-fmt-preview{min-height:150px}}.xs-sheet{--xs-prompt-bg:#ffffe1;--xs-prompt-fg:#1f2328;--xs-prompt-line:#767676;--xs-alert-stop:#d13438;--xs-alert-warning:#ffb900;--xs-alert-information:#0f6cbd}.xs-vd{width:0;height:0;position:absolute;top:0;left:0}.xs-vd-anchor{z-index:3;align-items:flex-end;display:flex;position:absolute}.xs-vd-arrow{border:1px solid var(--xs-freeze-line);background:var(--xs-head-bg);width:17px;height:min(18px,100%);min-height:12px;color:var(--xs-fg);cursor:default;border-radius:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.xs-vd-arrow:hover,.xs-vd-arrow[aria-expanded=true]{border-color:var(--xs-accent);background:var(--xs-head-on-bg)}.xs-vd-arrow svg{width:10px;height:10px}.xs-vd-list{z-index:8}.xs-vd-item{padding:0 4px}.xs-vd-touch .xs-vd-anchor{align-items:center}.xs-vd-touch .xs-vd-arrow{width:var(--xs-touch-target);height:var(--xs-touch-target);flex-shrink:0}.xs-vd-touch .xs-vd-arrow svg{width:16px;height:16px}.xs-vd-touch .xs-vd-list{font-size:15px}.xs-vp{z-index:7;box-sizing:border-box;border:1px solid var(--xs-prompt-line);background:var(--xs-prompt-bg);width:max-content;max-width:260px;color:var(--xs-prompt-fg);font:var(--xs-font-size) / 1.35 var(--xs-font);white-space:pre-wrap;overflow-wrap:anywhere;box-shadow:var(--xs-shadow-pop);pointer-events:none;flex-direction:column;gap:2px;padding:4px 7px 5px;display:flex;position:absolute}.xs-va{width:min(420px,100%)}.xs-modal.xs-va{font:13px / 1.4 var(--xs-font)}.xs-va-title{padding:10px 16px 0;font-size:13px}.xs-va-body{align-items:flex-start;gap:14px;padding:14px 16px 6px;display:flex;overflow:auto}.xs-va-icon{flex-shrink:0;width:32px;height:32px}.xs-va-text{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0;padding-top:6px}.xs-modal .xs-va-text p{margin:0 0 10px}.xs-va-foot{flex-wrap:wrap;justify-content:flex-end;gap:8px;padding:10px 16px 14px;display:flex}.xs-button.xs-va-btn{border-radius:4px;min-width:80px;height:28px;padding:0 14px}.xs-touch .xs-modal.xs-va{font-size:15px}.xs-touch .xs-button.xs-va-btn{height:auto;font-size:inherit;flex:1 1 0}.xs-sheet{--xs-fl-line:#7a7a7a}.xs-popup-list{box-sizing:border-box;border:1px solid var(--xs-fl-line);background:var(--xs-bg);color:var(--xs-fg);font:var(--xs-font-size) / 18px var(--xs-font);text-align:left;box-shadow:var(--xs-shadow-pop);cursor:default;margin:0;padding:0;list-style:none;position:absolute;overflow-y:auto}.xs-popup-item{text-overflow:ellipsis;white-space:nowrap;height:18px;overflow:hidden}.xs-popup-on{background:var(--xs-accent);color:var(--xs-on-accent)}.xs-popup-list.xs-popup-touch{line-height:var(--xs-touch-target)}.xs-popup-touch .xs-popup-item{height:var(--xs-touch-target);padding:0 12px}.xs-fl{z-index:15}.xs-fl-item{padding:0 6px}.xs-ft{z-index:15;box-sizing:border-box;border:1px solid var(--xs-fl-line);background:var(--xs-bg);width:max-content;color:var(--xs-fg);font:calc(var(--xs-font-size) - 1px) / 18px var(--xs-font);text-align:left;white-space:normal;overflow-wrap:anywhere;box-shadow:var(--xs-shadow-pop);cursor:default;padding:1px 6px;position:absolute}.xs-ft-on{font-weight:700}.xs-ifn{gap:8px;width:min(420px,100%);padding:14px}.xs-ifn>*{flex-shrink:0}.xs-ifn-field{flex-direction:column;gap:4px;display:flex}.xs-ifn .xs-ifn-list{border:1px solid var(--xs-grid);border-radius:4px;flex:0 auto;height:194px;min-height:0;position:relative;overflow-y:auto}.xs-ifn-item{cursor:default;-webkit-user-select:none;user-select:none;align-items:center;height:24px;padding:0 8px;display:flex}.xs-ifn-on{background:var(--xs-accent);color:var(--xs-on-accent)}.xs-ifn-syntax{overflow-wrap:anywhere;min-height:1.35em;font-weight:600}.xs-ifn-about{min-height:2.7em;color:var(--xs-muted)}.xs-narrow .xs-ifn .xs-ifn-list{flex:1 1 0;height:auto}.xs-touch .xs-ifn{font-size:15px}.xs-touch .xs-ifn-item{height:var(--xs-touch-target);padding:0 12px}.xs-sheet{--xs-outline-w:0px;--xs-outline-h:0px;--xs-outline-bg:var(--xs-bar-bg);--xs-outline-line:#8c8c8c;--xs-outline-tick:5px;--xs-outline-button:13px;--xs-outline-button-bg:var(--xs-bg);--xs-outline-button-fg:#3c4043;--xs-outline-button-border:#9aa0a6}.xs-table th.xs-ol,.xs-table th.xs-ol-levels,.xs-table th.xs-ol-corner{background:var(--xs-outline-bg);border-bottom:0;padding:0}.xs-ol-rows{z-index:2;position:sticky;left:0}.xs-table th.xs-ol-columns{z-index:4;border-right:0;border-bottom:1px solid var(--xs-grid);position:sticky;top:0}.xs-ol-rows.xs-ol-fz,.xs-ol-columns.xs-ol-fz{z-index:5}.xs-table th.xs-ol-corner,.xs-table th.xs-ol-levels{z-index:6;border-bottom:1px solid var(--xs-grid);position:sticky;top:0;left:0}.xs-table th.xs-ol-levels-rows{top:var(--xs-outline-h)}.xs-table th.xs-ol-over-nums{left:var(--xs-outline-w)}.xs-ol-mark{pointer-events:none;position:absolute;inset:0}.xs-ol-mark>span{border:0 solid var(--xs-outline-line);position:absolute}.xs-ol-rows .xs-ol-line{top:0;bottom:0;left:var(--xs-ol-at);border-left-width:1px}.xs-ol-rows .xs-ol-tick{top:0;left:var(--xs-ol-at);width:var(--xs-outline-tick);border-top-width:1px}.xs-ol-rows.xs-ol-before .xs-ol-tick{border-top-width:0;border-bottom-width:1px;top:auto;bottom:0}.xs-ol-rows .xs-ol-end{top:0;left:var(--xs-ol-at);height:calc(50% - (var(--xs-outline-button) + 1px) / 2);border-left-width:1px}.xs-ol-rows.xs-ol-before .xs-ol-end{top:auto;bottom:0}.xs-ol-columns .xs-ol-line{left:0;right:0;top:var(--xs-ol-at);border-top-width:1px}.xs-ol-columns .xs-ol-tick{left:0;top:var(--xs-ol-at);height:var(--xs-outline-tick);border-left-width:1px}.xs-ol-columns.xs-ol-before .xs-ol-tick{border-left-width:0;border-right-width:1px;left:auto;right:0}.xs-ol-columns .xs-ol-end{left:0;top:var(--xs-ol-at);width:calc(50% - (var(--xs-outline-button) + 1px) / 2);border-top-width:1px}.xs-ol-columns.xs-ol-before .xs-ol-end{left:auto;right:0}.xs-ol-btn{width:var(--xs-outline-button);height:var(--xs-outline-button);border:1px solid var(--xs-outline-button-border);background-color:var(--xs-outline-button-bg);color:var(--xs-outline-button-fg);font:600 9px / 1 var(--xs-font);cursor:pointer;pointer-events:auto;background-position:50%;background-repeat:no-repeat;border-radius:2px;justify-content:center;align-items:center;padding:0;display:flex;position:absolute}.xs-ol-btn:hover:not(:disabled){background-color:var(--xs-head-on-bg)}.xs-ol-btn:disabled{cursor:default}.xs-ol-minus{background-image:linear-gradient(var(--xs-outline-button-fg), var(--xs-outline-button-fg));background-size:7px 1px}.xs-ol-plus{background-image:linear-gradient(var(--xs-outline-button-fg), var(--xs-outline-button-fg)), linear-gradient(var(--xs-outline-button-fg), var(--xs-outline-button-fg));background-size:7px 1px,1px 7px}.xs-ol-rows .xs-ol-btn,.xs-ol-levels-rows .xs-ol-btn{top:calc(50% - (var(--xs-outline-button) + 1px) / 2);left:calc(var(--xs-ol-at) - (var(--xs-outline-button) - 1px) / 2)}.xs-ol-columns .xs-ol-btn,.xs-ol-levels-columns .xs-ol-btn{top:calc(var(--xs-ol-at) - (var(--xs-outline-button) - 1px) / 2);left:calc(50% - (var(--xs-outline-button) + 1px) / 2)}.xs-menu{z-index:var(--xs-z-menu);border:1px solid var(--xs-grid);background:var(--xs-bg);min-width:180px;max-width:calc(100vw - 8px);color:var(--xs-fg);font:var(--xs-font-size) var(--xs-font);box-shadow:var(--xs-shadow-menu);border-radius:6px;flex-direction:column;padding:4px 0;display:flex;position:fixed}.xs-menu-caption{color:var(--xs-muted);text-overflow:ellipsis;white-space:nowrap;padding:2px 12px 4px;font-size:11.5px;overflow:hidden}.xs-menu-sep{border-top:1px solid var(--xs-grid);margin:4px 0}.xs-menu-item{min-height:26px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;padding:0 12px;display:flex}.xs-menu>.xs-menu-item{white-space:nowrap}.xs-menu-item:hover:not(:disabled),.xs-menu-item:focus-visible{background:var(--xs-head-on-bg);outline:none}.xs-menu-item:disabled{color:var(--xs-muted);opacity:.6;cursor:default}.xs-dialog{gap:10px;width:min(320px,100%);padding:14px}.xs-dialog-field{flex-direction:column;gap:6px;display:flex}.xs-dialog-error{color:var(--xs-error)}.xs-dialog-list{border:1px solid var(--xs-grid);border-radius:4px;flex-direction:column;max-height:50vh;display:flex;overflow-y:auto}.xs-dialog-choices{flex-direction:column;gap:2px;display:flex}.xs-dialog-choice{cursor:pointer;align-items:center;gap:8px;min-height:26px;display:flex}.xs-dialog-foot{justify-content:flex-end;gap:6px;display:flex}.xs-touch .xs-menu{font-size:15px}.xs-touch .xs-menu-item{min-height:var(--xs-touch-target);padding:0 16px}.xs-touch .xs-dialog{font-size:15px}.xs-touch .xs-dialog-choice{min-height:var(--xs-touch-target)}.xs-sheet,.xs-toolbar,.xs-fmt-back{--xs-bg:#fff;--xs-fg:#1f2328;--xs-muted:#6b7280;--xs-grid:#e1e3e6;--xs-head-bg:#f3f4f6;--xs-head-fg:#5f6368;--xs-head-on-bg:#d3e3fd;--xs-head-on-fg:#0b57d0;--xs-accent:#1a73e8;--xs-sel-tint:#1a73e81f;--xs-link:#1558d6;--xs-note:#dc2626;--xs-flash:#facc15d9;--xs-hit:#facc1573;--xs-freeze-line:#9aa0a6;--xs-border-auto:#000;--xs-table-head-bg:#e8eef8;--xs-table-line:#8faadc;--xs-locked:#8b8f96;--xs-pending:#8b8f96;--xs-error:#b42318;--xs-bar-bg:#fafafa;--xs-message-bg:#1f2328;--xs-message-fg:#fff;--xs-copy-line:#1a73e8;--xs-fill-frame:#5f6368;--xs-on-accent:#fff;--xs-font:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--xs-font-size:12.5px;--xs-shadow-pop:0 2px 6px #0003;--xs-shadow-menu:0 6px 20px #0000002e;--xs-shadow-modal:0 10px 30px #00000040;--xs-backdrop:#00000040;--xs-z-menu:40;--xs-z-modal:50;--xs-z-alert:55;--xs-touch-target:44px}.xs-sheet{background:var(--xs-bg);height:100%;min-height:0;color:var(--xs-fg);font-family:var(--xs-font);font-size:var(--xs-font-size);flex-direction:column;display:flex;position:relative}.xs-sheet *,.xs-sheet :before,.xs-sheet :after{box-sizing:border-box}.xs-muted{color:var(--xs-muted)}.xs-bar{border-bottom:1px solid var(--xs-grid);background:var(--xs-bar-bg);flex-shrink:0;align-items:flex-start;gap:6px;padding:4px 8px;display:flex}.xs-bar .xs-address{text-align:center;flex-shrink:0;width:96px;height:22px;padding:0 6px;font-size:11.5px;font-weight:500}.xs-fx-line{flex:auto;align-items:flex-start;gap:2px;min-width:0;display:flex}.xs-fx{--xs-fx-lines:1;min-width:0;min-height:22px;font-size:var(--xs-font-size);flex:auto;line-height:1.35;position:relative}.xs-fx-open{--xs-fx-lines:5}.xs-fx-input,.xs-fx-layer{width:100%;height:calc(var(--xs-fx-lines) * 1.35em + 5px);min-height:22px;font:inherit;letter-spacing:normal;text-align:start;white-space:pre-wrap;overflow-wrap:break-word;word-break:normal;border:1px solid #0000;border-radius:3px;margin:0;padding:2px 4px 1px;display:block;overflow:hidden auto}.xs-fx-input{border-color:var(--xs-grid);background:var(--xs-bg);color:#0000;caret-color:var(--xs-fg);resize:none;outline:none}.xs-fx-input::selection{color:#0000}.xs-fx-input:focus{border-color:var(--xs-accent)}.xs-fx-layer{color:var(--xs-fg);pointer-events:none;scrollbar-color:transparent transparent;position:absolute;top:0;left:0}.xs-fx-go{cursor:pointer}.xs-ref-go{text-decoration:underline}.xs-bar-link{max-width:40%;color:var(--xs-link);text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;padding-top:3px;font-size:11.5px;overflow:hidden}.xs-tools{flex-shrink:0;align-items:center;gap:4px;display:flex}.xs-notice{border-bottom:1px solid var(--xs-grid);background:var(--xs-head-bg);color:var(--xs-muted);flex-shrink:0;padding:2px 8px;font-size:11.5px}.xs-find{border-bottom:1px solid var(--xs-grid);background:var(--xs-head-bg);flex-direction:column;flex-shrink:0;gap:4px;padding:4px 8px;display:flex}.xs-find-row{flex-wrap:wrap;align-items:center;gap:4px 6px;display:flex}.xs-find-nav{align-items:center;gap:2px;margin-left:auto;display:inline-flex}.xs-find-toggle:not([aria-expanded=true]) .xs-icon{transform:rotate(-90deg)}.xs-find-more{gap:4px 14px;font-size:12px}.xs-find-opt{white-space:nowrap;cursor:pointer;align-items:center;gap:5px;display:inline-flex}.xs-find-scope{background:var(--xs-sel-tint);white-space:nowrap;border-radius:11px;align-items:center;padding-left:8px;display:inline-flex}.xs-find-input{flex:140px;min-width:0}.xs-find-status{color:var(--xs-muted);white-space:nowrap;flex-shrink:0;font-size:11.5px}.xs-body{flex-direction:column;flex:auto;min-height:0;display:flex;position:relative}.xs-scroller{overscroll-behavior:contain;outline:none;flex:auto;min-height:0;position:relative;overflow:auto}.xs-empty{color:var(--xs-muted);margin:0;padding:24px}.xs-table{border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:var(--xs-font-size);-webkit-user-select:none;user-select:none;line-height:1.3}.xs-table th,.xs-table td{border-right:1px solid var(--xs-grid);border-bottom:1px solid var(--xs-grid);white-space:nowrap;vertical-align:top;padding:1px 5px}.xs-table th{overflow:hidden}.xs-table .xs-spacer td{border:0;padding:0}.xs-table th.xs-head,.xs-table th.xs-corner{padding:0 5px;line-height:23px}.xs-head,.xs-num,.xs-corner{background:var(--xs-head-bg);color:var(--xs-head-fg);text-align:center;cursor:pointer;font-size:11.5px;font-weight:500}.xs-head.xs-on,.xs-num.xs-on{background:var(--xs-head-on-bg);color:var(--xs-head-on-fg)}.xs-head{top:var(--xs-outline-h);z-index:4;position:sticky}.xs-table th.xs-head{overflow:visible}.xs-head-label{text-overflow:ellipsis;display:block;overflow:hidden}.xs-num{left:var(--xs-outline-w);z-index:2;position:sticky}.xs-corner{top:var(--xs-outline-h);left:var(--xs-outline-w);z-index:6;position:sticky}.xs-fz-row{z-index:3;background-color:var(--xs-bg);position:sticky}.xs-fz-col{z-index:2;background-color:var(--xs-bg);position:sticky}.xs-fz-corner{z-index:5;background-color:var(--xs-bg);position:sticky}.xs-head.xs-fz-col{z-index:5;background-color:var(--xs-head-bg)}.xs-num.xs-fz-corner{left:var(--xs-outline-w);z-index:5;background-color:var(--xs-head-bg)}.xs-head.xs-fz-col.xs-on,.xs-num.xs-fz-corner.xs-on{background-color:var(--xs-head-on-bg)}.xs-table .xs-fz-edge-b{border-bottom-color:var(--xs-freeze-line)}.xs-table .xs-fz-edge-r{border-right-color:var(--xs-freeze-line)}.xs-in{align-items:flex-end;display:flex;overflow:hidden}.xs-in>*{white-space:nowrap;flex:auto;min-width:0}.xs-in.xs-wrap>*{white-space:pre-wrap;overflow-wrap:anywhere}.xs-in.xs-top{align-items:flex-start}.xs-in.xs-mid{align-items:center}.xs-num .xs-in{justify-content:center}.xs-in.xs-iconic{margin-left:-3px}.xs-in>.xs-cf-icon{flex:none;width:1.28em;height:1.28em;margin-right:3px}.xs-cell{background-color:var(--xs-bg)}.xs-thead{background-color:var(--xs-table-head-bg);font-weight:700}.xs-spill .xs-in{position:relative;overflow:visible}.xs-in>.xs-ov{align-items:inherit;pointer-events:none;display:flex;position:absolute;top:0;bottom:0;overflow:hidden}.xs-ov>span{white-space:nowrap}.xs-cell .xs-link{color:var(--xs-link);font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;padding:0;text-decoration:underline}.xs-cell .xs-deadlink{text-decoration-style:dotted;-webkit-text-decoration-color:var(--xs-muted);text-decoration-color:var(--xs-muted);cursor:help}.xs-cell.xs-active{outline:2px solid var(--xs-accent);outline-offset:-2px}.xs-cell.xs-active.xs-locked{outline-color:var(--xs-locked);outline-style:dashed}.xs-cell.xs-pending .xs-in>*{color:var(--xs-pending);font-style:italic}.xs-cell.xs-flash:not(.xs-fz-row,.xs-fz-col,.xs-fz-corner),.xs-cell.xs-hit-now:not(.xs-fz-row,.xs-fz-col,.xs-fz-corner){position:relative}.xs-cell.xs-hit-now:before,.xs-cell.xs-flash:before{content:"";pointer-events:none;background:var(--xs-flash);position:absolute;inset:0}.xs-cell.xs-hit-now:before{animation:.5s ease-in-out infinite alternate xs-pulse}.xs-cell.xs-flash:before{opacity:0;animation:.5s ease-in-out 4 alternate xs-pulse}@keyframes xs-pulse{0%{opacity:.1}to{opacity:1}}.xs-funnel{width:17px;height:17px;color:var(--xs-head-fg);cursor:pointer;opacity:0;background:0 0;border:0;border-radius:3px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.xs-funnel .xs-icon{width:12px;height:12px}.xs-head:hover .xs-funnel,.xs-funnel.xs-on,.xs-funnel.xs-open{opacity:1}.xs-funnel.xs-on{color:var(--xs-accent)}.xs-funnel:hover,.xs-funnel.xs-open{background:var(--xs-head-on-bg)}.xs-head.xs-filtered{color:var(--xs-fg)}.xs-sortmark{margin-left:2px;font-size:10px}.xs-head.xs-sortable{cursor:pointer}.xs-head.xs-sortable:hover{color:var(--xs-fg)}.xs-list-sort{color:var(--xs-accent)}.xs-sorthint{opacity:0}.xs-head.xs-sortable:hover .xs-sorthint{opacity:.6}.xs-drill .xs-in span,.xs-rowlink .xs-in span{color:var(--xs-link);cursor:pointer}.xs-drill .xs-in span{text-underline-offset:3px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xs-drill:hover .xs-in span,.xs-rowlink:hover .xs-in span{text-decoration:underline}.xs-table .xs-total{z-index:4;border-top:1px solid var(--xs-freeze-line);background:var(--xs-head-bg);height:24px;color:var(--xs-fg);text-overflow:ellipsis;padding:0 5px;font-weight:600;line-height:23px;position:sticky;bottom:0;overflow:hidden}.xs-table .xs-total.xs-fz-col,.xs-table .xs-total-bar,.xs-table .xs-total-num{z-index:5}.xs-table .xs-total-bar{left:0}.xs-table .xs-total-num{left:var(--xs-outline-w)}@media (hover:none){.xs-funnel{opacity:.7}}.xs-grip{cursor:col-resize;touch-action:none;width:7px;height:100%;position:absolute;top:0;right:-3px}.xs-grip-row{cursor:row-resize;width:100%;height:7px;top:auto;bottom:-3px;right:0}.xs-grip:hover{background:var(--xs-accent);opacity:.35}.xs-editor{border:2px solid var(--xs-accent);background:var(--xs-bg);color:var(--xs-fg);font:var(--xs-font-size) / 1.3 var(--xs-font);white-space:pre;resize:none;box-shadow:var(--xs-shadow-pop);outline:none;margin:0;padding:1px 5px;position:absolute;overflow:hidden}.xs-editor-idle{opacity:0;pointer-events:none;border:0;width:1px;height:1px;padding:0;top:0;left:0}.xs-ants{pointer-events:none;background-image:linear-gradient(90deg, var(--xs-copy-line) 50%, var(--xs-bg) 50%), linear-gradient(90deg, var(--xs-copy-line) 50%, var(--xs-bg) 50%), linear-gradient(0deg, var(--xs-copy-line) 50%, var(--xs-bg) 50%), linear-gradient(0deg, var(--xs-copy-line) 50%, var(--xs-bg) 50%);background-position:0 0,0 100%,0 0,100% 0;background-repeat:repeat-x,repeat-x,repeat-y,repeat-y;background-size:8px 2px,8px 2px,2px 8px,2px 8px;animation:.5s linear infinite xs-ants;position:absolute}@keyframes xs-ants{to{background-position:8px 0,-8px 100%,0 -8px,100% 8px}}@media (prefers-reduced-motion:reduce){.xs-ants{animation:none}}.xs-fill-handle{cursor:crosshair;touch-action:none;width:13px;height:13px;position:absolute;transform:translate(-50%,-50%)}.xs-fill-handle:after{content:"";border:1px solid var(--xs-bg);background:var(--xs-accent);width:7px;height:7px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.xs-fill-handle.xs-fill-touch{width:var(--xs-touch-target);height:var(--xs-touch-target)}.xs-fill-handle.xs-fill-touch:after{width:10px;height:10px}.xs-fill-handle.xs-fill-dragging:after{visibility:hidden}.xs-fill-frame{border:2px dashed var(--xs-fill-frame);pointer-events:none;position:absolute}.xs-loading{border:1px solid var(--xs-grid);background:color-mix(in srgb, var(--xs-bg) 92%, transparent);color:var(--xs-muted);pointer-events:none;z-index:8;border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:11.5px;display:inline-flex;position:sticky;bottom:8px;left:8px}.xs-spin{animation:.9s linear infinite xs-spin}@keyframes xs-spin{to{transform:rotate(360deg)}}.xs-wait{z-index:12;background:color-mix(in srgb, var(--xs-bg) 92%, transparent);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:24px;display:flex;position:absolute;inset:0}.xs-wait p{margin:0}.xs-wait-icon{width:22px;height:22px;color:var(--xs-muted)}.xs-wait-title{font-weight:600}.xs-wait-seconds{color:var(--xs-muted);font-variant-numeric:tabular-nums}.xs-bottom{border-top:1px solid var(--xs-grid);background:var(--xs-bar-bg);flex-shrink:0;align-items:center;gap:8px;padding:3px 8px;display:flex}.xs-tabs{scrollbar-width:thin;flex:auto;gap:2px;min-width:0;display:flex;overflow-x:auto}.xs-tab{color:var(--xs-muted);font:12px var(--xs-font);cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:5px;flex-shrink:0;padding:4px 10px}.xs-tab:hover{background:var(--xs-head-bg)}.xs-tab-on{background:var(--xs-bg);box-shadow:inset 0 -2px 0 var(--xs-accent);color:var(--xs-fg);font-weight:600}.xs-tab-input{border:1px solid var(--xs-accent);outline:none;min-width:0}.xs-tab,.xs-table th,.xs-fx-held{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.xs-tab-add{align-self:center;margin-left:2px}.xs-filter-status{min-width:0;color:var(--xs-muted);flex-shrink:1;align-items:center;gap:2px;font-size:11.5px;display:flex}.xs-filter-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.xs-stats{min-width:0;color:var(--xs-muted);text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;margin-left:auto;font-size:11.5px;overflow:hidden}.xs-message{z-index:20;background:var(--xs-message-bg);max-width:calc(100% - 24px);color:var(--xs-message-fg);font-size:var(--xs-font-size);box-shadow:var(--xs-shadow-menu);border-radius:6px;align-items:center;gap:8px;padding:6px 6px 6px 12px;display:flex;position:absolute;bottom:40px;left:50%;transform:translate(-50%)}.xs-message .xs-tool{color:inherit}.xs-message .xs-tool:hover{color:inherit;background:#ffffff26}.xs-fallback{color:var(--xs-muted);text-align:center;flex-direction:column;flex:auto;justify-content:center;align-items:center;gap:12px;padding:24px;display:flex}.xs-fallback p{margin:0}.xs-narrow .xs-bar{flex-wrap:wrap;gap:4px;padding:4px 6px}.xs-narrow .xs-bar .xs-address{width:64px}.xs-narrow .xs-fx-line{flex-basis:100%;order:3}.xs-narrow .xs-tools{margin-left:auto}.xs-narrow .xs-bar-link{display:none}.xs-narrow .xs-bottom{flex-wrap:wrap;row-gap:2px}.xs-narrow .xs-tabs{flex:100%}.xs-narrow .xs-stats{max-width:55%}.xs-touch .xs-bar .xs-address{height:var(--xs-touch-target);font-size:16px}.xs-touch .xs-fx{min-height:var(--xs-touch-target);font-size:16px}.xs-touch .xs-fx-input,.xs-touch .xs-fx-layer{height:calc(var(--xs-fx-lines) * 1.35em + 24px);min-height:var(--xs-touch-target);padding:11px 6px}.xs-touch .xs-fx:not(.xs-fx-open) .xs-fx-input,.xs-touch .xs-fx:not(.xs-fx-open) .xs-fx-layer{height:var(--xs-touch-target);padding-block:0;line-height:42px}.xs-touch .xs-bar-link{line-height:var(--xs-touch-target);padding-top:0}.xs-touch .xs-tab{min-height:var(--xs-touch-target);padding:0 14px;font-size:14px}.xs-touch .xs-find-more{font-size:14px}.xs-touch .xs-find-opt{min-height:var(--xs-touch-target)}.xs-touch .xs-find-opt input{width:20px;height:20px}.xs-touch .xs-funnel-tool.xs-tool-on{color:var(--xs-accent)}.xs-toolbar{z-index:30;border-bottom:1px solid var(--xs-grid);background:var(--xs-bar-bg);min-width:0;color:var(--xs-fg);font-family:var(--xs-font);font-size:var(--xs-font-size);-webkit-tap-highlight-color:transparent;flex-shrink:0;align-items:center;padding:3px 8px;display:flex;position:relative}.xs-toolbar *,.xs-toolbar :before,.xs-toolbar :after{box-sizing:border-box}.xs-tb-row{flex-wrap:wrap;align-items:center;gap:2px 0;min-width:0;display:flex}.xs-tb-group{flex-wrap:wrap;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.xs-tb-group+.xs-tb-group,.xs-tb-row+.xs-tb-row>.xs-tb-group:first-child{border-left:1px solid var(--xs-grid)}.xs-tb-row:first-child>.xs-tb-group:first-child{padding-left:0}.xs-tb-split{align-items:center;display:inline-flex;position:relative}.xs-toolbar:not(.xs-touch) .xs-tb-caret{width:14px}.xs-toolbar:not(.xs-touch) .xs-tb-caret .xs-icon{width:10px;height:10px}.xs-tool.xs-tb-wide{gap:1px;width:auto;padding:0 3px}.xs-tb-down{width:10px;height:10px}.xs-tb-select{max-width:140px;font-size:12px}.xs-tb-pop{z-index:1;border:1px solid var(--xs-grid);background:var(--xs-bg);box-shadow:var(--xs-shadow-menu);border-radius:6px;flex-direction:column;gap:4px;padding:6px;display:flex;position:absolute;top:calc(100% + 3px);left:0}.xs-tb-item{min-height:26px;color:var(--xs-fg);font:var(--xs-font-size) var(--xs-font);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:8px;padding:3px 8px;display:flex}.xs-tb-item:hover,.xs-tb-item[aria-pressed=true]{background:var(--xs-head-bg)}.xs-toolbar:not(.xs-touch) .xs-swatches{--xs-swatch:18px;gap:3px}.xs-tb-narrow .xs-tb-row{flex-wrap:nowrap;flex:auto}.xs-tb-more{margin-left:auto}.xs-tb-menu{border-bottom:1px solid var(--xs-grid);background:var(--xs-bar-bg);box-shadow:var(--xs-shadow-menu);flex-wrap:wrap;gap:6px 0;padding:6px 8px;display:flex;position:absolute;top:100%;left:0;right:0}.xs-tb-menu>.xs-tb-group{border-left:0;padding:0 12px 0 0}.xs-tb-narrow .xs-tb-split{position:static}.xs-tb-narrow .xs-tb-pop{top:calc(100% + 2px);left:8px;right:8px}.xs-touch .xs-tb-select{max-width:none}.xs-touch .xs-tb-item{min-height:var(--xs-touch-target);font-size:15px}.xs-touch .xs-tool.xs-tb-wide{min-width:56px}
|
|
2
|
+
/*$vite$:1*/
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { BorderLine, CellRect, CellStyle, StylePatch } from 'xlcalc/contract';
|
|
2
|
+
import type { FormatPatch } from './contract/source.js';
|
|
3
|
+
export type FontToggle = 'bold' | 'italic' | 'underline';
|
|
4
|
+
export type HorizontalAlign = 'left' | 'center' | 'right';
|
|
5
|
+
export type BorderKind = 'all' | 'outside' | 'bottom' | 'none';
|
|
6
|
+
/** Excel's palette: the Office theme colors, then the standard ones. */
|
|
7
|
+
export declare const PALETTE: string[];
|
|
8
|
+
/** The colors Excel's split buttons apply before one is picked. */
|
|
9
|
+
export declare const FIRST_FONT_COLOUR = "#FF0000";
|
|
10
|
+
export declare const FIRST_FILL_COLOUR = "#FFFF00";
|
|
11
|
+
/** The edges of a selection that Excel's Border tab draws on: its outline and the lines inside it, horizontal and vertical. */
|
|
12
|
+
export type BorderEdge = 'top' | 'bottom' | 'left' | 'right' | 'insideH' | 'insideV';
|
|
13
|
+
export declare const BORDER_EDGES: readonly BorderEdge[];
|
|
14
|
+
/** Lines on edges: a line, or null to remove the edge's line. */
|
|
15
|
+
export type EdgeLines = Partial<Record<BorderEdge, BorderLine | null>>;
|
|
16
|
+
/** A color as the palette and the pickers compare it: `#RRGGBB` in uppercase, null for none. */
|
|
17
|
+
export declare const upperColour: (c: string | null | undefined) => string | null;
|
|
18
|
+
/** Whether two lines are the same: their style and color. */
|
|
19
|
+
export declare const sameLine: (a: BorderLine | null | undefined, b: BorderLine | null | undefined) => boolean;
|
|
20
|
+
/** The edges a range has: the inside lines only across more than one row or more than one column. */
|
|
21
|
+
export declare function edgesOf(r: CellRect): BorderEdge[];
|
|
22
|
+
/**
|
|
23
|
+
* Lines on the edges of a selection as Excel draws them: an outline edge on its row or column of cells, an inside line on
|
|
24
|
+
* the sides of both cells it lies between, each as a patch in one call and so a single undo step; one patch over the entire
|
|
25
|
+
* range when every edge it has gets the same line, or none. Nothing for a reference that is not a range.
|
|
26
|
+
*/
|
|
27
|
+
export declare function edgePatches(ref: string, lines: EdgeLines): FormatPatch[];
|
|
28
|
+
/** Whether the active cell is bold, italic or underlined, as Excel shows its buttons pressed. */
|
|
29
|
+
export declare function fontOn(style: CellStyle | undefined, what: FontToggle): boolean;
|
|
30
|
+
/** Bold, italic or underline over the selection: off when the active cell has it, otherwise on, as Excel toggles them. */
|
|
31
|
+
export declare function fontToggle(style: CellStyle | undefined, what: FontToggle): StylePatch;
|
|
32
|
+
/** A horizontal alignment over the selection; clicked again on a cell already aligned so, it returns to General. */
|
|
33
|
+
export declare function alignToggle(style: CellStyle | undefined, h: HorizontalAlign): StylePatch;
|
|
34
|
+
export declare function wrapToggle(style: CellStyle | undefined): StylePatch;
|
|
35
|
+
/**
|
|
36
|
+
* Borders over a selection as the toolbar's menu draws them: every cell's four sides, the outline (its four edges, one
|
|
37
|
+
* patch each, in one call and so a single undo step), the bottom edge, or none. Nothing for a reference that is not a range.
|
|
38
|
+
*/
|
|
39
|
+
export declare function borderPatches(ref: string, kind: BorderKind): FormatPatch[];
|