@perspective-dev/viewer-datagrid 4.2.0 → 4.3.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/dist/cdn/perspective-viewer-datagrid.js +5 -4
- package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
- package/dist/css/perspective-viewer-datagrid.css +1 -1
- package/dist/esm/custom_elements/datagrid.d.ts +1 -0
- package/dist/esm/data_listener/format_tree_header.d.ts +1 -0
- package/dist/esm/event_handlers/row_select_click.d.ts +1 -1
- package/dist/esm/perspective-viewer-datagrid.js +3 -3
- package/dist/esm/perspective-viewer-datagrid.js.map +3 -3
- package/dist/esm/types.d.ts +3 -8
- package/package.json +2 -2
- package/src/less/regular_table.less +39 -22
- package/src/ts/custom_elements/datagrid.ts +5 -0
- package/src/ts/data_listener/format_tree_header.ts +16 -0
- package/src/ts/data_listener/index.ts +24 -4
- package/src/ts/event_handlers/row_select_click.ts +19 -16
- package/src/ts/event_handlers/sort.ts +10 -7
- package/src/ts/model/create.ts +8 -4
- package/src/ts/plugin/draw.ts +1 -0
- package/src/ts/style_handlers/body.ts +5 -0
- package/src/ts/style_handlers/column_header.ts +9 -8
- package/src/ts/types.ts +3 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ts/index.ts", "../../src/ts/types.ts", "../../src/ts/model/create.ts", "../../src/ts/data_listener/formatter_cache.ts", "../../src/ts/data_listener/format_cell.ts", "../../src/ts/data_listener/format_tree_header.ts", "../../src/ts/data_listener/index.ts", "../../src/ts/color_utils.ts", "../../src/ts/model/toolbar.ts", "../../src/ts/model/column_overrides.ts", "../../src/ts/style_handlers/column_header.ts", "../../src/ts/event_handlers/sort.ts", "../../src/ts/event_handlers/expand_collapse.ts", "../../src/ts/event_handlers/header_click.ts", "../../src/ts/event_handlers/click/edit_click.ts", "../../src/ts/style_handlers/focus.ts", "../../src/ts/event_handlers/keydown/edit_keydown.ts", "../../src/ts/event_handlers/click.ts", "../../src/ts/event_handlers/focus.ts", "../../src/ts/get_cell_config.ts", "../../src/ts/event_handlers/row_select_click.ts", "../../src/ts/event_handlers/deselect_all.ts", "../../src/ts/event_handlers/dispatch_click.ts", "../../src/ts/event_handlers/select_region.ts", "../../src/ts/style_handlers/editable.ts", "../../src/ts/style_handlers/group_header.ts", "../../src/ts/style_handlers/table_cell/cell_flash.ts", "../../src/ts/style_handlers/table_cell/numeric.ts", "../../src/ts/style_handlers/table_cell/string.ts", "../../src/ts/style_handlers/table_cell/datetime.ts", "../../src/ts/style_handlers/table_cell/boolean.ts", "../../src/ts/style_handlers/table_cell/row_header.ts", "../../src/ts/style_handlers/body.ts", "../../src/ts/style_handlers/consolidated.ts", "../../src/ts/plugin/activate.ts", "../../src/ts/plugin/restore.ts", "../../src/ts/plugin/save.ts", "../../src/ts/plugin/draw.ts", "../../src/ts/plugin/column_style_controls.ts", "../css/perspective-viewer-datagrid.css", "../../src/ts/custom_elements/datagrid.ts", "../css/perspective-viewer-datagrid-toolbar.css", "../../src/ts/custom_elements/toolbar.ts"],
|
|
4
|
-
"sourcesContent": ["// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"./custom_elements/datagrid.js\";\nimport { HTMLPerspectiveViewerDatagridToolbarElement } from \"./custom_elements/toolbar.js\";\n\n/******************************************************************************\n *\n * Main\n *\n */\n\ninterface PerspectiveViewerConstructor {\n registerPlugin(tagName: string): void;\n}\n\nasync function _register_element(): Promise<void> {\n customElements.define(\n \"perspective-viewer-datagrid-toolbar\",\n HTMLPerspectiveViewerDatagridToolbarElement,\n );\n\n customElements.define(\n \"perspective-viewer-datagrid\",\n HTMLPerspectiveViewerDatagridPluginElement,\n );\n\n await customElements.whenDefined(\"perspective-viewer\");\n const PerspectiveViewer = customElements.get(\n \"perspective-viewer\",\n ) as unknown as PerspectiveViewerConstructor;\n PerspectiveViewer.registerPlugin(\"perspective-viewer-datagrid\");\n}\n\n_register_element();\n\nexport { PRIVATE_PLUGIN_SYMBOL } from \"./types.js\";\nexport { HTMLPerspectiveViewerDatagridPluginElement };\nexport { HTMLPerspectiveViewerDatagridToolbarElement };\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n View,\n Table,\n ViewConfig,\n ColumnType,\n SortDir,\n ViewWindow,\n} from \"@perspective-dev/client\";\nimport { RegularTableElement } from \"regular-table\";\nimport { CellMetadata, DataResponse } from \"regular-table/dist/esm/types\";\n\n// Re-export types from regular-table for use throughout the codebase\nexport type { RegularTableElement as RegularTable };\n\nexport function get_psp_type(\n model: DatagridModel,\n metadata: CellMetadata,\n): ColumnType {\n if (\n metadata.type === \"body\" ||\n metadata.type === \"column_header\" ||\n metadata.type === \"corner\"\n ) {\n return model._column_types[metadata.x];\n } else {\n return model._row_header_types[(metadata.row_header_x ?? 0) - 1];\n }\n}\n\n// Edit mode for the datagrid\nexport type EditMode =\n | \"READ_ONLY\"\n | \"EDIT\"\n | \"SELECT_COLUMN\"\n | \"SELECT_ROW\"\n | \"SELECT_REGION\";\n\n// Color record for styling - tuple returned by make_color_record\nexport type ColorRecord = [\n string, // hex color\n number, // red\n number, // green\n number, // blue\n string, // gradient\n string, // rgba solid\n string, // rgba transparent\n];\n\nexport type SortTerm = [string, SortDir];\n\n// Selection state for mouse-based region selection\nexport interface SelectionArea {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport interface SelectionState {\n selected_areas: SelectionArea[];\n dirty: boolean;\n CURRENT_MOUSEDOWN_COORDINATES?: { x?: number; y?: number };\n old_selected_areas?: SelectionArea[];\n potential_selection?: SelectionArea;\n}\n\n// Position tracking for cell focus\nexport interface SelectedPosition {\n x: number;\n y: number;\n content?: string;\n}\n\n// Column configuration values from viewer\nexport interface ColumnConfig {\n color?: string;\n pos_fg_color?: string;\n neg_fg_color?: string;\n pos_bg_color?: string;\n neg_bg_color?: string;\n fg_gradient?: number;\n bg_gradient?: number;\n number_fg_mode?: string;\n number_bg_mode?: string;\n string_color_mode?: string;\n datetime_color_mode?: string;\n fixed?: number;\n aggregate_depth?: number;\n column_size_override?: number;\n format?: string;\n date_format?: DateFormatConfig;\n number_format?: NumberFormatConfig;\n}\n\n// Date format configuration for column styling\nexport interface DateFormatConfig {\n format?: \"custom\" | string;\n timeZone?: string;\n dateStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n timeStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n second?: \"numeric\" | \"2-digit\" | \"disabled\";\n minute?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour?: \"numeric\" | \"2-digit\" | \"disabled\";\n day?: \"numeric\" | \"2-digit\" | \"disabled\";\n weekday?: \"narrow\" | \"short\" | \"long\" | \"disabled\";\n month?: \"numeric\" | \"2-digit\" | \"narrow\" | \"short\" | \"long\" | \"disabled\";\n year?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour12?: boolean;\n fractionalSecondDigits?: 1 | 2 | 3;\n}\n\n// Number format configuration for column styling\nexport interface NumberFormatConfig {\n style?: \"decimal\" | \"currency\" | \"percent\" | \"unit\";\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n minimumIntegerDigits?: number;\n minimumSignificantDigits?: number;\n maximumSignificantDigits?: number;\n currency?: string;\n currencyDisplay?: \"code\" | \"symbol\" | \"narrowSymbol\" | \"name\";\n notation?: \"standard\" | \"scientific\" | \"engineering\" | \"compact\";\n compactDisplay?: \"short\" | \"long\";\n useGrouping?: boolean;\n}\n\nexport type ColumnsConfig = Record<string, ColumnConfig>;\n\n// Plugin save state\nexport interface DatagridPluginConfig {\n columns?: ColumnsConfig;\n editable?: boolean;\n scroll_lock?: boolean;\n edit_mode?: EditMode;\n column_size_override?: Record<string, number>;\n}\n\n// Element factory for reusing DOM elements\nexport interface ElemFactory {\n clear(): void;\n get(): HTMLElement;\n}\n\nexport type Schema = Record<string, ColumnType>;\n\n// Model object stored on regular-table\nexport interface DatagridModel {\n _edit_port: number;\n _view: View;\n _table: Table;\n _table_schema: Schema;\n _config: ViewConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _ids: unknown[][];\n _plugin_background: number[];\n _color: ColorRecord;\n _pos_fg_color: ColorRecord;\n _neg_fg_color: ColorRecord;\n _pos_bg_color: ColorRecord;\n _neg_bg_color: ColorRecord;\n _column_paths: string[];\n _column_types: ColumnType[];\n _is_editable: boolean[];\n _edit_mode: EditMode;\n _selection_state: SelectionState;\n _row_header_types: ColumnType[];\n _series_color_map: Map<string, Map<string, number>>;\n _series_color_seed: Map<string, number>;\n _div_factory: ElemFactory;\n _last_window?: ViewWindow;\n _is_old_viewport?: boolean;\n _reverse_columns?: Map<string, number>;\n _reverse_ids?: Map<string, number>;\n last_column_paths?: string[];\n last_meta?: unknown[][];\n last_ids?: unknown[][];\n last_reverse_ids?: Map<string, number>;\n last_reverse_columns?: Map<string, number>;\n get_psp_type(metadata: CellMetadata): ColumnType;\n _column_settings_selected_column?: string;\n}\n\n// Symbol for private plugin data on regular-table\nexport const PRIVATE_PLUGIN_SYMBOL: unique symbol = Symbol(\n \"Perspective Column Config\",\n);\n\n// Data listener function type\nexport type DataListener = (\n regularTable: RegularTableElement,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse>;\n\n// Style listener function type\nexport type StyleListener = () => void;\n\n// Perspective viewer element interface (subset)\nexport interface PerspectiveViewerElement extends HTMLElement {\n getView(): Promise<View>;\n getTable(): Promise<Table>;\n getEditPort(): Promise<number>;\n restore(config: Partial<ViewConfig>): Promise<void>;\n toggleColumnSettings(columnName?: string): Promise<void>;\n hasAttribute(name: string): boolean;\n setSelection(viewport?: ViewWindow): void;\n dispatchEvent(event: Event): boolean;\n children: HTMLCollectionOf<HTMLElement>;\n}\n\n// Toolbar element interface\nexport interface DatagridToolbarElement extends HTMLElement {\n setEditButton(button: HTMLElement): void;\n setScrollLockButton(button: HTMLElement): void;\n}\n\n// Column override for persisting column sizes\nexport type ColumnOverrides = Record<string, number | undefined>;\n\n// Formatter cache types\nexport interface FormatterCacheEntry {\n format(value: unknown): string;\n}\n\nexport type FormatterCache = Map<string, FormatterCacheEntry>;\n\n// Cell config result from getCellConfig\nexport interface CellConfigResult {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\n// Custom event detail types\nexport interface PerspectiveClickDetail {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\nexport interface PerspectiveSelectDetail {\n selected: boolean;\n row: Record<string, unknown>;\n column_names?: string[];\n config: Partial<ViewConfig>;\n}\n\n// Mouse event with handled flag\nexport interface HandledMouseEvent extends MouseEvent {\n handled?: boolean;\n}\n\n// Sort order mappings\nexport type SortRotationOrder = Record<string, SortDir | undefined>;\n\n// Datagrid plugin element interface for toolbar\nexport interface DatagridPluginElement extends HTMLElement {\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n}\n\n// Map types for selected rows and positions\nexport type SelectedRowsMap = WeakMap<RegularTableElement, Set<number>>;\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record } from \"../color_utils.js\";\nimport type {\n ColumnType,\n Table,\n View,\n ViewConfig,\n} from \"@perspective-dev/client\";\nimport {\n type DatagridModel,\n type DatagridPluginElement,\n type RegularTable,\n type Schema,\n type ElemFactory,\n type EditMode,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../types.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\nfunction get_rule(regular: HTMLElement, tag: string, def: string): string {\n const color = window.getComputedStyle(regular).getPropertyValue(tag).trim();\n if (color.length > 0) {\n return color;\n } else {\n return def;\n }\n}\n\nclass ElemFactoryImpl implements ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n clear(): void {\n this._index = 0;\n }\n\n get(): HTMLElement {\n if (!this._elements[this._index]) {\n this._elements[this._index] = document.createElement(this._name);\n }\n const elem = this._elements[this._index];\n this._index += 1;\n return elem;\n }\n}\n\nexport async function createModel(\n this: DatagridPluginElement,\n regular: RegularTable,\n table: Table,\n view: View,\n extend: Partial<DatagridModel> = {},\n): Promise<DatagridModel> {\n const config = (await view.get_config()) as ViewConfig;\n if (this?.model?._config) {\n const old = this.model._config;\n let group_by_changed = old.group_by.length !== config.group_by.length;\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n if (!group_by_changed) {\n for (const lvl in old.group_by) {\n group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];\n }\n }\n\n let split_by_changed = old.split_by.length !== config.split_by.length;\n if (split_by_changed) {\n for (const lvl in old.split_by) {\n split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];\n }\n }\n\n let columns_changed = old.columns.length !== config.columns.length;\n if (columns_changed) {\n for (const lvl in old.columns) {\n columns_changed ||= config.columns[lvl] !== old.columns[lvl];\n }\n }\n\n let filter_changed = old.filter.length !== config.filter.length;\n if (filter_changed) {\n for (const lvl in old.filter) {\n for (const i in config.filter[lvl]) {\n filter_changed ||=\n config.filter[lvl][i as unknown as number] !==\n old.filter[lvl][i as unknown as number];\n }\n }\n }\n\n let sort_changed = old.sort.length !== config.sort.length;\n if (sort_changed) {\n for (const lvl in old.sort) {\n for (const i in config.sort[lvl]) {\n sort_changed ||=\n config.sort[lvl][i as unknown as number] !==\n old.sort[lvl][i as unknown as number];\n }\n }\n }\n\n this._reset_scroll_top = group_by_changed;\n this._reset_scroll_left = split_by_changed;\n this._reset_select =\n group_by_changed ||\n split_by_changed ||\n filter_changed ||\n sort_changed ||\n columns_changed;\n\n this._reset_column_size =\n split_by_changed ||\n group_by_changed ||\n columns_changed ||\n type_changed;\n }\n\n const [table_schema, num_rows, schema, expression_schema, _edit_port] =\n await Promise.all([\n table.schema(),\n view.num_rows(),\n view.schema(),\n view.expression_schema(),\n (this.parentElement as PerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = chroma(\n get_rule(regular, \"--plugin--background\", \"#FFFFFF\"),\n ).rgb();\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--rt-pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--rt-neg-cell--color\", \"#FF5942\"),\n );\n\n const _pos_bg_color = make_color_record(\n blend(_pos_fg_color[0], _plugin_background),\n );\n\n const _neg_bg_color = make_color_record(\n blend(_neg_fg_color[0], _plugin_background),\n );\n\n const _color = make_color_record(\n get_rule(regular, \"--active--color\", \"#ff0000\"),\n );\n\n const _schema: Schema = {\n ...(schema as Schema),\n ...(expression_schema as Schema),\n };\n const _table_schema: Schema = {\n ...(table_schema as Schema),\n ...(expression_schema as Schema),\n };\n\n const _column_paths: string[] = [];\n const _is_editable: boolean[] = [];\n const _column_types: ColumnType[] = [];\n\n const _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n this._edit_button!.dataset.editMode = _edit_mode;\n\n const model: DatagridModel = Object.assign(extend, {\n _edit_port,\n _view: view,\n _table: table,\n _table_schema,\n _config: config,\n _num_rows: num_rows,\n _schema,\n _ids: [],\n _plugin_background,\n _color,\n _pos_fg_color,\n _neg_fg_color,\n _pos_bg_color,\n _neg_bg_color,\n _column_paths,\n _column_types,\n _is_editable,\n _edit_mode,\n _selection_state: {\n selected_areas: [],\n dirty: false,\n },\n _row_header_types: config.group_by.map((column_path) => {\n return _table_schema[column_path];\n }),\n _series_color_map: new Map<string, string>(),\n _series_color_seed: new Map<string, number>(),\n // get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(this.parentElement as PerspectiveViewerElement).bind(\n model,\n regular,\n ) as any,\n {\n virtual_mode: (window\n .getComputedStyle(regular)\n .getPropertyValue(\"--datagrid-virtual-mode\")\n ?.trim() || \"both\") as\n | \"both\"\n | \"horizontal\"\n | \"vertical\"\n | \"none\",\n },\n );\n\n return model;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { ColumnConfig } from \"../types.js\";\n\nexport interface Formatter {\n format(val: unknown): string;\n}\n\nclass BooleanFormatter implements Formatter {\n format(val: unknown): string {\n return val ? \"true\" : \"false\";\n }\n}\n\n// PluginConfig is a subset of ColumnConfig with the formatting properties\ntype PluginConfig = Pick<ColumnConfig, \"date_format\" | \"number_format\">;\n\nconst LEGACY_CONFIG: Record<\n string,\n { format: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions }\n> = {\n float: {\n format: {\n style: \"decimal\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n },\n datetime: {\n format: {\n dateStyle: \"short\",\n timeStyle: \"medium\",\n } as Intl.DateTimeFormatOptions,\n },\n date: {\n format: {\n dateStyle: \"short\",\n } as Intl.DateTimeFormatOptions,\n },\n};\n\nexport class FormatterCache {\n private _formatters: Map<string, Formatter | false>;\n\n constructor() {\n this._formatters = new Map();\n }\n\n private create_datetime_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n if (plugin.date_format?.format !== \"custom\") {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n timeStyle:\n plugin.date_format?.timeStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.timeStyle ?? \"medium\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n } else {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n hour12: plugin.date_format?.hour12 ?? true,\n fractionalSecondDigits:\n plugin.date_format?.fractionalSecondDigits,\n };\n\n if (plugin.date_format?.year !== \"disabled\") {\n options.year = plugin.date_format?.year ?? \"2-digit\";\n }\n if (plugin.date_format?.month !== \"disabled\") {\n options.month = plugin.date_format?.month ?? \"numeric\";\n }\n if (plugin.date_format?.day !== \"disabled\") {\n options.day = plugin.date_format?.day ?? \"numeric\";\n }\n if (\n plugin.date_format?.weekday &&\n plugin.date_format?.weekday !== \"disabled\"\n ) {\n options.weekday = plugin.date_format.weekday;\n }\n if (plugin.date_format?.hour !== \"disabled\") {\n options.hour = plugin.date_format?.hour ?? \"numeric\";\n }\n if (plugin.date_format?.minute !== \"disabled\") {\n options.minute = plugin.date_format?.minute ?? \"numeric\";\n }\n if (plugin.date_format?.second !== \"disabled\") {\n options.second = plugin.date_format?.second ?? \"numeric\";\n }\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n }\n\n private create_date_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"utc\",\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n\n private create_number_formatter(\n type: ColumnType,\n plugin: PluginConfig,\n ): Intl.NumberFormat {\n const format =\n plugin.number_format ??\n (LEGACY_CONFIG[type]?.format as Intl.NumberFormatOptions);\n return new Intl.NumberFormat(navigator.languages as string[], format);\n }\n\n private create_boolean_formatter(\n _type: ColumnType,\n _plugin: PluginConfig,\n ): Formatter {\n return new BooleanFormatter();\n }\n\n get(type: ColumnType, plugin: PluginConfig): Formatter | false | undefined {\n const formatter_key = [\n type,\n ...Object.values(plugin.date_format ?? {}),\n ...Object.values(plugin.number_format ?? {}),\n ].join(\"-\");\n\n if (!this._formatters.has(formatter_key)) {\n if (type === \"date\") {\n this._formatters.set(\n formatter_key,\n this.create_date_formatter(type, plugin),\n );\n } else if (type === \"datetime\") {\n this._formatters.set(\n formatter_key,\n this.create_datetime_formatter(type, plugin),\n );\n } else if (type === \"integer\" || type === \"float\") {\n this._formatters.set(\n formatter_key,\n this.create_number_formatter(type, plugin),\n );\n } else if (type === \"boolean\") {\n this._formatters.set(\n formatter_key,\n this.create_boolean_formatter(type, plugin),\n );\n } else {\n this._formatters.set(formatter_key, false);\n }\n }\n\n return this._formatters.get(formatter_key);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { FormatterCache, Formatter } from \"./formatter_cache.js\";\nimport type { DatagridModel, ColumnsConfig, ColumnConfig } from \"../types.js\";\nimport { ColumnType } from \"@perspective-dev/client\";\n\nconst FORMAT_CACHE = new FormatterCache();\nconst MAX_BAR_WIDTH_PCT = 1;\n\nexport function format_raw(\n type: ColumnType,\n value: ColumnConfig,\n): Formatter | false | undefined {\n return FORMAT_CACHE.get(type, value);\n}\n\n/**\n * Format a single cell's text content as the content of a `<td>` or `<th>`.\n */\nexport function format_cell(\n this: DatagridModel,\n title: string,\n val: unknown,\n plugins: ColumnsConfig = {},\n use_table_schema = false,\n): string | HTMLElement | null {\n if (val === null) {\n return null;\n }\n\n const type: ColumnType = ((use_table_schema && this._table_schema[title]) ||\n this._schema[title] ||\n \"string\") as ColumnType;\n const plugin: ColumnConfig = plugins[title] || {};\n const is_numeric = type === \"integer\" || type === \"float\";\n\n if (is_numeric && plugin?.number_fg_mode === \"bar\") {\n const a = Math.max(\n 0,\n Math.min(\n MAX_BAR_WIDTH_PCT,\n Math.abs((val as number) / plugin.fg_gradient!) *\n MAX_BAR_WIDTH_PCT,\n ),\n );\n\n const div = this._div_factory.get();\n const anchor = (val as number) >= 0 ? \"left\" : \"right\";\n const pct = (a * 100).toFixed(2);\n div.setAttribute(\n \"style\",\n `width:calc(${pct}% - 4px);position:absolute;${anchor}:2px;height:80%;top:10%;pointer-events:none;`,\n );\n\n return div;\n } else if (plugin?.format === \"link\" && type === \"string\") {\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", val as string);\n anchor.setAttribute(\"target\", \"_blank\");\n anchor.textContent = val as string;\n return anchor;\n } else if (plugin?.format === \"bold\" && type === \"string\") {\n const bold = document.createElement(\"b\");\n bold.textContent = val as string;\n return bold;\n } else if (plugin?.format === \"italics\" && type === \"string\") {\n const italic = document.createElement(\"i\");\n italic.textContent = val as string;\n return italic;\n } else {\n const formatter = FORMAT_CACHE.get(type, plugin);\n return formatter ? formatter.format(val) : (val as string);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport type { DatagridModel, RegularTable, ColumnsConfig } from \"../types.js\";\n\ntype RowHeaderCell = string | HTMLElement | { toString(): string };\n\n/**\n * Format a single cell of the `group_by` tree header for __ROW_PATH__ data.\n */\nexport function* format_tree_header_row_path(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<RowHeaderCell[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (let path of paths) {\n const fullPath: unknown[] = [\"TOTAL\", ...path];\n const last = fullPath[fullPath.length - 1];\n let newPath: RowHeaderCell[] = fullPath\n .slice(0, fullPath.length - 1)\n .fill(\"\") as string[];\n const formatted = format_cell.call(\n this,\n row_headers[newPath.length - 1],\n last,\n plugins,\n true,\n );\n\n if (formatted instanceof HTMLElement) {\n newPath = newPath.concat(formatted);\n } else {\n newPath = newPath.concat({ toString: () => formatted as string });\n }\n\n newPath.length = row_headers.length + 1;\n yield newPath;\n }\n}\n\n/**\n * Format a single cell of the `group_by` tree header.\n */\nexport function* format_tree_header(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<unknown[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (const path of paths) {\n const new_path: unknown[] = [\"\"];\n for (const idx in path) {\n new_path.push(\n format_cell.call(\n this,\n row_headers[idx],\n path[idx],\n plugins,\n true,\n ),\n );\n }\n\n yield path;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport {\n format_tree_header,\n format_tree_header_row_path,\n} from \"./format_tree_header.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n RegularTable,\n Schema,\n} from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\ninterface ColumnData {\n __ROW_PATH__?: unknown[][];\n __ID__?: unknown[][];\n [key: string]: unknown[] | undefined;\n}\n\n/**\n * Creates a new DataListener, suitable for passing to `regular-table`'s\n * `.setDataListener()` method. This should be called as a method on the\n * plugin.\n *\n * @returns A data listener for the plugin.\n */\nexport function createDataListener(\n viewer: PerspectiveViewerElement,\n): (\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse> {\n let last_meta: unknown[][] | undefined;\n let last_column_paths: string[] | undefined;\n let last_ids: unknown[][] | undefined;\n let last_reverse_ids: Map<string, number> | undefined;\n let last_reverse_columns: Map<string, number> | undefined;\n\n return async function dataListener(\n this: DatagridModel,\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ): Promise<DataResponse> {\n let columns: ColumnData = {};\n const new_window: ViewWindow = {\n start_row: y0,\n start_col: x0,\n end_row: y1,\n end_col: x1,\n id: true,\n };\n\n let num_columns: number | null = null;\n\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this._is_old_viewport =\n this._last_window?.start_row === y0 &&\n this._last_window?.end_row === y1 &&\n this._last_window?.start_col === x0 &&\n this._last_window?.end_col === x1;\n\n const [x, z] = await Promise.all([\n this._view.to_columns_string(new_window as any),\n this._view.num_columns(),\n ]);\n\n num_columns = z;\n columns = JSON.parse(x as string) as ColumnData;\n const y = Object.keys(columns);\n const new_col_paths = y.filter(\n (x) => x !== \"__ROW_PATH__\" && x !== \"__ID__\",\n );\n\n let changed_cols = false;\n for (let i = 0; i < new_col_paths.length; i++) {\n if (\n this._column_paths[new_window.start_col! + i] !==\n new_col_paths[i]\n ) {\n changed_cols = true;\n this._column_paths[new_window.start_col! + i] =\n new_col_paths[i];\n }\n }\n\n if (changed_cols) {\n const [a, b] = await Promise.all([\n this._view.schema(),\n this._view.expression_schema(),\n ]);\n\n this._schema = { ...(a as Schema), ...(b as Schema) };\n for (let i = 0; i < new_col_paths.length; i++) {\n const column_path_parts = new_col_paths[i].split(\"|\");\n const column =\n column_path_parts[this._config.split_by.length];\n\n this._is_editable[i + new_window.start_col!] =\n !!this._table_schema[column];\n\n this._column_types[i + new_window.start_col!] =\n this._schema[column];\n }\n }\n\n this._last_window = new_window;\n this._ids =\n columns.__ID__ ||\n Array(y1 - y0)\n .fill(null)\n .map((_, index) => [index + y0]);\n\n this._reverse_columns = this._column_paths\n .slice(x0, x1)\n .reduce((acc, x, i) => {\n acc.set(x, i);\n return acc;\n }, new Map<string, number>());\n\n this._reverse_ids = this._ids?.reduce((acc, x, i) => {\n acc.set(x?.join(\"|\"), i);\n return acc;\n }, new Map<string, number>());\n } else {\n this._div_factory.clear();\n num_columns = await this._view.num_columns();\n }\n\n const data: (string | HTMLElement)[][] = [];\n const metadata: unknown[][] = [];\n const column_headers: string[][] = [];\n const column_paths: string[] = [];\n\n const is_settings_open = viewer.hasAttribute(\"settings\");\n for (\n let ipath = x0;\n ipath < Math.min(x1, this._column_paths.length);\n ++ipath\n ) {\n const path = this._column_paths[ipath];\n const path_parts = path.split(\"|\");\n const column = columns[path] || new Array(y1 - y0).fill(null);\n const agg_depth = Math.min(\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL]?.[\n path_parts[this._config.split_by.length]\n ]?.aggregate_depth || 0,\n this._config.group_by.length,\n );\n\n data.push(\n column.map((x, i) => {\n if ((columns?.__ROW_PATH__?.[i]?.length ?? 0) < agg_depth) {\n return \"\";\n } else {\n return format_cell.call(\n this,\n path_parts[this._config.split_by.length],\n x,\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {},\n ) as string | HTMLElement;\n }\n }),\n );\n\n metadata.push(column as unknown[]);\n if (is_settings_open) {\n path_parts.push(\"\");\n }\n\n column_headers.push(path_parts);\n column_paths.push(path);\n }\n\n // Only update the last state if this is not a \"phantom\" call.\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this.last_column_paths = last_column_paths;\n this.last_meta = last_meta;\n this.last_ids = last_ids;\n this.last_reverse_ids = last_reverse_ids;\n this.last_reverse_columns = last_reverse_columns;\n\n last_column_paths = column_paths;\n last_meta = metadata;\n last_ids = this._ids;\n last_reverse_ids = this._reverse_ids;\n last_reverse_columns = this._reverse_columns;\n }\n\n const is_row_path = columns.__ROW_PATH__ !== undefined;\n const row_headers = Array.from(\n (is_row_path\n ? format_tree_header_row_path\n : format_tree_header\n ).call(\n this,\n columns.__ROW_PATH__,\n this._config.group_by,\n regularTable,\n ),\n ) as (string | HTMLElement)[][];\n\n const num_row_headers = row_headers[0]?.length;\n\n const result: DataResponse = {\n num_column_headers:\n this._config.split_by.length + (is_settings_open ? 2 : 1),\n num_row_headers,\n num_rows: this._num_rows,\n num_columns,\n row_headers: row_headers as CellScalar[][], // Add `HTMLElement`\n column_headers,\n data: data as CellScalar[][],\n metadata,\n column_header_merge_depth: Math.max(\n 0,\n this._config.split_by.length,\n ),\n };\n\n return result;\n };\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport type { ColorRecord } from \"./types.js\";\n\nexport function blend(a: string, b: number[]): string {\n return chroma.mix(a, `rgb(${b[0]},${b[1]},${b[2]})`, 0.5).hex();\n}\n\n// AFAICT `chroma-js` has no alpha-aware blending? So we need a function to get\n// the color of a heatmap cell over the background.\nexport function rgbaToRgb(\n [r, g, b, a]: [number, number, number, number],\n source: [number, number, number] = [255, 255, 255],\n): [number, number, number] {\n function f(i: number, c: number): number {\n return ((1 - a) * (source[i] / 255) + a * (c / 255)) * 255;\n }\n\n return [f(0, r), f(1, g), f(2, b)];\n}\n\n// Chroma does this but why bother?\nexport function infer_foreground_from_background([r, g, b]: [\n number,\n number,\n number,\n]): string {\n // TODO Implement dark/light themes.\n return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) > 130\n ? \"#161616\"\n : \"#ffffff\";\n}\n\nfunction make_gradient(chromahex: chroma.Color): string {\n const [r, g, b] = chromahex.rgb();\n const [r1, g1, b1] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") - 15) % 360)\n .rgb();\n const [r2, g2, b2] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") + 15) % 360)\n .rgb();\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\nexport function make_color_record(color: string): ColorRecord {\n const chroma_neg = chroma(color);\n const _neg_grad = make_gradient(chroma_neg);\n const rgb = chroma_neg.rgb();\n return [\n color,\n rgb[0],\n rgb[1],\n rgb[2],\n _neg_grad,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},1)`,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`,\n ];\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { DatagridPluginElement, EditMode } from \"../types.js\";\n\nexport const EDIT_MODES: readonly EditMode[] = [\n \"READ_ONLY\",\n \"EDIT\",\n \"SELECT_ROW\",\n \"SELECT_COLUMN\",\n \"SELECT_REGION\",\n] as const;\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n mode =\n EDIT_MODES[\n (EDIT_MODES.indexOf(this._edit_mode) + 1) % EDIT_MODES.length\n ];\n }\n\n (this.parentElement as any)?.setSelection?.();\n this._edit_mode = mode;\n if (this.model) {\n this.model._edit_mode = mode;\n this.model._selection_state = {\n selected_areas: [],\n dirty: true,\n };\n }\n\n if (this._edit_button !== undefined) {\n this._edit_button.dataset.editMode = mode;\n }\n\n this.dataset.editMode = mode;\n}\n\nexport function toggle_scroll_lock(\n this: DatagridPluginElement,\n force?: boolean,\n): void {\n if (typeof force === \"undefined\") {\n force = !this._is_scroll_lock;\n }\n\n this._is_scroll_lock = force;\n this.classList.toggle(\"sub-cell-scroll-disabled\", force);\n if (this._scroll_lock !== undefined) {\n this._scroll_lock.classList.toggle(\"lock-scroll\", force);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n ColumnOverrides,\n DatagridPluginElement,\n RegularTable,\n} from \"../types.js\";\n\ninterface RegularTableWithOverrides {\n restoreColumnSizes(overrides: Record<number, number | undefined>): void;\n saveColumnSizes(): Record<number, number | undefined>;\n}\n\ninterface DatagridPluginWithCache extends DatagridPluginElement {\n _cached_column_sizes?: ColumnOverrides;\n}\n\n/**\n * Restore a saved column width override token.\n *\n * @param old_sizes An object previously returned by a call to\n * `save_column_size_overrides()`\n * @param cache A flag indicating whether this value should\n * be cached so a future `resetAutoSize()` call does not clear it.\n */\nexport function restore_column_size_overrides(\n this: DatagridPluginWithCache,\n old_sizes: ColumnOverrides,\n cache = false,\n): void {\n if (!this._initialized) {\n return;\n }\n\n if (cache) {\n this._cached_column_sizes = old_sizes;\n }\n\n const overrides: Record<number, number | undefined> = {};\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n for (const key of Object.keys(old_sizes)) {\n if (key === \"__ROW_PATH__\") {\n overrides[tree_header_offset - 1] = old_sizes[key] as\n | number\n | undefined;\n } else {\n const index = this.model!._column_paths.indexOf(key);\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n (this.regular_table as RegularTableWithOverrides).restoreColumnSizes(\n overrides,\n );\n}\n\n/**\n * Extract the current user-overriden column widths from\n * `regular-table`. This function depends on the internal\n * implementation of `regular-table` and may break!\n *\n * @returns An Object-as-dictionary keyed by column_path string, and\n * valued by the column's user-overridden pixel width.\n */\nexport function save_column_size_overrides(\n this: DatagridPluginWithCache,\n): ColumnOverrides {\n if (!this._initialized) {\n return {};\n }\n\n if (this._cached_column_sizes) {\n const x = this._cached_column_sizes;\n this._cached_column_sizes = undefined;\n return x;\n }\n\n const overrides = (\n this.regular_table as RegularTableWithOverrides\n ).saveColumnSizes();\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n const old_sizes: ColumnOverrides = {};\n for (const key of Object.keys(overrides)) {\n const numKey = Number(key);\n if (overrides[numKey] !== undefined) {\n const index = numKey - tree_header_offset;\n if (index > -1) {\n old_sizes[this.model!._column_paths[index]] = overrides[numKey];\n } else if (index === -1) {\n old_sizes[\"__ROW_PATH__\"] = overrides[numKey];\n }\n }\n }\n\n return old_sizes;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport {\n get_psp_type,\n type DatagridModel,\n type PerspectiveViewerElement,\n} from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply selected column styling in response to column settings toggle events.\n * This is called directly (not as a style listener) when the user opens/closes\n * the column settings panel.\n */\nexport function style_selected_column(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selectedColumn: string | undefined,\n): void {\n const group_header_trs = Array.from(\n regularTable.children[0].children[0].children,\n ) as HTMLTableRowElement[];\n\n const len = group_header_trs.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n if (len <= 1) {\n group_header_trs[0]?.removeAttribute(\"id\");\n } else {\n group_header_trs.forEach((tr, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? tr.setAttribute(\"id\", id) : tr.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n if (settings_open && len >= 2) {\n const titles = Array.from(\n group_header_trs[len - 2].children,\n ) as HTMLElement[];\n const editBtns = Array.from(\n group_header_trs[len - 1].children,\n ) as HTMLElement[];\n if (titles && editBtns) {\n group_header_trs.slice(0, len - 2).forEach((tr) => {\n Array.from(tr.children).forEach((th) => {\n th.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titles.length; i++) {\n const title = titles[i];\n const editBtn = editBtns[i];\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n if (this._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) continue;\n const isOpen =\n meta.column_header[\n meta.column_header.length - 2\n ] === selectedColumn;\n r.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n }\n }\n }\n}\n\n/**\n * Style a single column header row.\n */\nexport function styleColumnHeaderRow(\n this: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth = this._config.group_by.length;\n const selectedColumn = this._column_settings_selected_column;\n\n for (const { element: td, metadata } of headerRow.cells) {\n if (\n !metadata ||\n metadata.type === \"body\" ||\n metadata.type === \"row_header\"\n )\n continue;\n\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const sort = this._config.sort.find((x) => x[0] === column_name);\n let needs_border =\n metadata.type === \"corner\" &&\n metadata.row_header_x === header_depth;\n const is_corner = typeof metadata.x === \"undefined\";\n needs_border =\n needs_border ||\n (metadata.x !== undefined &&\n (metadata.x + 1) % this._config.columns.length === 0);\n\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\"psp-header-group\", false);\n td.classList.toggle(\"psp-header-leaf\", true);\n td.classList.toggle(\"psp-is-top\", false);\n td.classList.toggle(\"psp-header-corner\", is_corner);\n td.classList.toggle(\n \"psp-header-sort-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc abs\",\n );\n\n const type = get_psp_type(this, metadata);\n const is_numeric = type === \"integer\" || type === \"float\";\n const is_string = type === \"string\";\n const is_date = type === \"date\";\n const is_datetime = type === \"datetime\";\n\n td.classList.toggle(\"psp-align-right\", is_numeric);\n td.classList.toggle(\"psp-align-left\", !is_numeric);\n td.classList.toggle(\n \"psp-menu-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length + 1,\n );\n td.classList.toggle(\n \"psp-sort-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length,\n );\n td.classList.toggle(\n \"psp-is-width-override\",\n regularTable.saveColumnSizes()[metadata.size_key!] !== undefined,\n );\n\n // Apply menu-open for selected column\n if (this._config.columns.length > 1 && selectedColumn) {\n const isOpen =\n metadata.column_header?.[metadata.column_header.length - 2] ===\n selectedColumn;\n td.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SortRotationOrder,\n SortTerm,\n} from \"../types.js\";\nimport { SortDir } from \"@perspective-dev/client\";\n\nconst ROW_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n};\n\nconst ROW_COL_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: \"col desc\",\n \"desc abs\": \"asc abs\",\n \"asc abs\": \"col desc abs\",\n \"col desc\": \"col asc\",\n \"col asc\": undefined,\n \"col desc abs\": \"col asc abs\",\n \"col asc abs\": undefined,\n};\n\nexport async function sortHandler(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) return;\n const column_name = meta.column_header[this._config.split_by.length];\n const sort_method =\n event.ctrlKey ||\n (event as MouseEvent & { metaKet?: boolean }).metaKet ||\n event.altKey\n ? append_sort\n : override_sort;\n\n const abs = event.shiftKey;\n const sort = sort_method.call(this, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of this._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort.call(this, column_name, _sort_dir, abs);\n if (term) {\n sort.push(term);\n }\n } else {\n sort.push(sort_term);\n }\n }\n\n if (!found) {\n sort.push([column_name, abs ? \"desc abs\" : \"desc\"]);\n }\n\n return sort;\n}\n\nexport function override_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of this._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort.call(this, column_name, _sort_dir, abs);\n return sort ? [sort] : [];\n }\n }\n return [[column_name, abs ? \"desc abs\" : \"desc\"]];\n}\n\nexport function create_sort(\n this: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = this._config.split_by.length > 0;\n const order = is_col_sortable ? ROW_COL_SORT_ORDER : ROW_SORT_ORDER;\n const inc_sort_dir: SortDir | undefined = sort_dir\n ? order[sort_dir]\n : \"desc\";\n if (inc_sort_dir) {\n return [column_name, inc_sort_dir];\n }\n return undefined;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { RegularTable, DatagridModel } from \"../types.js\";\n\nexport async function expandCollapseHandler(\n this: DatagridModel,\n regularTable: RegularTable,\n event: MouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"row_header\") return;\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\n );\n\n if (event.shiftKey && is_collapse) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n this._view.collapse(meta.y);\n } else {\n this._view.expand(meta.y);\n }\n\n this._num_rows = await this._view.num_rows();\n this._num_columns = await this._view.num_columns();\n regularTable.draw();\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { sortHandler } from \"./sort.js\";\nimport { expandCollapseHandler } from \"./expand_collapse.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nexport async function mousedown_listener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n if (target?.tagName === \"A\") {\n return;\n }\n\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\")) {\n expandCollapseHandler.call(this, regularTable, event);\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name = meta?.column_header?.[this._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler.call(this, regularTable, viewer, event, target);\n }\n}\n\nexport function click_listener(\n regularTable: RegularTable,\n event: MouseEvent,\n): void {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\") && event.offsetX < 26) {\n event.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n event.stopImmediatePropagation();\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../../types.js\";\n\nexport function write_cell(\n table: RegularTable,\n model: DatagridModel,\n active_cell: HTMLElement,\n): boolean {\n const meta = table.getMeta(active_cell) as CellMetadataBody;\n if (!meta) {\n return false;\n }\n const type = model._schema[model._column_paths[meta.x!]];\n let text: string | number | boolean | null = active_cell.textContent || \"\";\n const id = model._ids[meta.y! - meta.y0][0];\n if (type === \"float\" || type === \"integer\") {\n const parsed = parseFloat(text.replace(/,/g, \"\"));\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"date\" || type === \"datetime\") {\n const parsed = Date.parse(text);\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"boolean\") {\n text = text === \"true\" ? false : text === \"false\" ? true : null;\n }\n\n const msg = {\n __INDEX__: id,\n [model._column_paths[meta.x]]: text,\n };\n\n model._table.update([msg], { port_id: model._edit_port, format: null });\n return true;\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n const meta = table.getMeta(event.target as HTMLElement);\n if (meta?.type === \"body\" || meta?.type === \"column_header\") {\n const is_editable2 = this._is_editable[meta.x];\n const is_bool = get_psp_type(this, meta) === \"boolean\";\n const is_null = (event.target as Element).classList.contains(\n \"psp-null\",\n );\n\n if (is_editable2 && is_bool && !is_null) {\n write_cell(table, this, event.target as HTMLElement);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SelectedPosition } from \"../types.js\";\nimport { CollectedCell, LocalSelectedPositionMap } from \"./types.js\";\n\n/**\n * Apply focus style to the selected cell.\n * Optimized to use collected cells instead of querySelectorAll.\n */\nexport function applyFocusStyle(\n this: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n): void {\n const selected_position = selectedPositionMap.get(regularTable);\n const host = regularTable.getRootNode() as Document;\n\n if (selected_position) {\n for (const { element: td, metadata } of cells) {\n if (\n metadata.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== td) {\n td.focus({ preventScroll: true });\n }\n return;\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n }\n}\n\n/**\n * Standalone function to focus the selected cell.\n * This collects cells from the table and tries to focus the selected position.\n * Returns true if focus was successful, false otherwise.\n *\n * Used by edit_keydown.ts for keyboard navigation.\n */\nexport function focusSelectedCell(\n regularTable: RegularTableElement,\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>,\n): boolean {\n const selected_position = selectedPositionMap.get(regularTable);\n if (!selected_position) {\n return false;\n }\n\n const host = regularTable.getRootNode() as Document;\n const tbody = regularTable.children[0]?.children[1];\n\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(cell as HTMLElement);\n if (\n metadata?.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== cell) {\n (cell as HTMLElement).focus({ preventScroll: true });\n }\n return true;\n }\n }\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n\n return false;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { focusSelectedCell } from \"../../style_handlers/focus.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\ntype AsyncFunction<T extends unknown[], R> = (\n this: DatagridModel,\n ...args: T\n) => Promise<R>;\n\nfunction lock<T extends unknown[], R>(\n body: AsyncFunction<T, R>,\n): AsyncFunction<T, R | undefined> {\n let lockPromise: Promise<void> | undefined;\n return async function (\n this: DatagridModel,\n ...args: T\n ): Promise<R | undefined> {\n if (lockPromise) {\n await lockPromise;\n return;\n }\n\n let resolve: () => void;\n lockPromise = new Promise((x) => (resolve = x));\n const result = await body.apply(this, args);\n lockPromise = undefined;\n resolve!();\n return result;\n };\n}\n\ninterface ContentEditableElement extends HTMLElement {\n isContentEditable: boolean;\n selectionStart?: number;\n}\n\nfunction getPos(this: ContentEditableElement): number {\n if (this.isContentEditable) {\n const _range = (this.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) return 0;\n const range = _range.cloneRange();\n range.selectNodeContents(this);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return this.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n this: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n): Promise<void> {\n const meta = table.getMeta(active_cell);\n if (!meta || meta.type !== \"body\") return;\n const num_columns = this._column_paths.length;\n const num_rows = this._num_rows;\n const selected_position = selected_position_map.get(table);\n if (!selected_position) {\n return;\n }\n\n if (meta.x + dx < num_columns && 0 <= meta.x + dx) {\n selected_position.x = meta.x + dx;\n }\n\n if (meta.y + dy < num_rows && 0 <= meta.y + dy) {\n selected_position.y = meta.y + dy;\n }\n\n const xmin = Math.max(meta.x0 - 10, 0);\n const xmax = Math.min(meta.x0 + 10, num_columns);\n const ymin = Math.max(meta.y0 - 5, 0);\n const ymax = Math.min(meta.y0 + 10, num_rows);\n let x = meta.x0 + dx,\n y = meta.y0 + dy;\n while (\n !focusSelectedCell(table, selected_position_map) &&\n x >= xmin &&\n x < xmax &&\n y >= ymin &&\n y < ymax\n ) {\n await table.scrollToCell(x, y);\n selected_position_map.set(table, selected_position);\n x += dx;\n y += dy;\n }\n});\n\nfunction isLastCell(\n model: DatagridModel,\n table: RegularTable,\n target: HTMLElement,\n): boolean {\n const meta = table.getMeta(target);\n return meta?.type === \"body\" && meta.y === model._num_rows - 1;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n const target = (table.getRootNode() as Document)\n .activeElement as HTMLElement;\n (event.target as HTMLElement).classList.remove(\"psp-error\");\n switch (event.key) {\n case \"Enter\":\n event.preventDefault();\n if (isLastCell(this, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n break;\n case \"ArrowLeft\":\n if (getPos.call(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n break;\n case \"ArrowRight\":\n if (\n getPos.call(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n break;\n default:\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport * as edit_click from \"./click/edit_click.js\";\nimport * as edit_keydown from \"./keydown/edit_keydown.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"../custom_elements/datagrid.js\";\n\ntype SelectedPositionMap = Map<RegularTableElement, SelectedPosition>;\n\nexport function is_editable(\n this: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n this._config.group_by.length === 0 &&\n this._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | HTMLPerspectiveViewerDatagridPluginElement\n | undefined;\n const editable = allowed || !!(plugin?._edit_mode === \"EDIT\");\n return has_pivots && !selectable && editable;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener.call(\n this,\n table,\n viewer,\n selected_position_map,\n event,\n );\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_click.clickListener.call(this, table, viewer, event);\n } else if (this._edit_mode === \"READ_ONLY\") {\n // No-op for read-only mode\n } else if (this._edit_mode === \"SELECT_COLUMN\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_ROW\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_REGION\") {\n // Not yet implemented\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"click\" event not yet implemented`,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { is_editable } from \"./click.js\";\nimport { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\nexport function focusoutListener(\n this: DatagridModel,\n table: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n if (is_editable.call(this, viewer) && selected_position_map.has(table)) {\n const target = event.target as HTMLElement;\n target.classList.remove(\"psp-error\");\n const selectedPosition = selected_position_map.get(table)!;\n selected_position_map.delete(table);\n if (selectedPosition.content !== target.textContent) {\n if (!write_cell(table, this, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n}\n\nexport function focusinListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n const target = event.target as HTMLElement;\n const meta = table.getMeta(target);\n if (meta?.type === \"body\") {\n const new_state: SelectedPosition = {\n x: meta.x,\n y: meta.y,\n content: target.textContent || undefined,\n };\n selected_position_map.set(table, new_state);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { View, ViewConfig, Filter, Scalar } from \"@perspective-dev/client\";\nimport type { CellConfigResult } from \"./types.js\";\n\ninterface ModelWithViewAndConfig {\n _view: View;\n _config: ViewConfig;\n}\n\ninterface RowData {\n __ROW_PATH__?: unknown[];\n [key: string]: unknown;\n}\n\nexport default async function getCellConfig(\n { _view, _config }: ModelWithViewAndConfig,\n row_idx: number,\n col_idx: number,\n): Promise<CellConfigResult> {\n const group_by = _config.group_by;\n const split_by = _config.split_by;\n const start_row = row_idx >= 0 ? row_idx : 0;\n const end_row = start_row + 1;\n const r = (await _view.to_json({ start_row, end_row })) as RowData[];\n const row_paths = r.map((x) => x.__ROW_PATH__);\n const group_by_values = (row_paths[0] || []) as Scalar[];\n const row_filters = group_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = group_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined);\n\n const column_index = group_by.length > 0 ? col_idx + 1 : col_idx;\n const column_paths = Object.keys(r[0])[column_index];\n const result: CellConfigResult = {\n row: r[0] as Record<string, unknown>,\n column_names: [],\n config: { filter: [] },\n };\n\n let column_filters: Filter[] = [];\n if (column_paths) {\n const split_by_values = column_paths.split(\"|\");\n result.column_names = [split_by_values[split_by.length]];\n column_filters = split_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = split_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined)\n .filter(([, , value]) => value !== \"__ROW_PATH__\");\n }\n\n const filter = _config.filter.concat(row_filters).concat(column_filters);\n result.config = { filter };\n return result;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n HandledMouseEvent,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTable, unknown[]>;\n\nexport async function selectionListener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n event: HandledMouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!viewer.hasAttribute(\"selectable\")) return;\n if (event.handled) return;\n if (event.shiftKey) return;\n if (event.button !== 0) {\n return;\n }\n\n event.stopImmediatePropagation();\n\n if (!meta) {\n return;\n }\n\n if ((meta.type === \"body\" || meta.type === \"row_header\") && meta.y >= 0) {\n const id = this._ids?.[meta.y - meta.y0];\n const selected = selected_rows_map.get(regularTable);\n const key_match =\n !!selected &&\n selected.reduce<boolean>((agg, x, i) => agg && x === id[i], true);\n\n const is_deselect =\n !!selected && id.length === selected.length && key_match;\n\n let detail: PerspectiveSelectDetail = {\n selected: !is_deselect,\n row: {},\n config: { filter: [] },\n };\n\n const { row, column_names, config } = await getCellConfig(\n this,\n meta.y,\n meta.type === \"body\" ? meta.x : 0,\n );\n\n if (is_deselect) {\n selected_rows_map.delete(regularTable);\n detail = {\n ...detail,\n row,\n config: { filter: structuredClone(this._config.filter) },\n };\n } else {\n selected_rows_map.set(regularTable, id);\n detail = { ...detail, row, column_names, config };\n }\n\n await regularTable.draw({ preserve_width: true });\n event.handled = true;\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\"perspective-select\", {\n bubbles: true,\n composed: true,\n detail,\n }),\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { PerspectiveViewerElement } from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTableElement, unknown[]>;\n\nexport async function deselect_all_listener(\n regularTable: RegularTableElement,\n _viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n): Promise<void> {\n selected_rows_map.delete(regularTable);\n for (const td of regularTable.querySelectorAll(\"td,th\")) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n PerspectiveClickDetail,\n} from \"../types.js\";\n\nexport async function dispatch_click_listener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n const meta = table.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"body\") return;\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(this, y, x);\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveClickDetail>(\"perspective-click\", {\n bubbles: true,\n composed: true,\n detail: {\n row,\n column_names,\n config,\n },\n }),\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectionArea,\n} from \"../types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n }: AddAreaMouseSelectionOptions = {},\n): RegularTableElement => {\n datagrid.model!._selection_state = {\n selected_areas: selected,\n dirty: true,\n };\n\n table.addEventListener(\n \"mousedown\",\n getMousedownListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseover\",\n getMouseoverListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseup\",\n getMouseupListener(datagrid, table, className),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nconst getMousedownListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n mouseEvent.button === 0 &&\n (datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\")\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {\n x: meta.x,\n y: meta.y,\n };\n\n datagrid.model!._selection_state.old_selected_areas =\n datagrid.model!._selection_state.selected_areas;\n datagrid.model!._selection_state.selected_areas = [];\n\n const start: SelectionArea = {\n x0: meta.x,\n x1: meta.x,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.potential_selection = start;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n start,\n ]),\n );\n\n return;\n }\n }\n\n datagrid.model!._selection_state.selected_areas = [];\n };\n\nconst getMouseoverListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const potentialSelection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n\n datagrid.model!._selection_state.potential_selection =\n potentialSelection;\n\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n potentialSelection,\n ]),\n );\n }\n }\n }\n };\n\nconst getMouseupListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) return;\n\n if (\n (datagrid.model!._selection_state.old_selected_areas?.length ??\n 0) > 0\n ) {\n const selected =\n datagrid.model!._selection_state.old_selected_areas![0];\n if (\n selected.x0 === selected.x1 &&\n selected.y0 === selected.y1 &&\n meta?.type === \"body\" &&\n selected.x0 === meta.x &&\n selected.y0 === meta.y\n ) {\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.old_selected_areas = [];\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n applyMouseAreaSelections(datagrid, table, className, []);\n return;\n }\n }\n\n datagrid.model!._selection_state.old_selected_areas = [];\n\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined &&\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const selection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n datagrid.model!._selection_state.selected_areas.push(selection);\n applyMouseAreaSelections(datagrid, table, className);\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n datagrid.model!._selection_state.potential_selection = undefined;\n }\n };\n\nfunction set_psp_selection(\n viewer: PerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (\n x0 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_col = x0;\n }\n\n if (\n x1 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_col = x1 + 1;\n }\n\n if (\n y0 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_row = y0;\n }\n\n if (\n y1 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n selected = datagrid.model!._selection_state.selected_areas.slice(0);\n if (datagrid.model!._selection_state.potential_selection) {\n selected.push(datagrid.model!._selection_state.potential_selection);\n }\n\n const tds = table.querySelectorAll(\"tbody td\");\n\n if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as any,\n datagrid,\n selected[0],\n );\n applyMouseAreaSelection(datagrid, table, selected, className);\n } else {\n (datagrid.parentElement as any).setSelection();\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n } else if (datagrid.model!._selection_state.dirty) {\n datagrid.model!._selection_state.dirty = false;\n const tds = table.querySelectorAll(\"tbody td\");\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n if (datagrid.model!._edit_mode === \"SELECT_REGION\" && selected.length > 0) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta || meta.type !== \"body\") continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined\n ) {\n if (\n x0 <= meta.x &&\n meta.x <= x1 &&\n y0 <= meta.y &&\n meta.y <= y1\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_ROW\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (y0 <= meta.y && meta.y <= y1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_COLUMN\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (x0 <= meta.x && meta.x <= x1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n }\n};\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport type { DatagridModel, PerspectiveViewerElement } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) return;\n\n // Style selected column for settings panel\n const selectedColumn = this._column_settings_selected_column;\n const len = headerRows.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n\n // Set row IDs\n if (len <= 1) {\n headerRows[0]?.row.removeAttribute(\"id\");\n } else {\n headerRows.forEach(({ row }, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? row.setAttribute(\"id\", id) : row.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n\n // Style column titles and edit buttons when settings open\n if (settings_open && len >= 2) {\n const titlesRow = headerRows[len - 2];\n const editBtnsRow = headerRows[len - 1];\n\n if (titlesRow && editBtnsRow) {\n // Clear menu-open from other rows\n headerRows.slice(0, len - 2).forEach(({ cells }) => {\n cells.forEach(({ element }) => {\n element.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titlesRow.cells.length; i++) {\n const title = titlesRow.cells[i]?.element;\n const editBtn = editBtnsRow.cells[i]?.element;\n if (!title || !editBtn) continue;\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n }\n }\n }\n\n // Style the actual column header rows\n const colHeadersIndex = this._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n this._styleColumnHeaderRow(colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = this._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n this._styleColumnHeaderRow(menuHeaders, regularTable, true);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to group header rows.\n */\nexport function applyGroupHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = this._config.group_by.length;\n const m: boolean[][] = [];\n let marked = new Set<number>();\n\n for (let y = 0; y < headerRows.length; y++) {\n const { row, cells } = headerRows[y];\n const tops = new Set<number>();\n\n for (let x = 0; x < cells.length; x++) {\n const { element: td, metadata } = cells[x];\n if (!metadata) continue;\n\n td.style.backgroundColor = \"\";\n\n const needs_border =\n (metadata.type === \"corner\" &&\n header_depth > 0 &&\n metadata.row_header_x === header_depth) ||\n (metadata.type === \"column_header\" && metadata.x >= 0);\n\n td.classList.toggle(\"psp-align-right\", false);\n td.classList.toggle(\"psp-align-left\", false);\n td.classList.toggle(\"psp-header-group\", true);\n td.classList.toggle(\"psp-header-leaf\", false);\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\n \"psp-header-group-corner\",\n metadata.type === \"corner\",\n );\n\n td.classList.toggle(\"psp-color-mode-bar\", false);\n td.classList.toggle(\"psp-header-sort-asc\", false);\n td.classList.toggle(\"psp-header-sort-desc\", false);\n td.classList.toggle(\"psp-header-sort-col-asc\", false);\n td.classList.toggle(\"psp-header-sort-col-desc\", false);\n td.classList.toggle(\"psp-sort-enabled\", false);\n\n // Calculate spanning for psp-is-top\n let xx = x;\n for (; m[y] && m[y][xx]; ++xx);\n tops.add(xx);\n\n const cell = td;\n for (let tx = xx; tx < xx + cell.colSpan; ++tx) {\n for (let ty = y; ty < y + cell.rowSpan; ++ty) {\n if (!m[ty]) m[ty] = [];\n m[ty][tx] = true;\n }\n }\n\n cell.classList.toggle(\"psp-is-top\", y === 0 || !marked.has(xx));\n }\n\n marked = tops;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColorRecord } from \"../../types.js\";\n\nexport function style_cell_flash(\n this: DatagridModel,\n metadata: CellMetadataBody,\n td: HTMLElement,\n [, , , , , pos_s, pos_e]: ColorRecord,\n [, , , , , neg_s, neg_e]: ColorRecord,\n is_settings_open: boolean,\n): void {\n const id = this._ids?.[metadata.dy ?? 0]?.join(\"|\");\n const metadata_path = (\n is_settings_open\n ? (metadata.column_header ?? []).slice(0, -1)\n : (metadata.column_header ?? [])\n ).join(\"|\");\n\n if (\n this.last_reverse_columns?.has(metadata_path) &&\n this.last_reverse_ids?.has(id)\n ) {\n const row_idx = this.last_reverse_ids?.get(id);\n const col_idx = this.last_reverse_columns.get(metadata_path);\n if (!this._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) >\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", neg_s);\n td.style.setProperty(\"--pulse--background-color-end\", neg_e);\n if (td.style.animationName === \"pulse_neg\") {\n td.style.animation = \"pulse_neg2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_neg 0.5s linear\";\n }\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) <\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", pos_s);\n td.style.setProperty(\"--pulse--background-color-end\", pos_e);\n if (td.style.animationName === \"pulse_pos\") {\n td.style.animation = \"pulse_pos2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_pos 0.5s linear\";\n }\n } else if (row_idx !== metadata.dy) {\n td.style.animation = \"\";\n }\n } else {\n td.style.animation = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_cell_flash } from \"./cell_flash.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: number;\n dy: number;\n column_header?: string[];\n}\n\ninterface PluginWithColors\n extends Omit<\n ColumnConfig,\n \"pos_fg_color\" | \"neg_fg_color\" | \"pos_bg_color\" | \"neg_bg_color\"\n > {\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n}\n\nexport function cell_style_numeric(\n this: DatagridModel,\n plugin: PluginWithColors | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n is_settings_open: boolean,\n): void {\n const is_positive = (metadata.user ?? 0) > 0;\n const is_negative = (metadata.user ?? 0) < 0;\n\n let pos_bg_color: ColorRecord;\n if (plugin?.pos_bg_color !== undefined) {\n pos_bg_color = plugin.pos_bg_color;\n } else {\n pos_bg_color = this._pos_bg_color;\n }\n\n let neg_bg_color: ColorRecord;\n if (plugin?.neg_bg_color !== undefined) {\n neg_bg_color = plugin.neg_bg_color;\n } else {\n neg_bg_color = this._neg_bg_color;\n }\n\n const bg_tuple: ColorRecord = is_positive\n ? pos_bg_color\n : is_negative\n ? neg_bg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n\n {\n const [hex, r, g, b] = bg_tuple;\n\n td.style.position = \"\";\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else if (plugin?.number_bg_mode === \"color\") {\n td.style.animation = \"\";\n td.style.backgroundColor = hex;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n const a = Math.max(\n 0,\n Math.min(\n 1,\n Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),\n ),\n );\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, a], source),\n );\n\n td.style.animation = \"\";\n td.style.color = foreground;\n td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;\n } else if (plugin?.number_bg_mode === \"pulse\") {\n style_cell_flash.call(\n this,\n metadata as any,\n td,\n pos_bg_color,\n neg_bg_color,\n is_settings_open,\n );\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.number_bg_mode === \"disabled\" ||\n !plugin?.number_bg_mode\n ) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n }\n }\n\n const fg_tuple: ColorRecord = (() => {\n if (plugin?.pos_fg_color !== undefined) {\n return is_positive\n ? plugin.pos_fg_color\n : is_negative\n ? plugin.neg_fg_color!\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? this._pos_fg_color\n : is_negative\n ? this._neg_fg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n }\n })();\n\n const [hex, , , , gradhex] = fg_tuple;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (plugin?.number_fg_mode === \"disabled\") {\n if (plugin?.number_bg_mode === \"color\") {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),\n );\n td.style.color = foreground;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n // Color already set above\n } else {\n td.style.color = \"\";\n }\n } else if (plugin?.number_fg_mode === \"bar\") {\n td.style.color = \"\";\n td.style.position = \"relative\";\n if (\n gradhex !== \"\" &&\n td.children.length > 0 &&\n td.children[0].nodeType === Node.ELEMENT_NODE\n ) {\n (td.children[0] as HTMLElement).style.background = gradhex;\n }\n } else if (plugin?.number_fg_mode === \"color\" || !plugin?.number_fg_mode) {\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: string | null;\n column_header?: string[];\n}\n\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_string(\n this: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[this._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return this._color;\n }\n })();\n\n const [hex, r, g, b] = colorRecord;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.string_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n if (plugin?.format === \"link\" && td.children[0]) {\n (td.children[0] as HTMLElement).style.color = hex;\n }\n } else if (\n plugin?.string_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else if (\n plugin?.string_color_mode === \"series\" &&\n metadata.user !== null &&\n column_name\n ) {\n if (!this._series_color_map.has(column_name)) {\n this._series_color_map.set(column_name, new Map());\n this._series_color_seed.set(column_name, 0);\n }\n\n const series_map = this._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = this._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n this._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n let [h, s, l] = chroma(hex).hsl();\n h = h + ((color_seed * 150) % 360);\n const color2 = chroma(h, s, l, \"hsl\");\n const [r2, g2, b2] = color2.rgb();\n const hex2 = color2.hex();\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r2, g2, b2, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex2;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_datetime(\n this: DatagridModel,\n plugin: ColumnConfig,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n const colorRecord: ColorRecord = //(() => {\n // if (plugin?.color !== undefined) {\n // return plugin.color;\n // } else {\n // return\n this._color;\n // }\n // })();\n\n const [hex, r, g, b] = colorRecord;\n\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.datetime_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.datetime_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_boolean(\n this: DatagridModel,\n _plugin: ColumnConfig | undefined,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else {\n const [hex]: ColorRecord | [string, number, number, number, string] =\n metadata.user === true\n ? this._pos_fg_color\n : metadata.user === false\n ? this._neg_fg_color\n : [\"\", 0, 0, 0, \"\"];\n td.style.backgroundColor = \"\";\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n CellMetadata,\n CellMetadataRowHeader,\n} from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel } from \"../../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\nexport function cell_style_row_header(\n this: DatagridModel,\n regularTable: RegularTableElement,\n td: HTMLElement,\n metadata: CellMetadataRowHeader,\n): void {\n const is_not_empty =\n metadata.value !== undefined &&\n metadata.value !== null &&\n metadata.value?.toString()?.trim().length > 0;\n const is_leaf =\n (metadata.row_header_x ?? 0) >= this._config.group_by.length;\n const next = regularTable.getMeta({\n dx: 0,\n dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,\n } as CellMetadata);\n\n const is_collapse =\n next &&\n next.row_header &&\n typeof next.row_header[(metadata.row_header_x ?? 0) + 1] !==\n \"undefined\";\n\n td.classList.toggle(\"psp-tree-label\", is_not_empty && !is_leaf);\n td.classList.toggle(\n \"psp-tree-label-expand\",\n is_not_empty && !is_leaf && !is_collapse,\n );\n\n td.classList.toggle(\n \"psp-tree-label-collapse\",\n is_not_empty && !is_leaf && is_collapse,\n );\n td.classList.toggle(\"psp-tree-leaf\", is_not_empty && is_leaf);\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport {\n type DatagridModel,\n type PerspectiveViewerElement,\n type ColumnsConfig,\n type DatagridPluginElement,\n get_psp_type,\n} from \"../types.js\";\n\nimport { cell_style_numeric } from \"./table_cell/numeric.js\";\nimport { cell_style_string } from \"./table_cell/string.js\";\nimport { cell_style_datetime } from \"./table_cell/datetime.js\";\nimport { cell_style_boolean } from \"./table_cell/boolean.js\";\nimport { cell_style_row_header } from \"./table_cell/row_header.js\";\nimport {\n CollectedCell,\n LocalSelectedPositionMap,\n LocalSelectedRowsMap,\n} from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n this: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n): void {\n const hasSelected = selectedRowsMap.has(regularTable);\n const selected = selectedRowsMap.get(regularTable);\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const type = get_psp_type(this, metadata);\n const plugin = column_name\n ? plugins[column_name.toString()]\n : undefined;\n const is_numeric = type === \"integer\" || type === \"float\";\n\n // Calculate aggregate depth visibility\n // @ts-ignore\n metadata._is_hidden_by_aggregate_depth = ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n this._config.group_by.length,\n plugin?.aggregate_depth || 0,\n ))(\n (metadata.row_header as unknown[] | undefined)?.filter(\n (x) => x !== undefined,\n )?.length,\n );\n\n // Apply type-specific cell styling\n if (is_numeric) {\n cell_style_numeric.call(\n this,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean.call(this, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string.call(this, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime.call(this, plugin as any, td, metadata as any);\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n\n // Apply common cell classes\n td.classList.toggle(\n \"psp-bool-type\",\n type === \"boolean\" && metadata.user !== null,\n );\n\n td.classList.toggle(\"psp-null\", metadata.value === null);\n td.classList.toggle(\"psp-align-right\", !isHeader && is_numeric);\n td.classList.toggle(\"psp-align-left\", isHeader || !is_numeric);\n if (this._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === this._column_settings_selected_column,\n );\n } else {\n td.classList.toggle(\"psp-menu-open\", false);\n }\n\n td.classList.toggle(\n \"psp-color-mode-bar\",\n plugin?.number_fg_mode === \"bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header.call(this, regularTable, td, metadata as any);\n }\n\n // Set data attributes\n const tr = td.parentElement as HTMLElement;\n if (tr) {\n tr.dataset.y = String(metadata.y);\n }\n\n if (\n metadata.type !== \"row_header\" ||\n metadata.row_header_x ===\n (metadata.row_header as unknown[]).length - 1 ||\n (metadata.row_header as unknown[])[metadata.row_header_x + 1] ===\n undefined\n ) {\n td.dataset.y = String(metadata.y);\n if (metadata.type !== \"row_header\") {\n td.dataset.x = String(metadata.x);\n } else {\n delete td.dataset.x;\n }\n } else {\n delete td.dataset.y;\n delete td.dataset.x;\n }\n\n // Apply selection styling (if selectable)\n if (isSelectable) {\n if (!hasSelected) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n const id = this._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = (selected as unknown[]).reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const selectedArr = selected as unknown[];\n if (isHeader) {\n if (\n metadata.type === \"row_header\" &&\n metadata.row_header_x !== undefined &&\n !!id[metadata.row_header_x]\n ) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n }\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && this._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[this._config.split_by.length];\n const col_name_str = col_name?.toString();\n if (\n col_name_str &&\n type === \"string\" &&\n plugins[col_name_str]?.format === \"link\"\n ) {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n } else if (type === \"boolean\") {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\n \"boolean-editable\",\n (metadata as { user?: unknown }).user !== null,\n );\n } else {\n if (isEditable !== td.hasAttribute(\"contenteditable\")) {\n td.toggleAttribute(\"contenteditable\", isEditable);\n }\n td.classList.toggle(\"boolean-editable\", false);\n }\n } else {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n }\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n ColumnsConfig,\n DatagridPluginElement,\n SelectedPosition,\n} from \"../types.js\";\n\nimport { applyFocusStyle } from \"./focus.js\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\nimport { applyColumnHeaderStyles } from \"./editable.js\";\nimport { applyGroupHeaderStyles } from \"./group_header.js\";\nimport { applyBodyCellStyles } from \"./body.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\ninterface CollectedCell {\n element: HTMLElement;\n metadata: CellMetadata;\n isHeader: boolean;\n}\n\ninterface CollectedHeaderRow {\n row: HTMLTableRowElement;\n cells: Array<{\n element: HTMLTableCellElement;\n metadata: CellMetadata | undefined;\n }>;\n}\n\n/**\n * Context object passed through consolidated styling\n */\nexport interface StyleContext {\n model: DatagridModel;\n regularTable: RegularTableElement;\n viewer: PerspectiveViewerElement;\n datagrid: DatagridPluginElement;\n plugins: ColumnsConfig;\n isSettingsOpen: boolean;\n isSelectable: boolean;\n isEditable: boolean;\n selectedRowsMap: Map<RegularTableElement, unknown[]>;\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>;\n}\n\n// Local types for selection maps - match the actual runtime usage\n// (activate.ts uses `as any` casts when passing these)\ntype LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;\ntype LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;\n\nfunction isEditableMode(\n model: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n model._config.group_by.length === 0 &&\n model._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | (DatagridPluginElement & { dataset: DOMStringMap })\n | undefined;\n const editable = allowed || plugin?.dataset?.editMode === \"EDIT\";\n return has_pivots && !selectable && editable;\n}\n\n/**\n * Consolidated style listener that handles all cell styling in a single pass.\n * This eliminates redundant DOM traversals and reduces layout thrashing by:\n * 1. Collecting all cell metadata in a read phase\n * 2. Applying all styles in a write phase\n */\nexport function createConsolidatedStyleListener(\n datagrid: DatagridPluginElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n): (\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n) => void {\n return function consolidatedStyleListener(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = viewer.hasAttribute(\"selectable\");\n const isEditable = isEditableMode(this, viewer);\n const isEditableAllowed = isEditableMode(this, viewer, true);\n\n // Toggle edit mode class on datagrid\n datagrid.classList.toggle(\"edit-mode-allowed\", isEditableAllowed);\n const bodyCells: CollectedCell[] = [];\n const groupHeaderRows: CollectedHeaderRow[] = [];\n const tbody = regularTable.children[0]?.children[1];\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n if (metadata) {\n const isHeader = cell.tagName === \"TH\";\n bodyCells.push({\n element: cell as HTMLElement,\n metadata,\n isHeader,\n });\n }\n }\n }\n }\n\n // Collect header rows (thead)\n const thead = regularTable.children[0]?.children[0];\n if (thead) {\n for (const tr of thead.children) {\n const rowData: CollectedHeaderRow = {\n row: tr as HTMLTableRowElement,\n cells: [],\n };\n\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n rowData.cells.push({\n element: cell as HTMLTableCellElement,\n metadata,\n });\n }\n groupHeaderRows.push(rowData);\n }\n }\n\n this._applyBodyCellStyles(\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n selectedRowsMap,\n selectedPositionMap,\n viewer,\n );\n\n this._applyGroupHeaderStyles(groupHeaderRows, regularTable);\n this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);\n this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);\n };\n}\n\ndeclare module \"../types.js\" {\n interface DatagridModel {\n _applyBodyCellStyles(\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyGroupHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n ): void;\n _applyColumnHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyFocusStyle(\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n ): void;\n _styleColumnHeaderRow(\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n ): void;\n }\n}\n\n/**\n * Install the styling methods on the DatagridModel prototype.\n * This should be called once during module initialization.\n */\nexport function installConsolidatedStyleMethods(modelPrototype: any): void {\n modelPrototype._applyBodyCellStyles = applyBodyCellStyles;\n modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;\n modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;\n modelPrototype._applyFocusStyle = applyFocusStyle;\n modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n click_listener,\n mousedown_listener,\n} from \"../event_handlers/header_click.js\";\n\nimport { focusinListener, focusoutListener } from \"../event_handlers/focus.js\";\nimport { keydownListener, clickListener } from \"../event_handlers/click.js\";\n\nimport { selectionListener } from \"../event_handlers/row_select_click.js\";\nimport { deselect_all_listener } from \"../event_handlers/deselect_all.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { dispatch_click_listener } from \"../event_handlers/dispatch_click.js\";\n\nimport { addAreaMouseSelection } from \"../event_handlers/select_region.js\";\n\nimport {\n createConsolidatedStyleListener,\n installConsolidatedStyleMethods,\n} from \"../style_handlers/consolidated.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport type { RegularTableElement } from \"regular-table\";\n\ninterface ToggleColumnSettingsEvent extends CustomEvent {\n detail: {\n column_name: string | null;\n open: boolean;\n };\n}\n\n/**\n * Lazy initialize this plugin with various listeners.\n */\nexport async function activate(\n this: DatagridPluginElement,\n view: View,\n): Promise<void> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const table = await viewer.getTable();\n\n if (!this._initialized) {\n this.innerHTML = \"\";\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(this.regular_table);\n } else {\n this.appendChild(this.regular_table);\n }\n\n this.model = await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n );\n\n if (!this.model) {\n return;\n }\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n });\n\n // Create shared state maps for selection and focus tracking\n const selected_rows_map = new WeakMap<\n RegularTableElement,\n Set<number>\n >();\n const selected_position_map = new WeakMap<\n RegularTableElement,\n SelectedPosition\n >();\n\n // Install consolidated style methods on model prototype\n installConsolidatedStyleMethods(this.model);\n\n // Single consolidated style listener replaces:\n // - table_cell_style_listener\n // - group_header_style_listener\n // - column_header_style_listener\n // - selectionStyleListener\n // - editable_style_listener\n // - focus_style_listener\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n selected_rows_map as any,\n selected_position_map as any,\n ).bind(this.model, this.regular_table, viewer),\n );\n\n // uh ..\n this.regular_table.addEventListener(\n \"click\",\n click_listener.bind(\n this.model,\n this.regular_table,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"mousedown\",\n selectionListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"psp-deselect-all\",\n deselect_all_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n dispatch_click_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n mousedown_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // Editing event handlers (style handling is now in consolidated listener)\n // TODO relies on this.model._is_editable\n this.regular_table.addEventListener(\n \"click\",\n clickListener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n focusinListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n focusoutListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n keydownListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n // viewer event listeners\n viewer.addEventListener(\n \"perspective-toggle-column-settings\",\n (event: Event) => {\n const toggleEvent = event as ToggleColumnSettingsEvent;\n if (this.isConnected) {\n style_selected_column.call(\n this.model!,\n this.regular_table,\n viewer,\n toggleEvent.detail.column_name ?? undefined,\n );\n if (!toggleEvent.detail.open) {\n this.model!._column_settings_selected_column =\n undefined;\n return;\n }\n\n this.model!._column_settings_selected_column =\n toggleEvent.detail.column_name ?? undefined;\n }\n },\n );\n\n this._initialized = true;\n } else {\n await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n this.model,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { restore_column_size_overrides } from \"../model/column_overrides.js\";\nimport {\n EDIT_MODES,\n toggle_edit_mode,\n toggle_scroll_lock,\n} from \"../model/toolbar.js\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { make_color_record } from \"../color_utils.js\";\nimport type {\n DatagridPluginElement,\n ColumnOverrides,\n EditMode,\n ColumnsConfig,\n ColorRecord,\n} from \"../types.js\";\n\ninterface RestoreToken {\n columns?: Record<string, { column_size_override?: number }>;\n edit_mode?: EditMode;\n scroll_lock?: boolean;\n}\n\n// interface ColumnConfigWithColors {\n// pos_fg_color?: string;\n// neg_fg_color?: string;\n// pos_bg_color?: string;\n// neg_bg_color?: string;\n// color?: string;\n// [key: string]: unknown;\n// }\n\ninterface StylesConfig {\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n color?: ColorRecord;\n [key: string]: unknown;\n}\n\nexport function restore(\n this: DatagridPluginElement,\n token: RestoreToken,\n columns: ColumnsConfig,\n): void {\n token = JSON.parse(JSON.stringify(token));\n columns = JSON.parse(JSON.stringify(columns));\n const overrides: ColumnOverrides = {};\n\n if (token.columns) {\n for (const [col, value] of Object.entries(token.columns)) {\n if (value.column_size_override !== undefined) {\n overrides[col] = value.column_size_override;\n delete value[\"column_size_override\"];\n }\n }\n }\n\n const styles: Record<string, StylesConfig> = {};\n if (columns) {\n for (const [col_name, controls] of Object.entries(columns)) {\n styles[col_name] = {\n ...controls,\n pos_fg_color: controls.pos_fg_color\n ? make_color_record(controls.pos_fg_color)\n : undefined,\n neg_fg_color: controls.neg_fg_color\n ? make_color_record(controls.neg_fg_color)\n : undefined,\n pos_bg_color: controls.pos_bg_color\n ? make_color_record(controls.pos_bg_color)\n : undefined,\n neg_bg_color: controls.neg_bg_color\n ? make_color_record(controls.neg_bg_color)\n : undefined,\n color: controls.color\n ? make_color_record(controls.color)\n : undefined,\n };\n }\n }\n\n if (\"edit_mode\" in token && token.edit_mode) {\n if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {\n toggle_edit_mode.call(this, token.edit_mode);\n } else {\n console.error(\"Unknown edit mode \" + token.edit_mode);\n }\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n }\n\n const datagrid = this.regular_table;\n restore_column_size_overrides.call(this, overrides, true);\n (datagrid as any)[PRIVATE_PLUGIN_SYMBOL] = styles as ColumnsConfig;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { save_column_size_overrides } from \"../model/column_overrides.js\";\nimport type {\n DatagridPluginElement,\n DatagridPluginConfig,\n EditMode,\n} from \"../types.js\";\n\nexport function save(\n this: DatagridPluginElement,\n): DatagridPluginConfig | Record<string, never> {\n if (this.regular_table) {\n const token: DatagridPluginConfig = {\n columns: {},\n scroll_lock: !!this._is_scroll_lock,\n edit_mode: this._edit_mode,\n };\n\n const column_size_overrides = save_column_size_overrides.call(this);\n\n for (const col of Object.keys(column_size_overrides || {})) {\n if (!token.columns?.[col]) {\n token.columns = token.columns || {};\n token.columns[col] = {};\n }\n\n token.columns[col].column_size_override =\n column_size_overrides[col];\n }\n\n return JSON.parse(JSON.stringify(token));\n }\n return {};\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n restore_column_size_overrides,\n save_column_size_overrides,\n} from \"../model/column_overrides.js\";\nimport type { View } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface DatagridPluginWithActivate extends DatagridPluginElement {\n activate(view: View): Promise<void>;\n}\n\nexport async function draw(\n this: DatagridPluginWithActivate,\n view: View,\n): Promise<void> {\n if (this.parentElement) {\n await this.activate(view);\n }\n\n if (!this.isConnected || this.offsetParent == null || !this.model) {\n return;\n }\n\n const old_sizes = save_column_size_overrides.call(this);\n const drawPromise = this.regular_table.draw({\n invalid_columns: true,\n } as any);\n if (this._reset_scroll_top) {\n this.regular_table.scrollTop = 0;\n this._reset_scroll_top = false;\n }\n\n if (this._reset_scroll_left) {\n this.regular_table.scrollLeft = 0;\n this._reset_scroll_left = false;\n }\n if (this._reset_select) {\n this.regular_table.dispatchEvent(\n new CustomEvent(\"psp-deselect-all\", { bubbles: false }),\n );\n this._reset_select = false;\n }\n\n if (this._reset_column_size) {\n this.regular_table.resetAutoSize();\n this._reset_column_size = false;\n }\n\n restore_column_size_overrides.call(this, old_sizes);\n await drawPromise;\n\n this._toolbar?.classList.toggle(\n \"aggregated\",\n this.model._config.group_by.length > 0 ||\n this.model._config.split_by.length > 0,\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface NumberStyleOpts {\n datagrid_number_style: {\n fg_gradient: number;\n pos_fg_color: string;\n neg_fg_color: string;\n number_fg_mode: string;\n bg_gradient: number;\n pos_bg_color: string;\n neg_bg_color: string;\n number_bg_mode: string;\n };\n number_string_format: boolean;\n}\n\ninterface DatetimeStyleOpts {\n datagrid_datetime_style?: {\n color: string;\n bg_color: string;\n };\n datagrid_string_style?: {\n color: string;\n bg_color: string;\n };\n}\n\nexport type ColumnStyleOpts = NumberStyleOpts | DatetimeStyleOpts | null;\n\nexport default function column_style_opts(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string,\n): ColumnStyleOpts {\n if (type === \"integer\" || type === \"float\") {\n return {\n datagrid_number_style: {\n fg_gradient: 0,\n pos_fg_color: this.model!._pos_fg_color[0],\n neg_fg_color: this.model!._neg_fg_color[0],\n number_fg_mode: \"color\",\n bg_gradient: 0,\n pos_bg_color: this.model!._pos_bg_color[0],\n neg_bg_color: this.model!._neg_bg_color[0],\n number_bg_mode: \"disabled\",\n },\n number_string_format: true,\n };\n } else if (type === \"date\" || type === \"datetime\" || type === \"string\") {\n const control =\n type === \"date\" || type === \"datetime\"\n ? \"datagrid_datetime_style\"\n : `datagrid_string_style`;\n return {\n [control]: {\n color: this.model!._color[0],\n bg_color: this.model!._color[0],\n },\n } as DatetimeStyleOpts;\n } else {\n return null;\n }\n}\n", "regular-table{padding:0;margin:12px 0 0 12px;font-family:inherit;--rt-hover--border-color:var(--inactive--color,#c5c9d080);}regular-table div[tabindex]{outline:none;}regular-table>div{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;}regular-table th{text-align:center;}regular-table thead tr:not(.rt-autosize) th{overflow:hidden;max-width:0px;}regular-table thead tr:last-child .rt-float,regular-table tbody .rt-float{text-align:right;}regular-table thead .rt-integer,regular-table tbody .rt-integer{text-align:right;}regular-table tbody th{text-align:left;}regular-table span.rt-tree-container{display:flex;align-items:center;height:100%;}regular-table thead .rt-string,regular-table tbody .rt-string,regular-table thead .rt-date,regular-table tbody .rt-date,regular-table thead .rt-datetime,regular-table tbody .rt-datetime{text-align:left;}regular-table thead tr:last-child th{border-bottom:1px solid#8b868045;}regular-table tbody tr:first-child td,regular-table tbody tr:first-child th{border-top:1px solid transparent!important;}regular-table th{position:relative;}regular-table tr th span.rt-tree-group{margin-left:5px;margin-right:15px;border-left:1px solid#eee;height:100%;}regular-table td,regular-table th{white-space:nowrap;font-size:12px;padding-right:5px;padding-left:5px;padding-top:0px;padding-bottom:0px;height:19px;}regular-table table *{box-sizing:border-box;}regular-table table{position:absolute;color:#666;outline:none;}regular-table span.rt-row-header-icon{color:#aaa;padding-right:4px;font-family:var(--button--font-family);}regular-table span.rt-column-header-icon{font-size:10px;padding-left:3px;display:inline-block;width:10px;font-family:var(--button--font-family);}regular-table span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0px 0px 3px#1a7da1;}regular-table .rt-selected td{background-color:#eee;}regular-table .rt-cell-clip{overflow:hidden;text-overflow:ellipsis;}regular-table td span.rt-group-name,regular-table th span.rt-group-name{margin-right:-5px;padding-right:5px;padding-left:8px;flex:1;height:100%;}regular-table th span.rt-group-name{text-align:left;}regular-table td th span.rt-group-leaf,regular-table th span.rt-group-leaf{margin-left:16px;height:100%;}regular-table .rt-column-resize{height:100%;width:10px;position:absolute;top:0;right:0;cursor:col-resize;}regular-table a{color:var(--rt-pos-cell--color);}regular-table a:visited{color:var(--active--color);}regular-table td.psp-null:after,regular-table th.psp-null:after{content:var(--null--content,\"-\");}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-group{box-shadow:0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-is-top{box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045);}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-header-border.psp-header-group:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}perspective-viewer[settings] tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer[settings]) tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--inactive--border-color,#8b868045);}tr:only-child th{box-shadow:none!important;}regular-table tbody tr:hover th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover:after{border-color:var(--rt-hover--border-color,#c5c9d080)!important;box-shadow:0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover th.psp-tree-leaf.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr.psp-menu-open:hover:after{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:last-child:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover+tr th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td:not(.psp-row-selected):not(.psp-row-subselected){border-top-color:transparent;}regular-table tbody tr th:first-child:not(:empty),regular-table tbody tr th:first-child:empty+th:not(:empty),regular-table tbody tr th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr td:first-child{border-left-width:1px;border-left-color:transparent;}regular-table tbody tr th:last-child,regular-table tbody tr td:last-child{border-right-width:0px;border-right-color:transparent;}regular-table tbody tr:hover{color:inherit;}regular-table tbody tr:hover th:first-child:not(:empty),regular-table tbody tr:hover th:first-child:empty+th:not(:empty),regular-table tbody tr:hover th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr:hover td:first-child{border-left-color:var(--rt-hover--border-color,#c5c9d080)!important;}regular-table tbody tr:hover th:last-child,regular-table tbody tr:hover td:last-child{border-right-color:var(--rt-hover--border-color,#c5c9d080)!important;}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody td,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody{transform:translate(0,var(--regular-table--transform-y,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child th,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child th,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) var(--regular-table--clip-y,0),var(--regular-table--clip-x,0) 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr:last-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr:last-child:after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:not(:first-child):after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:hover:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:hover:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner){clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}regular-table{outline:none;}regular-table::-webkit-scrollbar,regular-table::-webkit-scrollbar-corner{background-color:transparent;height:12px;width:12px;}regular-table::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--icon--color);border:5.5px solid var(--plugin--background);max-height:50%;max-width:50%;min-width:10%;min-height:10%;}perspective-viewer .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}perspective-viewer .psp-menu-enabled:hover,perspective-viewer tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}perspective-viewer tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}perspective-viewer td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}perspective-viewer tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}perspective-viewer tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}:host .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}:host .psp-menu-enabled:hover,:host tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}:host tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}:host td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}:host tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}:host tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}perspective-viewer regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer) regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}.psp-sort-enabled:hover{cursor:pointer;}.psp-row-selected,:hover .psp-row-selected,:hover th.psp-tree-leaf.psp-row-selected,:hover th.psp-tree-label.psp-row-selected{color:white!important;background-color:var(--selected-row--background-color,#ea7319)!important;border-color:var(--selected-row--background-color,#ea7319)!important;}.psp-row-selected.psp-tree-label:not(:hover):before{color:white;}.psp-row-subselected,:hover .psp-row-subselected,:hover th.psp-tree-leaf.psp-row-subselected,:hover th.psp-tree-label.psp-row-subselected{background:rgba(234,115,25,0.2)!important;}.psp-error{color:red;}td:focus{outline:#666;outline-style:dotted;outline-width:1px;}perspective-viewer.dragging regular-table{pointer-events:none;}:host-context(perspective-viewer.dragging) regular-table{pointer-events:none;}.psp-header-border:last-child{border-right-width:0px;}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-desc-icon--mask-image);mask-image:var(--sort-desc-icon--mask-image);}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-asc-icon--mask-image);mask-image:var(--sort-asc-icon--mask-image);}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-desc-icon--mask-image);mask-image:var(--sort-col-desc-icon--mask-image);}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-asc-icon--mask-image);mask-image:var(--sort-col-asc-icon--mask-image);}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-desc-icon--mask-image);mask-image:var(--sort-abs-desc-icon--mask-image);}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-asc-icon--mask-image);mask-image:var(--sort-abs-asc-icon--mask-image);}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-desc-icon--mask-image);mask-image:var(--sort-abs-col-desc-icon--mask-image);}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-asc-icon--mask-image);mask-image:var(--sort-abs-col-asc-icon--mask-image);}tbody th:last-of-type{border-right:1px solid var(--inactive--border-color,#8b868045);overflow:hidden;text-overflow:ellipsis;}tbody th:empty{background-image:linear-gradient(to right,transparent 9px,var(--inactive--border-color,#eee) 10px,transparent 11px);background-repeat:no-repeat;min-width:20px;max-width:20px;pointer-events:none;}.psp-tree-label{max-width:0px;min-width:0px;}.psp-tree-label:before{color:var(--icon--color);font-family:var(--button--font-family,inherit);padding-right:11px;}.psp-tree-label-expand:before{content:var(--tree-label-expand--content,\"+\");}.psp-tree-label-collapse:before{content:var(--tree-label-collapse--content,\"-\");}.psp-tree-label-expand,.psp-tree-label-collapse{cursor:pointer;}.psp-tree-label:hover:before{color:var(--active--color);text-shadow:0px 0px 5px var(--active--color);}.psp-tree-leaf{padding-left:24px;}.psp-align-right{text-align:right;}.psp-align-left{text-align:left;}.psp-positive:not(:focus){color:var(--rt-pos-cell--color);}.psp-negative:not(:focus){color:var(--rt-neg-cell--color);}regular-table table tbody td{min-width:52px!important;}.psp-is-width-override .rt-column-resize,.rt-column-resize:hover{border:1px dashed#999;border-bottom-width:0px;border-left-width:0px;}.boolean-editable{cursor:pointer;}regular-table table{user-select:none;color:inherit;border-collapse:separate;}regular-table table th{font-weight:400;}regular-table table td,regular-table table th{border-color:var(--inactive--border-color,#8b868045);height:23px;}regular-table table .psp-header-group{text-overflow:ellipsis;}regular-table table th.psp-header-leaf{border-bottom-width:0px;}regular-table table th.psp-header-leaf span{height:23px;min-height:23px;}regular-table table td,regular-table table th.psp-tree-label,regular-table table th.psp-tree-label,regular-table table th.psp-tree-leaf,regular-table table tbody tr:first-child th{border-style:solid;border-width:0px;border-top-width:1px;}regular-table table tbody th:empty{background-position:0px -10px;}regular-table table td.psp-select-region,regular-table table th.psp-select-region{background-color:var(--icon--color)!important;color:var(--plugin--background)!important;border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected){border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--datagrid-column-edit-button--content,\"Edit\");}perspective-viewer:not([settings]) regular-table #psp-column-edit-buttons:after{content:none;}:host-context(perspective-viewer:not([settings])) regular-table #psp-column-edit-buttons:after{content:none;}regular-table table thead tr:last-child:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-bottom:1px solid var(--inactive--border-color);}regular-table table tbody tr:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-top:1px solid transparent;}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--inactive--border-color);}regular-table table tbody tr:hover:not(:first-child):after{border-top:1px solid var(--rt-hover--border-color);}regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--rt-hover--border-color);}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { activate } from \"../plugin/activate.js\";\nimport { restore } from \"../plugin/restore.js\";\nimport { save } from \"../plugin/save.js\";\nimport { draw } from \"../plugin/draw.js\";\nimport column_style_controls, {\n ColumnStyleOpts,\n} from \"../plugin/column_style_controls.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type { IPerspectiveViewerPlugin } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\n PerspectiveViewerElement,\n DatagridPluginConfig,\n ColumnsConfig,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ntype RenderTarget = \"shadow\" | \"light\";\n\n/**\n * The custom element class for this plugin. The interface methods for this\n */\nexport class HTMLPerspectiveViewerDatagridPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n private static _global_stylesheet_installed: boolean = false;\n private static _sheet: CSSStyleSheet | undefined;\n\n // Determines whether this datagrid renders in the light DOM. This will\n // break style encapsulation and may cause inconsistent behavior.\n static renderTarget: RenderTarget =\n window.CSS?.supports &&\n window.CSS?.supports(\"selector(:host-context(foo))\")\n ? \"shadow\"\n : \"light\";\n\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n\n constructor() {\n super();\n this.regular_table = document.createElement(\n \"regular-table\",\n ) as RegularTableElement;\n this.regular_table.part = \"regular-table\";\n this._is_scroll_lock = false;\n this._edit_mode = \"READ_ONLY\";\n const Elem = HTMLPerspectiveViewerDatagridPluginElement;\n if (!Elem._sheet) {\n Elem._sheet = new CSSStyleSheet();\n Elem._sheet.replaceSync(datagridStyles);\n }\n\n if (Elem.renderTarget === \"shadow\") {\n const shadow = this.attachShadow({ mode: \"open\" });\n shadow.adoptedStyleSheets.push(Elem._sheet);\n } else if (\n Elem.renderTarget === \"light\" &&\n !Elem._global_stylesheet_installed\n ) {\n Elem._global_stylesheet_installed = true;\n document.adoptedStyleSheets.push(Elem._sheet);\n }\n }\n\n connectedCallback(): void {\n if (!this._toolbar) {\n this._toolbar = document.createElement(\n \"perspective-viewer-datagrid-toolbar\",\n ) as DatagridToolbarElement;\n }\n\n const parent = this.parentElement;\n if (parent) {\n parent.appendChild(this._toolbar);\n }\n }\n\n disconnectedCallback(): void {\n this._toolbar?.parentElement?.removeChild?.(this._toolbar);\n }\n\n async activate(view: View): Promise<void> {\n return await activate.call(this, view);\n }\n\n get name(): string {\n return \"Datagrid\";\n }\n\n get category(): string {\n return \"Basic\";\n }\n\n get select_mode(): string {\n return \"toggle\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] {\n return [\"Columns\"];\n }\n\n /**\n * Give the Datagrid a higher priority so it is loaded\n * over the default charts by default.\n */\n get priority(): number {\n return 1;\n }\n\n can_render_column_styles(type: string, _group: string): boolean {\n return type !== \"boolean\";\n }\n\n column_style_controls(type: string, group: string): ColumnStyleOpts {\n return column_style_controls.call(this, type as any, group);\n }\n\n async draw(view: View): Promise<void> {\n return await draw.call(this, view);\n }\n\n async update(view: View): Promise<void> {\n if (this.model === undefined) {\n await this.draw(view);\n } else if (this.model._config.split_by?.length > 0) {\n const dimensions = await view.dimensions();\n this.model._num_rows = dimensions.num_view_rows;\n await this.regular_table.draw();\n } else {\n this.model._num_rows = await view.num_rows();\n await this.regular_table.draw();\n }\n }\n\n async render(viewport?: ViewWindow): Promise<string> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const view = await viewer.getView();\n const json = await view.to_columns(viewport as any);\n const cols = await view.column_paths(viewport as any);\n\n const nrows =\n viewport?.end_row !== undefined &&\n viewport?.end_row !== null &&\n viewport?.start_row !== undefined &&\n viewport?.start_row !== null\n ? viewport.end_row - viewport.start_row\n : await view.num_rows();\n let out = \"\";\n for (let ridx = 0; ridx < nrows; ridx++) {\n for (const col_name of cols) {\n const col = (json as Record<string, unknown[]>)[col_name];\n const type = this.model!._schema[col_name];\n const pluginConfig = (this.regular_table as any)[\n PRIVATE_PLUGIN_SYMBOL\n ] as ColumnsConfig | undefined;\n const columnName = col_name.split(\"|\").at(-1)!;\n const formatter = format_raw(\n type,\n pluginConfig?.[columnName] || {},\n );\n\n if (formatter) {\n out += formatter.format(col[ridx]) + \"\\t\";\n } else {\n out += col[ridx] + \"\\t\";\n }\n }\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(): Promise<void> {\n if (!this.isConnected || this.offsetParent == null) {\n return;\n }\n\n if (this._initialized) {\n await this.regular_table.draw();\n }\n }\n\n async clear(): Promise<void> {\n this.regular_table.resetAutoSize();\n this.regular_table.clear();\n }\n\n async save(): Promise<any> {\n return save.call(this);\n }\n\n async restore(\n token: DatagridPluginConfig,\n columns_config?: ColumnsConfig,\n ): Promise<any> {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(this.model._view);\n }\n }\n\n async delete(): Promise<void> {\n this.disconnectedCallback();\n this._toolbar = undefined;\n if ((this.regular_table as any).table_model) {\n this.regular_table.resetAutoSize();\n }\n\n this.regular_table.clear();\n }\n}\n", ":host{position:relative;display:block;height:100%;}:host #container{position:absolute;display:flex;flex-direction:column;justify-content:stretch;align-items:stretch;top:0;left:0;right:0;bottom:0;}:host #toolbar{display:flex;align-items:stretch;height:100%;}:host #toolbar .hover-target{margin:0;display:inline-flex;align-items:center;cursor:pointer;}:host #toolbar .hover-target:hover{box-shadow:-4px 0 0 var(--icon--color),4px 0 0 var(--icon--color);background-color:var(--icon--color);}:host #slot-container{flex:1;position:relative;}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--toolbar-scroll-lock-active--content);}#scroll_lock:before{-webkit-mask-image:var(--toolbar-scroll-lock--content);}#select_mode:before{content:\"highlight_alt\";}#edit_mode:before{-webkit-mask-image:\"\";}#edit_mode[data-edit-mode=\"READ_ONLY\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--edit--content);}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"SELECT_ROW\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-row--content);}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-column--content);}#edit_mode[data-edit-mode=\"SELECT_REGION\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-region--content);}#edit_mode[data-edit-mode=\"READ_ONLY\"] span:before{content:var(--edit-mode--read-only--content,\"Read Only\");}#edit_mode[data-edit-mode=\"EDIT\"] span:before{content:var(--edit-mode--edit--content,\"Editable\");}#edit_mode[data-edit-mode=\"SELECT_ROW\"] span:before{content:var(--edit-mode--select-row--content,\"Row Select\");}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"] span:before{content:var(--edit-mode--select-column--content,\"Column Select\");}#edit_mode[data-edit-mode=\"SELECT_REGION\"] span:before{content:var(--edit-mode--select-region--content,\"Region Select\");}#scroll_lock span:before{content:var(--scroll-lock-toggle--content,\"Free Scroll\");}#scroll_lock.lock-scroll span:before{content:var(--scroll-lock-alt-toggle--content,\"Align Scroll\");}.button:before{width:21px;height:21px;content:\"\";-webkit-mask-size:cover;mask-size:cover;background-color:var(--icon--color);}.button.editable:before,.button.lock-scroll:before{color:inherit;}.button{display:inline-flex;justify-content:center;align-items:center;user-select:none;padding:0 5px;border:1px solid transparent;border-radius:3px;border:1px solid transparent;box-sizing:border-box;display:inline-flex;font-size:var(--label--font-size,0.75em);height:22px;user-select:none;white-space:nowrap;width:37px;}.button>span{display:none;margin:0;padding:0;}.hover-target:focus-within .button,.hover-target:hover .button{position:relative;background-color:var(--icon--color);color:var(--plugin--background);opacity:1;display:flex;align-items:center;cursor:pointer;}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--plugin--background);}.hover-target:focus-within .button>span,.hover-target:hover .button>span{display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%;margin:0;padding:5px;height:auto;white-space:pre-wrap;line-height:1;font-size:9px;background-color:var(--icon--color);width:35px;text-align:center;border-radius:0 0 3px 3px;}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nconst stylesheet = new CSSStyleSheet();\nstylesheet.replaceSync(TOOLBAR_STYLE);\n\n/**\n * The custom element for this plugin's toolbar, a component which displays in\n * the host `<perspective-viewer>`'s status bar when this plugin is active.\n * In the case of Datagrid, this comprises \"Editable\" and \"Scroll Lock\" toggle\n * buttons.\n */\nexport class HTMLPerspectiveViewerDatagridToolbarElement extends HTMLElement {\n private _initialized: boolean = false;\n\n connectedCallback(): void {\n if (this._initialized) {\n return;\n }\n\n this._initialized = true;\n this.setAttribute(\"slot\", \"statusbar-extra\");\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot!.adoptedStyleSheets.push(stylesheet);\n this.shadowRoot!.innerHTML = `\n <div id=\"toolbar\">\n <span class=\"hover-target\">\n <span id=\"scroll_lock\" class=\"button\">\n <span></span>\n </span>\n </span>\n <span class=\"hover-target\">\n <span id=\"edit_mode\" class=\"button\" data-edit-mode=\"READ_ONLY\">\n <span></span>\n </span>\n </span>\n </div>\n `;\n\n const viewer = this.parentElement as PerspectiveViewerElement;\n const plugin = this.previousElementSibling as DatagridPluginElement;\n\n plugin._scroll_lock = this.shadowRoot!.querySelector(\n \"#scroll_lock\",\n ) as HTMLElement;\n plugin._scroll_lock.addEventListener(\"click\", () =>\n toggle_scroll_lock.call(plugin),\n );\n\n plugin._edit_button = this.shadowRoot!.querySelector(\n \"#edit_mode\",\n ) as HTMLElement;\n plugin._edit_button.addEventListener(\"click\", () => {\n toggle_edit_mode.call(plugin);\n plugin.regular_table.draw();\n viewer.dispatchEvent(new Event(\"perspective-config-update\"));\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["get_psp_type", "model", "metadata", "PRIVATE_PLUGIN_SYMBOL", "chroma", "BooleanFormatter", "val", "LEGACY_CONFIG", "FormatterCache", "_type", "plugin", "options", "type", "format", "_plugin", "formatter_key", "FORMAT_CACHE", "FormatterCache", "MAX_BAR_WIDTH_PCT", "format_raw", "type", "value", "format_cell", "title", "val", "plugins", "use_table_schema", "plugin", "div", "anchor", "pct", "bold", "italic", "formatter", "format_tree_header_row_path", "paths", "row_headers", "regularTable", "plugins", "PRIVATE_PLUGIN_SYMBOL", "path", "fullPath", "last", "newPath", "formatted", "format_cell", "format_tree_header", "new_path", "idx", "createDataListener", "viewer", "last_meta", "last_column_paths", "last_ids", "last_reverse_ids", "last_reverse_columns", "regularTable", "x0", "y0", "x1", "y1", "columns", "new_window", "num_columns", "x", "z", "new_col_paths", "changed_cols", "i", "a", "b", "column", "
|
|
4
|
+
"sourcesContent": ["// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"./custom_elements/datagrid.js\";\nimport { HTMLPerspectiveViewerDatagridToolbarElement } from \"./custom_elements/toolbar.js\";\n\n/******************************************************************************\n *\n * Main\n *\n */\n\ninterface PerspectiveViewerConstructor {\n registerPlugin(tagName: string): void;\n}\n\nasync function _register_element(): Promise<void> {\n customElements.define(\n \"perspective-viewer-datagrid-toolbar\",\n HTMLPerspectiveViewerDatagridToolbarElement,\n );\n\n customElements.define(\n \"perspective-viewer-datagrid\",\n HTMLPerspectiveViewerDatagridPluginElement,\n );\n\n await customElements.whenDefined(\"perspective-viewer\");\n const PerspectiveViewer = customElements.get(\n \"perspective-viewer\",\n ) as unknown as PerspectiveViewerConstructor;\n PerspectiveViewer.registerPlugin(\"perspective-viewer-datagrid\");\n}\n\n_register_element();\n\nexport { PRIVATE_PLUGIN_SYMBOL } from \"./types.js\";\nexport { HTMLPerspectiveViewerDatagridPluginElement };\nexport { HTMLPerspectiveViewerDatagridToolbarElement };\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n View,\n Table,\n ViewConfig,\n ColumnType,\n SortDir,\n ViewWindow,\n ViewConfigUpdate,\n} from \"@perspective-dev/client\";\nimport { RegularTableElement } from \"regular-table\";\nimport { CellMetadata, DataResponse } from \"regular-table/dist/esm/types\";\n\n// Re-export types from regular-table for use throughout the codebase\nexport type { RegularTableElement as RegularTable };\n\nexport function get_psp_type(\n model: DatagridModel,\n metadata: CellMetadata,\n): ColumnType {\n if (\n metadata.type === \"body\" ||\n metadata.type === \"column_header\" ||\n metadata.type === \"corner\"\n ) {\n return model._column_types[metadata.x];\n } else {\n return model._row_header_types[(metadata.row_header_x ?? 0) - 1];\n }\n}\n\n// Edit mode for the datagrid\nexport type EditMode =\n | \"READ_ONLY\"\n | \"EDIT\"\n | \"SELECT_COLUMN\"\n | \"SELECT_ROW\"\n | \"SELECT_REGION\";\n\n// Color record for styling - tuple returned by make_color_record\nexport type ColorRecord = [\n string, // hex color\n number, // red\n number, // green\n number, // blue\n string, // gradient\n string, // rgba solid\n string, // rgba transparent\n];\n\nexport type SortTerm = [string, SortDir];\n\n// Selection state for mouse-based region selection\nexport interface SelectionArea {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport interface SelectionState {\n selected_areas: SelectionArea[];\n dirty: boolean;\n CURRENT_MOUSEDOWN_COORDINATES?: { x?: number; y?: number };\n old_selected_areas?: SelectionArea[];\n potential_selection?: SelectionArea;\n}\n\n// Position tracking for cell focus\nexport interface SelectedPosition {\n x: number;\n y: number;\n content?: string;\n}\n\n// Column configuration values from viewer\nexport interface ColumnConfig {\n color?: string;\n pos_fg_color?: string;\n neg_fg_color?: string;\n pos_bg_color?: string;\n neg_bg_color?: string;\n fg_gradient?: number;\n bg_gradient?: number;\n number_fg_mode?: string;\n number_bg_mode?: string;\n string_color_mode?: string;\n datetime_color_mode?: string;\n fixed?: number;\n aggregate_depth?: number;\n column_size_override?: number;\n format?: string;\n date_format?: DateFormatConfig;\n number_format?: NumberFormatConfig;\n}\n\n// Date format configuration for column styling\nexport interface DateFormatConfig {\n format?: \"custom\" | string;\n timeZone?: string;\n dateStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n timeStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n second?: \"numeric\" | \"2-digit\" | \"disabled\";\n minute?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour?: \"numeric\" | \"2-digit\" | \"disabled\";\n day?: \"numeric\" | \"2-digit\" | \"disabled\";\n weekday?: \"narrow\" | \"short\" | \"long\" | \"disabled\";\n month?: \"numeric\" | \"2-digit\" | \"narrow\" | \"short\" | \"long\" | \"disabled\";\n year?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour12?: boolean;\n fractionalSecondDigits?: 1 | 2 | 3;\n}\n\n// Number format configuration for column styling\nexport interface NumberFormatConfig {\n style?: \"decimal\" | \"currency\" | \"percent\" | \"unit\";\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n minimumIntegerDigits?: number;\n minimumSignificantDigits?: number;\n maximumSignificantDigits?: number;\n currency?: string;\n currencyDisplay?: \"code\" | \"symbol\" | \"narrowSymbol\" | \"name\";\n notation?: \"standard\" | \"scientific\" | \"engineering\" | \"compact\";\n compactDisplay?: \"short\" | \"long\";\n useGrouping?: boolean;\n}\n\nexport type ColumnsConfig = Record<string, ColumnConfig>;\n\n// Plugin save state\nexport interface DatagridPluginConfig {\n columns?: ColumnsConfig;\n editable?: boolean;\n scroll_lock?: boolean;\n edit_mode?: EditMode;\n column_size_override?: Record<string, number>;\n}\n\n// Element factory for reusing DOM elements\nexport interface ElemFactory {\n clear(): void;\n get(): HTMLElement;\n}\n\nexport type Schema = Record<string, ColumnType>;\n\n// Model object stored on regular-table\nexport interface DatagridModel {\n _edit_port: number;\n _view: View;\n _table: Table;\n _table_schema: Schema;\n _config: ViewConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _ids: unknown[][];\n _plugin_background: number[];\n _color: ColorRecord;\n _pos_fg_color: ColorRecord;\n _neg_fg_color: ColorRecord;\n _pos_bg_color: ColorRecord;\n _neg_bg_color: ColorRecord;\n _column_paths: string[];\n _column_types: ColumnType[];\n _is_editable: boolean[];\n _edit_mode: EditMode;\n _selection_state: SelectionState;\n _row_header_types: ColumnType[];\n _series_color_map: Map<string, Map<string, number>>;\n _series_color_seed: Map<string, number>;\n _div_factory: ElemFactory;\n _last_window?: ViewWindow;\n _is_old_viewport?: boolean;\n _reverse_columns?: Map<string, number>;\n _reverse_ids?: Map<string, number>;\n last_column_paths?: string[];\n last_meta?: unknown[][];\n last_ids?: unknown[][];\n last_reverse_ids?: Map<string, number>;\n last_reverse_columns?: Map<string, number>;\n get_psp_type(metadata: CellMetadata): ColumnType;\n _column_settings_selected_column?: string;\n}\n\n// Symbol for private plugin data on regular-table\nexport const PRIVATE_PLUGIN_SYMBOL: unique symbol = Symbol(\n \"Perspective Column Config\",\n);\n\n// Data listener function type\nexport type DataListener = (\n regularTable: RegularTableElement,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse>;\n\n// Style listener function type\nexport type StyleListener = () => void;\n\n// Perspective viewer element interface (subset)\nexport interface PerspectiveViewerElement extends HTMLElement {\n getView(): Promise<View>;\n getTable(): Promise<Table>;\n getEditPort(): Promise<number>;\n restore(config: Partial<ViewConfig>): Promise<void>;\n toggleColumnSettings(columnName?: string): Promise<void>;\n hasAttribute(name: string): boolean;\n setSelection(viewport?: ViewWindow): void;\n dispatchEvent(event: Event): boolean;\n children: HTMLCollectionOf<HTMLElement>;\n}\n\n// Toolbar element interface\nexport interface DatagridToolbarElement extends HTMLElement {\n setEditButton(button: HTMLElement): void;\n setScrollLockButton(button: HTMLElement): void;\n}\n\n// Column override for persisting column sizes\nexport type ColumnOverrides = Record<string, number | undefined>;\n\n// Formatter cache types\nexport interface FormatterCacheEntry {\n format(value: unknown): string;\n}\n\nexport type FormatterCache = Map<string, FormatterCacheEntry>;\n\n// Cell config result from getCellConfig\nexport interface CellConfigResult {\n row: Record<string, unknown>;\n column_names: string[];\n config: ViewConfigUpdate;\n}\n\n// Custom event detail types\nexport interface PerspectiveClickDetail {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\nexport { PerspectiveSelectDetail } from \"@perspective-dev/viewer\";\n\n// Mouse event with handled flag\nexport interface HandledMouseEvent extends MouseEvent {\n handled?: boolean;\n}\n\n// Sort order mappings\nexport type SortRotationOrder = Record<string, SortDir | undefined>;\n\n// Datagrid plugin element interface for toolbar\nexport interface DatagridPluginElement extends HTMLElement {\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n}\n\n// Map types for selected rows and positions\nexport type SelectedRowsMap = WeakMap<RegularTableElement, Set<number>>;\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record } from \"../color_utils.js\";\nimport type {\n ColumnType,\n Table,\n View,\n ViewConfig,\n} from \"@perspective-dev/client\";\nimport {\n type DatagridModel,\n type DatagridPluginElement,\n type RegularTable,\n type Schema,\n type ElemFactory,\n type EditMode,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../types.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\nfunction get_rule(regular: HTMLElement, tag: string, def: string): string {\n const color = window.getComputedStyle(regular).getPropertyValue(tag).trim();\n if (color.length > 0) {\n return color;\n } else {\n return def;\n }\n}\n\nclass ElemFactoryImpl implements ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n clear(): void {\n this._index = 0;\n }\n\n get(): HTMLElement {\n if (!this._elements[this._index]) {\n this._elements[this._index] = document.createElement(this._name);\n }\n const elem = this._elements[this._index];\n this._index += 1;\n return elem;\n }\n}\n\nexport async function createModel(\n this: DatagridPluginElement,\n regular: RegularTable,\n table: Table,\n view: View,\n extend: Partial<DatagridModel> = {},\n): Promise<DatagridModel> {\n const config = (await view.get_config()) as ViewConfig;\n if (this?.model?._config) {\n const old = this.model._config;\n let group_by_changed = old.group_by.length !== config.group_by.length;\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n if (!group_by_changed) {\n for (const lvl in old.group_by) {\n group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];\n }\n }\n\n let split_by_changed = old.split_by.length !== config.split_by.length;\n if (!split_by_changed) {\n for (const lvl in old.split_by) {\n split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];\n }\n }\n\n let columns_changed = old.columns.length !== config.columns.length;\n if (!columns_changed) {\n for (const lvl in old.columns) {\n columns_changed ||= config.columns[lvl] !== old.columns[lvl];\n }\n }\n\n let filter_changed = old.filter.length !== config.filter.length;\n if (!filter_changed) {\n for (const lvl in old.filter) {\n for (const i in config.filter[lvl]) {\n filter_changed ||=\n config.filter[lvl][i as unknown as number] !==\n old.filter[lvl][i as unknown as number];\n }\n }\n }\n\n let sort_changed = old.sort.length !== config.sort.length;\n if (!sort_changed) {\n for (const lvl in old.sort) {\n for (const i in config.sort[lvl]) {\n sort_changed ||=\n config.sort[lvl][i as unknown as number] !==\n old.sort[lvl][i as unknown as number];\n }\n }\n }\n\n const group_rollup_mode_changed =\n old.group_rollup_mode !== config.group_rollup_mode;\n\n this._reset_scroll_top = group_by_changed;\n this._reset_scroll_left = split_by_changed;\n this._reset_select =\n group_by_changed ||\n split_by_changed ||\n filter_changed ||\n sort_changed ||\n columns_changed;\n\n this._reset_column_size =\n group_rollup_mode_changed ||\n split_by_changed ||\n group_by_changed ||\n columns_changed ||\n type_changed;\n }\n\n const [table_schema, num_rows, schema, expression_schema, _edit_port] =\n await Promise.all([\n table.schema(),\n view.num_rows(),\n view.schema(),\n view.expression_schema(),\n (this.parentElement as PerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = chroma(\n get_rule(regular, \"--plugin--background\", \"#FFFFFF\"),\n ).rgb();\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--rt-pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--rt-neg-cell--color\", \"#FF5942\"),\n );\n\n const _pos_bg_color = make_color_record(\n blend(_pos_fg_color[0], _plugin_background),\n );\n\n const _neg_bg_color = make_color_record(\n blend(_neg_fg_color[0], _plugin_background),\n );\n\n const _color = make_color_record(\n get_rule(regular, \"--active--color\", \"#ff0000\"),\n );\n\n const _schema: Schema = {\n ...(schema as Schema),\n ...(expression_schema as Schema),\n };\n const _table_schema: Schema = {\n ...(table_schema as Schema),\n ...(expression_schema as Schema),\n };\n\n const _column_paths: string[] = [];\n const _is_editable: boolean[] = [];\n const _column_types: ColumnType[] = [];\n\n const _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n this._edit_button!.dataset.editMode = _edit_mode;\n\n const model: DatagridModel = Object.assign(extend, {\n _edit_port,\n _view: view,\n _table: table,\n _table_schema,\n _config: config,\n _num_rows: num_rows,\n _schema,\n _ids: [],\n _plugin_background,\n _color,\n _pos_fg_color,\n _neg_fg_color,\n _pos_bg_color,\n _neg_bg_color,\n _column_paths,\n _column_types,\n _is_editable,\n _edit_mode,\n _selection_state: {\n selected_areas: [],\n dirty: false,\n },\n _row_header_types: config.group_by.map((column_path) => {\n return _table_schema[column_path];\n }),\n _series_color_map: new Map<string, string>(),\n _series_color_seed: new Map<string, number>(),\n // get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(this.parentElement as PerspectiveViewerElement).bind(\n model,\n regular,\n ) as any,\n {\n virtual_mode: (window\n .getComputedStyle(regular)\n .getPropertyValue(\"--datagrid-virtual-mode\")\n ?.trim() || \"both\") as\n | \"both\"\n | \"horizontal\"\n | \"vertical\"\n | \"none\",\n },\n );\n\n return model;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { ColumnConfig } from \"../types.js\";\n\nexport interface Formatter {\n format(val: unknown): string;\n}\n\nclass BooleanFormatter implements Formatter {\n format(val: unknown): string {\n return val ? \"true\" : \"false\";\n }\n}\n\n// PluginConfig is a subset of ColumnConfig with the formatting properties\ntype PluginConfig = Pick<ColumnConfig, \"date_format\" | \"number_format\">;\n\nconst LEGACY_CONFIG: Record<\n string,\n { format: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions }\n> = {\n float: {\n format: {\n style: \"decimal\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n },\n datetime: {\n format: {\n dateStyle: \"short\",\n timeStyle: \"medium\",\n } as Intl.DateTimeFormatOptions,\n },\n date: {\n format: {\n dateStyle: \"short\",\n } as Intl.DateTimeFormatOptions,\n },\n};\n\nexport class FormatterCache {\n private _formatters: Map<string, Formatter | false>;\n\n constructor() {\n this._formatters = new Map();\n }\n\n private create_datetime_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n if (plugin.date_format?.format !== \"custom\") {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n timeStyle:\n plugin.date_format?.timeStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.timeStyle ?? \"medium\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n } else {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n hour12: plugin.date_format?.hour12 ?? true,\n fractionalSecondDigits:\n plugin.date_format?.fractionalSecondDigits,\n };\n\n if (plugin.date_format?.year !== \"disabled\") {\n options.year = plugin.date_format?.year ?? \"2-digit\";\n }\n if (plugin.date_format?.month !== \"disabled\") {\n options.month = plugin.date_format?.month ?? \"numeric\";\n }\n if (plugin.date_format?.day !== \"disabled\") {\n options.day = plugin.date_format?.day ?? \"numeric\";\n }\n if (\n plugin.date_format?.weekday &&\n plugin.date_format?.weekday !== \"disabled\"\n ) {\n options.weekday = plugin.date_format.weekday;\n }\n if (plugin.date_format?.hour !== \"disabled\") {\n options.hour = plugin.date_format?.hour ?? \"numeric\";\n }\n if (plugin.date_format?.minute !== \"disabled\") {\n options.minute = plugin.date_format?.minute ?? \"numeric\";\n }\n if (plugin.date_format?.second !== \"disabled\") {\n options.second = plugin.date_format?.second ?? \"numeric\";\n }\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n }\n\n private create_date_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"utc\",\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n\n private create_number_formatter(\n type: ColumnType,\n plugin: PluginConfig,\n ): Intl.NumberFormat {\n const format =\n plugin.number_format ??\n (LEGACY_CONFIG[type]?.format as Intl.NumberFormatOptions);\n return new Intl.NumberFormat(navigator.languages as string[], format);\n }\n\n private create_boolean_formatter(\n _type: ColumnType,\n _plugin: PluginConfig,\n ): Formatter {\n return new BooleanFormatter();\n }\n\n get(type: ColumnType, plugin: PluginConfig): Formatter | false | undefined {\n const formatter_key = [\n type,\n ...Object.values(plugin.date_format ?? {}),\n ...Object.values(plugin.number_format ?? {}),\n ].join(\"-\");\n\n if (!this._formatters.has(formatter_key)) {\n if (type === \"date\") {\n this._formatters.set(\n formatter_key,\n this.create_date_formatter(type, plugin),\n );\n } else if (type === \"datetime\") {\n this._formatters.set(\n formatter_key,\n this.create_datetime_formatter(type, plugin),\n );\n } else if (type === \"integer\" || type === \"float\") {\n this._formatters.set(\n formatter_key,\n this.create_number_formatter(type, plugin),\n );\n } else if (type === \"boolean\") {\n this._formatters.set(\n formatter_key,\n this.create_boolean_formatter(type, plugin),\n );\n } else {\n this._formatters.set(formatter_key, false);\n }\n }\n\n return this._formatters.get(formatter_key);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { FormatterCache, Formatter } from \"./formatter_cache.js\";\nimport type { DatagridModel, ColumnsConfig, ColumnConfig } from \"../types.js\";\nimport { ColumnType } from \"@perspective-dev/client\";\n\nconst FORMAT_CACHE = new FormatterCache();\nconst MAX_BAR_WIDTH_PCT = 1;\n\nexport function format_raw(\n type: ColumnType,\n value: ColumnConfig,\n): Formatter | false | undefined {\n return FORMAT_CACHE.get(type, value);\n}\n\n/**\n * Format a single cell's text content as the content of a `<td>` or `<th>`.\n */\nexport function format_cell(\n this: DatagridModel,\n title: string,\n val: unknown,\n plugins: ColumnsConfig = {},\n use_table_schema = false,\n): string | HTMLElement | null {\n if (val === null) {\n return null;\n }\n\n const type: ColumnType = ((use_table_schema && this._table_schema[title]) ||\n this._schema[title] ||\n \"string\") as ColumnType;\n const plugin: ColumnConfig = plugins[title] || {};\n const is_numeric = type === \"integer\" || type === \"float\";\n\n if (is_numeric && plugin?.number_fg_mode === \"bar\") {\n const a = Math.max(\n 0,\n Math.min(\n MAX_BAR_WIDTH_PCT,\n Math.abs((val as number) / plugin.fg_gradient!) *\n MAX_BAR_WIDTH_PCT,\n ),\n );\n\n const div = this._div_factory.get();\n const anchor = (val as number) >= 0 ? \"left\" : \"right\";\n const pct = (a * 100).toFixed(2);\n div.setAttribute(\n \"style\",\n `width:calc(${pct}% - 4px);position:absolute;${anchor}:2px;height:80%;top:10%;pointer-events:none;`,\n );\n\n return div;\n } else if (plugin?.format === \"link\" && type === \"string\") {\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", val as string);\n anchor.setAttribute(\"target\", \"_blank\");\n anchor.textContent = val as string;\n return anchor;\n } else if (plugin?.format === \"bold\" && type === \"string\") {\n const bold = document.createElement(\"b\");\n bold.textContent = val as string;\n return bold;\n } else if (plugin?.format === \"italics\" && type === \"string\") {\n const italic = document.createElement(\"i\");\n italic.textContent = val as string;\n return italic;\n } else {\n const formatter = FORMAT_CACHE.get(type, plugin);\n return formatter ? formatter.format(val) : (val as string);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport type { DatagridModel, RegularTable, ColumnsConfig } from \"../types.js\";\n\ntype RowHeaderCell = string | HTMLElement | { toString(): string };\n\n/**\n * Format a single cell of the `group_by` tree header for __ROW_PATH__ data.\n */\nexport function* format_tree_header_row_path(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<RowHeaderCell[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (let path of paths) {\n const fullPath: unknown[] = [\"TOTAL\", ...path];\n const last = fullPath[fullPath.length - 1];\n let newPath: RowHeaderCell[] = fullPath\n .slice(0, fullPath.length - 1)\n .fill(\"\") as string[];\n const formatted = format_cell.call(\n this,\n row_headers[newPath.length - 1],\n last,\n plugins,\n true,\n );\n\n if (formatted instanceof HTMLElement) {\n newPath = newPath.concat(formatted);\n } else {\n newPath = newPath.concat({ toString: () => formatted as string });\n }\n\n newPath.length = row_headers.length + 1;\n yield newPath;\n }\n}\n\nexport function* format_flat_header_row_path(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<RowHeaderCell[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n\n for (let path of paths) {\n yield path.map((part, i) =>\n format_cell.call(this, row_headers[i], part, plugins, true),\n ) as RowHeaderCell[];\n }\n}\n\n/**\n * Format a single cell of the `group_by` tree header.\n */\nexport function* format_tree_header(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<unknown[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (const path of paths) {\n const new_path: unknown[] = [\"\"];\n for (const idx in path) {\n new_path.push(\n format_cell.call(\n this,\n row_headers[idx],\n path[idx],\n plugins,\n true,\n ),\n );\n }\n\n yield path;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport {\n format_flat_header_row_path,\n format_tree_header,\n format_tree_header_row_path,\n} from \"./format_tree_header.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n RegularTable,\n Schema,\n} from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport { ViewConfig, ViewWindow } from \"@perspective-dev/client\";\n\ninterface ColumnData {\n __ROW_PATH__?: unknown[][];\n __ID__?: unknown[][];\n [key: string]: unknown[] | undefined;\n}\n\n/**\n * Creates a new DataListener, suitable for passing to `regular-table`'s\n * `.setDataListener()` method. This should be called as a method on the\n * plugin.\n *\n * @returns A data listener for the plugin.\n */\nexport function createDataListener(\n viewer: PerspectiveViewerElement,\n): (\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse> {\n let last_meta: unknown[][] | undefined;\n let last_column_paths: string[] | undefined;\n let last_ids: unknown[][] | undefined;\n let last_reverse_ids: Map<string, number> | undefined;\n let last_reverse_columns: Map<string, number> | undefined;\n\n return async function dataListener(\n this: DatagridModel,\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ): Promise<DataResponse> {\n let columns: ColumnData = {};\n const new_window: ViewWindow = {\n start_row: y0,\n start_col: x0,\n end_row: y1,\n end_col: x1,\n id: true,\n };\n\n let num_columns: number | null = null;\n\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this._is_old_viewport =\n this._last_window?.start_row === y0 &&\n this._last_window?.end_row === y1 &&\n this._last_window?.start_col === x0 &&\n this._last_window?.end_col === x1;\n\n const [x, z] = await Promise.all([\n this._view.to_columns_string(new_window as any),\n this._view.num_columns(),\n ]);\n\n num_columns = z;\n columns = JSON.parse(x as string) as ColumnData;\n const y = Object.keys(columns);\n const new_col_paths = y.filter(\n (x) => x !== \"__ROW_PATH__\" && x !== \"__ID__\",\n );\n\n let changed_cols = false;\n for (let i = 0; i < new_col_paths.length; i++) {\n if (\n this._column_paths[new_window.start_col! + i] !==\n new_col_paths[i]\n ) {\n changed_cols = true;\n this._column_paths[new_window.start_col! + i] =\n new_col_paths[i];\n }\n }\n\n if (changed_cols) {\n const [a, b] = await Promise.all([\n this._view.schema(),\n this._view.expression_schema(),\n ]);\n\n this._schema = { ...(a as Schema), ...(b as Schema) };\n for (let i = 0; i < new_col_paths.length; i++) {\n const column_path_parts = new_col_paths[i].split(\"|\");\n const column =\n column_path_parts[this._config.split_by.length];\n\n this._is_editable[i + new_window.start_col!] =\n !!this._table_schema[column];\n\n this._column_types[i + new_window.start_col!] =\n this._schema[column];\n }\n }\n\n this._last_window = new_window;\n this._ids =\n columns.__ID__ ||\n Array(y1 - y0)\n .fill(null)\n .map((_, index) => [index + y0]);\n\n this._reverse_columns = this._column_paths\n .slice(x0, x1)\n .reduce((acc, x, i) => {\n acc.set(x, i);\n return acc;\n }, new Map<string, number>());\n\n this._reverse_ids = this._ids?.reduce((acc, x, i) => {\n acc.set(x?.join(\"|\"), i);\n return acc;\n }, new Map<string, number>());\n } else {\n this._div_factory.clear();\n num_columns = await this._view.num_columns();\n }\n\n const data: (string | HTMLElement)[][] = [];\n const metadata: unknown[][] = [];\n const column_headers: string[][] = [];\n const column_paths: string[] = [];\n\n const is_settings_open = viewer.hasAttribute(\"settings\");\n for (\n let ipath = x0;\n ipath < Math.min(x1, this._column_paths.length);\n ++ipath\n ) {\n const path = this._column_paths[ipath];\n const path_parts = path.split(\"|\");\n const column = columns[path] || new Array(y1 - y0).fill(null);\n const agg_depth = Math.min(\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL]?.[\n path_parts[this._config.split_by.length]\n ]?.aggregate_depth || 0,\n this._config.group_by.length,\n );\n\n data.push(\n column.map((x, i) => {\n if ((columns?.__ROW_PATH__?.[i]?.length ?? 0) < agg_depth) {\n return \"\";\n } else {\n return format_cell.call(\n this,\n path_parts[this._config.split_by.length],\n x,\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {},\n ) as string | HTMLElement;\n }\n }),\n );\n\n metadata.push(column as unknown[]);\n if (is_settings_open) {\n path_parts.push(\"\");\n }\n\n column_headers.push(path_parts);\n column_paths.push(path);\n }\n\n const is_dim_call = x1 - x0 > 0 && y1 - y0 > 0;\n\n // Only update the last state if this is not a \"phantom\" call.\n if (is_dim_call) {\n this.last_column_paths = last_column_paths;\n this.last_meta = last_meta;\n this.last_ids = last_ids;\n this.last_reverse_ids = last_reverse_ids;\n this.last_reverse_columns = last_reverse_columns;\n\n last_column_paths = column_paths;\n last_meta = metadata;\n last_ids = this._ids;\n last_reverse_ids = this._reverse_ids;\n last_reverse_columns = this._reverse_columns;\n }\n\n const is_row_path = columns.__ROW_PATH__ !== undefined;\n const is_flat = this._config.group_rollup_mode === \"flat\";\n const row_headers = Array.from(\n (is_row_path\n ? is_flat\n ? format_flat_header_row_path\n : format_tree_header_row_path\n : format_tree_header\n ).call(\n this,\n columns.__ROW_PATH__,\n this._config.group_by,\n regularTable,\n ),\n ) as (string | HTMLElement)[][];\n\n const num_row_headers = !is_dim_call\n ? row_header_depth(this._config)\n : row_headers[0]?.length;\n\n const result: DataResponse = {\n num_column_headers:\n this._config.split_by.length + (is_settings_open ? 2 : 1),\n num_row_headers,\n num_rows: this._num_rows,\n num_columns,\n row_headers: row_headers as CellScalar[][], // Add `HTMLElement`\n column_headers,\n data: data as CellScalar[][],\n metadata,\n column_header_merge_depth: Math.max(\n 0,\n this._config.split_by.length,\n ),\n };\n\n return result;\n };\n}\n\nfunction row_header_depth(config: ViewConfig) {\n if (config.group_rollup_mode === \"flat\") {\n return config.group_by.length;\n } else if (config.group_rollup_mode === \"total\") {\n return 0;\n } else if (config.group_by.length === 0) {\n return 0;\n } else {\n return config.group_by.length + 1;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport type { ColorRecord } from \"./types.js\";\n\nexport function blend(a: string, b: number[]): string {\n return chroma.mix(a, `rgb(${b[0]},${b[1]},${b[2]})`, 0.5).hex();\n}\n\n// AFAICT `chroma-js` has no alpha-aware blending? So we need a function to get\n// the color of a heatmap cell over the background.\nexport function rgbaToRgb(\n [r, g, b, a]: [number, number, number, number],\n source: [number, number, number] = [255, 255, 255],\n): [number, number, number] {\n function f(i: number, c: number): number {\n return ((1 - a) * (source[i] / 255) + a * (c / 255)) * 255;\n }\n\n return [f(0, r), f(1, g), f(2, b)];\n}\n\n// Chroma does this but why bother?\nexport function infer_foreground_from_background([r, g, b]: [\n number,\n number,\n number,\n]): string {\n // TODO Implement dark/light themes.\n return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) > 130\n ? \"#161616\"\n : \"#ffffff\";\n}\n\nfunction make_gradient(chromahex: chroma.Color): string {\n const [r, g, b] = chromahex.rgb();\n const [r1, g1, b1] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") - 15) % 360)\n .rgb();\n const [r2, g2, b2] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") + 15) % 360)\n .rgb();\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\nexport function make_color_record(color: string): ColorRecord {\n const chroma_neg = chroma(color);\n const _neg_grad = make_gradient(chroma_neg);\n const rgb = chroma_neg.rgb();\n return [\n color,\n rgb[0],\n rgb[1],\n rgb[2],\n _neg_grad,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},1)`,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`,\n ];\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { DatagridPluginElement, EditMode } from \"../types.js\";\n\nexport const EDIT_MODES: readonly EditMode[] = [\n \"READ_ONLY\",\n \"EDIT\",\n \"SELECT_ROW\",\n \"SELECT_COLUMN\",\n \"SELECT_REGION\",\n] as const;\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n mode =\n EDIT_MODES[\n (EDIT_MODES.indexOf(this._edit_mode) + 1) % EDIT_MODES.length\n ];\n }\n\n (this.parentElement as any)?.setSelection?.();\n this._edit_mode = mode;\n if (this.model) {\n this.model._edit_mode = mode;\n this.model._selection_state = {\n selected_areas: [],\n dirty: true,\n };\n }\n\n if (this._edit_button !== undefined) {\n this._edit_button.dataset.editMode = mode;\n }\n\n this.dataset.editMode = mode;\n}\n\nexport function toggle_scroll_lock(\n this: DatagridPluginElement,\n force?: boolean,\n): void {\n if (typeof force === \"undefined\") {\n force = !this._is_scroll_lock;\n }\n\n this._is_scroll_lock = force;\n this.classList.toggle(\"sub-cell-scroll-disabled\", force);\n if (this._scroll_lock !== undefined) {\n this._scroll_lock.classList.toggle(\"lock-scroll\", force);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n ColumnOverrides,\n DatagridPluginElement,\n RegularTable,\n} from \"../types.js\";\n\ninterface RegularTableWithOverrides {\n restoreColumnSizes(overrides: Record<number, number | undefined>): void;\n saveColumnSizes(): Record<number, number | undefined>;\n}\n\ninterface DatagridPluginWithCache extends DatagridPluginElement {\n _cached_column_sizes?: ColumnOverrides;\n}\n\n/**\n * Restore a saved column width override token.\n *\n * @param old_sizes An object previously returned by a call to\n * `save_column_size_overrides()`\n * @param cache A flag indicating whether this value should\n * be cached so a future `resetAutoSize()` call does not clear it.\n */\nexport function restore_column_size_overrides(\n this: DatagridPluginWithCache,\n old_sizes: ColumnOverrides,\n cache = false,\n): void {\n if (!this._initialized) {\n return;\n }\n\n if (cache) {\n this._cached_column_sizes = old_sizes;\n }\n\n const overrides: Record<number, number | undefined> = {};\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n for (const key of Object.keys(old_sizes)) {\n if (key === \"__ROW_PATH__\") {\n overrides[tree_header_offset - 1] = old_sizes[key] as\n | number\n | undefined;\n } else {\n const index = this.model!._column_paths.indexOf(key);\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n (this.regular_table as RegularTableWithOverrides).restoreColumnSizes(\n overrides,\n );\n}\n\n/**\n * Extract the current user-overriden column widths from\n * `regular-table`. This function depends on the internal\n * implementation of `regular-table` and may break!\n *\n * @returns An Object-as-dictionary keyed by column_path string, and\n * valued by the column's user-overridden pixel width.\n */\nexport function save_column_size_overrides(\n this: DatagridPluginWithCache,\n): ColumnOverrides {\n if (!this._initialized) {\n return {};\n }\n\n if (this._cached_column_sizes) {\n const x = this._cached_column_sizes;\n this._cached_column_sizes = undefined;\n return x;\n }\n\n const overrides = (\n this.regular_table as RegularTableWithOverrides\n ).saveColumnSizes();\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n const old_sizes: ColumnOverrides = {};\n for (const key of Object.keys(overrides)) {\n const numKey = Number(key);\n if (overrides[numKey] !== undefined) {\n const index = numKey - tree_header_offset;\n if (index > -1) {\n old_sizes[this.model!._column_paths[index]] = overrides[numKey];\n } else if (index === -1) {\n old_sizes[\"__ROW_PATH__\"] = overrides[numKey];\n }\n }\n }\n\n return old_sizes;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport {\n get_psp_type,\n type DatagridModel,\n type PerspectiveViewerElement,\n} from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply selected column styling in response to column settings toggle events.\n * This is called directly (not as a style listener) when the user opens/closes\n * the column settings panel.\n */\nexport function style_selected_column(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selectedColumn: string | undefined,\n): void {\n const group_header_trs = Array.from(\n regularTable.children[0].children[0].children,\n ) as HTMLTableRowElement[];\n\n const len = group_header_trs.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n if (len <= 1) {\n group_header_trs[0]?.removeAttribute(\"id\");\n } else {\n group_header_trs.forEach((tr, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? tr.setAttribute(\"id\", id) : tr.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n if (settings_open && len >= 2) {\n const titles = Array.from(\n group_header_trs[len - 2].children,\n ) as HTMLElement[];\n const editBtns = Array.from(\n group_header_trs[len - 1].children,\n ) as HTMLElement[];\n if (titles && editBtns) {\n group_header_trs.slice(0, len - 2).forEach((tr) => {\n Array.from(tr.children).forEach((th) => {\n th.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titles.length; i++) {\n const title = titles[i];\n const editBtn = editBtns[i];\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n if (this._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) continue;\n const isOpen =\n meta.column_header[\n meta.column_header.length - 2\n ] === selectedColumn;\n r.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n }\n }\n }\n}\n\n/**\n * Style a single column header row.\n */\nexport function styleColumnHeaderRow(\n this: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth =\n this._config.group_by.length -\n (this._config.group_rollup_mode === \"flat\" ? 1 : 0);\n\n const selectedColumn = this._column_settings_selected_column;\n for (const { element: td, metadata } of headerRow.cells) {\n if (\n !metadata ||\n metadata.type === \"body\" ||\n metadata.type === \"row_header\"\n )\n continue;\n\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n\n const sort = this._config.sort.find((x) => x[0] === column_name);\n const is_corner = typeof metadata.x === \"undefined\";\n const needs_border =\n (metadata.type === \"corner\" &&\n metadata.row_header_x === header_depth) ||\n (!is_corner &&\n (metadata.x + 1) % this._config.columns.length === 0);\n\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\"psp-header-group\", false);\n td.classList.toggle(\"psp-header-leaf\", true);\n td.classList.toggle(\"psp-is-top\", false);\n td.classList.toggle(\"psp-header-corner\", is_corner);\n td.classList.toggle(\n \"psp-header-sort-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc abs\",\n );\n\n const type = get_psp_type(this, metadata);\n const is_numeric = type === \"integer\" || type === \"float\";\n const is_string = type === \"string\";\n const is_date = type === \"date\";\n const is_datetime = type === \"datetime\";\n\n td.classList.toggle(\"psp-align-right\", is_numeric);\n td.classList.toggle(\"psp-align-left\", !is_numeric);\n td.classList.toggle(\n \"psp-menu-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length + 1,\n );\n td.classList.toggle(\n \"psp-sort-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length,\n );\n td.classList.toggle(\n \"psp-is-width-override\",\n regularTable.saveColumnSizes()[metadata.size_key!] !== undefined,\n );\n\n // Apply menu-open for selected column\n if (this._config.columns.length > 1 && selectedColumn) {\n const isOpen =\n metadata.column_header?.[metadata.column_header.length - 2] ===\n selectedColumn;\n td.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SortRotationOrder,\n SortTerm,\n} from \"../types.js\";\nimport { SortDir } from \"@perspective-dev/client\";\n\nconst ROW_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n};\n\nconst ROW_COL_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n // \"col desc\": \"col asc\",\n // \"col asc\": undefined,\n // \"col desc abs\": \"col asc abs\",\n // \"col asc abs\": undefined,\n};\n\nexport async function sortHandler(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) return;\n const column_name = meta.column_header[this._config.split_by.length];\n const sort_method =\n event.ctrlKey ||\n (event as MouseEvent & { metaKey?: boolean }).metaKey ||\n event.altKey\n ? append_sort\n : override_sort;\n\n const abs = event.shiftKey;\n const sort = sort_method.call(this, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of this._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort.call(this, column_name, _sort_dir, abs);\n if (term) {\n sort.push(term);\n }\n } else {\n sort.push(sort_term);\n }\n }\n\n if (!found) {\n sort.push([column_name, abs ? \"desc abs\" : \"desc\"]);\n }\n\n return sort;\n}\n\nexport function override_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of this._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort.call(this, column_name, _sort_dir, abs);\n return sort ? [sort] : [];\n }\n }\n\n return [[column_name, abs ? \"desc abs\" : \"desc\"]];\n}\n\nexport function create_sort(\n this: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = this._config.split_by.length > 0;\n const order = is_col_sortable ? ROW_COL_SORT_ORDER : ROW_SORT_ORDER;\n const inc_sort_dir: SortDir | undefined = sort_dir\n ? order[sort_dir]\n : \"desc\";\n\n if (inc_sort_dir) {\n return [column_name, inc_sort_dir];\n }\n\n return undefined;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { RegularTable, DatagridModel } from \"../types.js\";\n\nexport async function expandCollapseHandler(\n this: DatagridModel,\n regularTable: RegularTable,\n event: MouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"row_header\") return;\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\n );\n\n if (event.shiftKey && is_collapse) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n this._view.collapse(meta.y);\n } else {\n this._view.expand(meta.y);\n }\n\n this._num_rows = await this._view.num_rows();\n this._num_columns = await this._view.num_columns();\n regularTable.draw();\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { sortHandler } from \"./sort.js\";\nimport { expandCollapseHandler } from \"./expand_collapse.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nexport async function mousedown_listener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n if (target?.tagName === \"A\") {\n return;\n }\n\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\")) {\n expandCollapseHandler.call(this, regularTable, event);\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name = meta?.column_header?.[this._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler.call(this, regularTable, viewer, event, target);\n }\n}\n\nexport function click_listener(\n regularTable: RegularTable,\n event: MouseEvent,\n): void {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\") && event.offsetX < 26) {\n event.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n event.stopImmediatePropagation();\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../../types.js\";\n\nexport function write_cell(\n table: RegularTable,\n model: DatagridModel,\n active_cell: HTMLElement,\n): boolean {\n const meta = table.getMeta(active_cell) as CellMetadataBody;\n if (!meta) {\n return false;\n }\n const type = model._schema[model._column_paths[meta.x!]];\n let text: string | number | boolean | null = active_cell.textContent || \"\";\n const id = model._ids[meta.y! - meta.y0][0];\n if (type === \"float\" || type === \"integer\") {\n const parsed = parseFloat(text.replace(/,/g, \"\"));\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"date\" || type === \"datetime\") {\n const parsed = Date.parse(text);\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"boolean\") {\n text = text === \"true\" ? false : text === \"false\" ? true : null;\n }\n\n const msg = {\n __INDEX__: id,\n [model._column_paths[meta.x]]: text,\n };\n\n model._table.update([msg], { port_id: model._edit_port, format: null });\n return true;\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n const meta = table.getMeta(event.target as HTMLElement);\n if (meta?.type === \"body\" || meta?.type === \"column_header\") {\n const is_editable2 = this._is_editable[meta.x];\n const is_bool = get_psp_type(this, meta) === \"boolean\";\n const is_null = (event.target as Element).classList.contains(\n \"psp-null\",\n );\n\n if (is_editable2 && is_bool && !is_null) {\n write_cell(table, this, event.target as HTMLElement);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SelectedPosition } from \"../types.js\";\nimport { CollectedCell, LocalSelectedPositionMap } from \"./types.js\";\n\n/**\n * Apply focus style to the selected cell.\n * Optimized to use collected cells instead of querySelectorAll.\n */\nexport function applyFocusStyle(\n this: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n): void {\n const selected_position = selectedPositionMap.get(regularTable);\n const host = regularTable.getRootNode() as Document;\n\n if (selected_position) {\n for (const { element: td, metadata } of cells) {\n if (\n metadata.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== td) {\n td.focus({ preventScroll: true });\n }\n return;\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n }\n}\n\n/**\n * Standalone function to focus the selected cell.\n * This collects cells from the table and tries to focus the selected position.\n * Returns true if focus was successful, false otherwise.\n *\n * Used by edit_keydown.ts for keyboard navigation.\n */\nexport function focusSelectedCell(\n regularTable: RegularTableElement,\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>,\n): boolean {\n const selected_position = selectedPositionMap.get(regularTable);\n if (!selected_position) {\n return false;\n }\n\n const host = regularTable.getRootNode() as Document;\n const tbody = regularTable.children[0]?.children[1];\n\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(cell as HTMLElement);\n if (\n metadata?.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== cell) {\n (cell as HTMLElement).focus({ preventScroll: true });\n }\n return true;\n }\n }\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n\n return false;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { focusSelectedCell } from \"../../style_handlers/focus.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\ntype AsyncFunction<T extends unknown[], R> = (\n this: DatagridModel,\n ...args: T\n) => Promise<R>;\n\nfunction lock<T extends unknown[], R>(\n body: AsyncFunction<T, R>,\n): AsyncFunction<T, R | undefined> {\n let lockPromise: Promise<void> | undefined;\n return async function (\n this: DatagridModel,\n ...args: T\n ): Promise<R | undefined> {\n if (lockPromise) {\n await lockPromise;\n return;\n }\n\n let resolve: () => void;\n lockPromise = new Promise((x) => (resolve = x));\n const result = await body.apply(this, args);\n lockPromise = undefined;\n resolve!();\n return result;\n };\n}\n\ninterface ContentEditableElement extends HTMLElement {\n isContentEditable: boolean;\n selectionStart?: number;\n}\n\nfunction getPos(this: ContentEditableElement): number {\n if (this.isContentEditable) {\n const _range = (this.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) return 0;\n const range = _range.cloneRange();\n range.selectNodeContents(this);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return this.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n this: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n): Promise<void> {\n const meta = table.getMeta(active_cell);\n if (!meta || meta.type !== \"body\") return;\n const num_columns = this._column_paths.length;\n const num_rows = this._num_rows;\n const selected_position = selected_position_map.get(table);\n if (!selected_position) {\n return;\n }\n\n if (meta.x + dx < num_columns && 0 <= meta.x + dx) {\n selected_position.x = meta.x + dx;\n }\n\n if (meta.y + dy < num_rows && 0 <= meta.y + dy) {\n selected_position.y = meta.y + dy;\n }\n\n const xmin = Math.max(meta.x0 - 10, 0);\n const xmax = Math.min(meta.x0 + 10, num_columns);\n const ymin = Math.max(meta.y0 - 5, 0);\n const ymax = Math.min(meta.y0 + 10, num_rows);\n let x = meta.x0 + dx,\n y = meta.y0 + dy;\n while (\n !focusSelectedCell(table, selected_position_map) &&\n x >= xmin &&\n x < xmax &&\n y >= ymin &&\n y < ymax\n ) {\n await table.scrollToCell(x, y);\n selected_position_map.set(table, selected_position);\n x += dx;\n y += dy;\n }\n});\n\nfunction isLastCell(\n model: DatagridModel,\n table: RegularTable,\n target: HTMLElement,\n): boolean {\n const meta = table.getMeta(target);\n return meta?.type === \"body\" && meta.y === model._num_rows - 1;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n const target = (table.getRootNode() as Document)\n .activeElement as HTMLElement;\n (event.target as HTMLElement).classList.remove(\"psp-error\");\n switch (event.key) {\n case \"Enter\":\n event.preventDefault();\n if (isLastCell(this, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n break;\n case \"ArrowLeft\":\n if (getPos.call(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n break;\n case \"ArrowRight\":\n if (\n getPos.call(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n break;\n default:\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport * as edit_click from \"./click/edit_click.js\";\nimport * as edit_keydown from \"./keydown/edit_keydown.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"../custom_elements/datagrid.js\";\n\ntype SelectedPositionMap = Map<RegularTableElement, SelectedPosition>;\n\nexport function is_editable(\n this: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n this._config.group_by.length === 0 &&\n this._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | HTMLPerspectiveViewerDatagridPluginElement\n | undefined;\n const editable = allowed || !!(plugin?._edit_mode === \"EDIT\");\n return has_pivots && !selectable && editable;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener.call(\n this,\n table,\n viewer,\n selected_position_map,\n event,\n );\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_click.clickListener.call(this, table, viewer, event);\n } else if (this._edit_mode === \"READ_ONLY\") {\n // No-op for read-only mode\n } else if (this._edit_mode === \"SELECT_COLUMN\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_ROW\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_REGION\") {\n // Not yet implemented\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"click\" event not yet implemented`,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { is_editable } from \"./click.js\";\nimport { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\nexport function focusoutListener(\n this: DatagridModel,\n table: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n if (is_editable.call(this, viewer) && selected_position_map.has(table)) {\n const target = event.target as HTMLElement;\n target.classList.remove(\"psp-error\");\n const selectedPosition = selected_position_map.get(table)!;\n selected_position_map.delete(table);\n if (selectedPosition.content !== target.textContent) {\n if (!write_cell(table, this, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n}\n\nexport function focusinListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n const target = event.target as HTMLElement;\n const meta = table.getMeta(target);\n if (meta?.type === \"body\") {\n const new_state: SelectedPosition = {\n x: meta.x,\n y: meta.y,\n content: target.textContent || undefined,\n };\n selected_position_map.set(table, new_state);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { View, ViewConfig, Filter, Scalar } from \"@perspective-dev/client\";\nimport type { CellConfigResult } from \"./types.js\";\n\ninterface ModelWithViewAndConfig {\n _view: View;\n _config: ViewConfig;\n}\n\ninterface RowData {\n __ROW_PATH__?: unknown[];\n [key: string]: unknown;\n}\n\nexport default async function getCellConfig(\n { _view, _config }: ModelWithViewAndConfig,\n row_idx: number,\n col_idx: number,\n): Promise<CellConfigResult> {\n const group_by = _config.group_by;\n const split_by = _config.split_by;\n const start_row = row_idx >= 0 ? row_idx : 0;\n const end_row = start_row + 1;\n const r = (await _view.to_json({ start_row, end_row })) as RowData[];\n const row_paths = r.map((x) => x.__ROW_PATH__);\n const group_by_values = (row_paths[0] || []) as Scalar[];\n const row_filters = group_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = group_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined);\n\n const column_index = group_by.length > 0 ? col_idx + 1 : col_idx;\n const column_paths = Object.keys(r[0])[column_index];\n const result: CellConfigResult = {\n row: r[0] as Record<string, unknown>,\n column_names: [],\n config: { filter: [] },\n };\n\n let column_filters: Filter[] = [];\n if (column_paths) {\n const split_by_values = column_paths.split(\"|\");\n result.column_names = [split_by_values[split_by.length]];\n column_filters = split_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = split_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined)\n .filter(([, , value]) => value !== \"__ROW_PATH__\");\n }\n\n const filter = _config.filter.concat(row_filters).concat(column_filters);\n result.config = { filter };\n return result;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport getCellConfig from \"../get_cell_config.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n type HandledMouseEvent,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTable, unknown[]>;\n\nexport async function selectionListener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n event: HandledMouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!viewer.hasAttribute(\"selectable\")) return;\n if (event.handled) return;\n if (event.shiftKey) return;\n if (event.button !== 0) {\n return;\n }\n\n event.stopImmediatePropagation();\n\n if (!meta) {\n return;\n }\n\n if ((meta.type === \"body\" || meta.type === \"row_header\") && meta.y >= 0) {\n const id = this._ids?.[meta.y - meta.y0];\n const selected = selected_rows_map.get(regularTable);\n const key_match =\n !!selected &&\n selected.reduce<boolean>((agg, x, i) => agg && x === id[i], true);\n\n const is_deselect =\n !!selected && id.length === selected.length && key_match;\n\n const { row, column_names, config } = await getCellConfig(\n this,\n meta.y,\n meta.type === \"body\" ? meta.x : 0,\n );\n\n let detail: PerspectiveSelectDetail;\n if (is_deselect) {\n selected_rows_map.delete(regularTable);\n detail = new PerspectiveSelectDetail(\n false,\n row,\n [],\n [],\n [{ filter: structuredClone(this._config.filter) }],\n );\n } else {\n selected_rows_map.set(regularTable, id);\n detail = new PerspectiveSelectDetail(\n true,\n row,\n column_names,\n [],\n [config],\n );\n }\n\n await regularTable.draw({ preserve_width: true });\n event.handled = true;\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\"perspective-select\", {\n bubbles: true,\n composed: true,\n detail,\n }),\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { PerspectiveViewerElement } from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTableElement, unknown[]>;\n\nexport async function deselect_all_listener(\n regularTable: RegularTableElement,\n _viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n): Promise<void> {\n selected_rows_map.delete(regularTable);\n for (const td of regularTable.querySelectorAll(\"td,th\")) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n PerspectiveClickDetail,\n} from \"../types.js\";\n\nexport async function dispatch_click_listener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n const meta = table.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"body\") return;\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(this, y, x);\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveClickDetail>(\"perspective-click\", {\n bubbles: true,\n composed: true,\n detail: {\n row,\n column_names,\n config,\n },\n }),\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectionArea,\n} from \"../types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n }: AddAreaMouseSelectionOptions = {},\n): RegularTableElement => {\n datagrid.model!._selection_state = {\n selected_areas: selected,\n dirty: true,\n };\n\n table.addEventListener(\n \"mousedown\",\n getMousedownListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseover\",\n getMouseoverListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseup\",\n getMouseupListener(datagrid, table, className),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nconst getMousedownListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n mouseEvent.button === 0 &&\n (datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\")\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {\n x: meta.x,\n y: meta.y,\n };\n\n datagrid.model!._selection_state.old_selected_areas =\n datagrid.model!._selection_state.selected_areas;\n datagrid.model!._selection_state.selected_areas = [];\n\n const start: SelectionArea = {\n x0: meta.x,\n x1: meta.x,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.potential_selection = start;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n start,\n ]),\n );\n\n return;\n }\n }\n\n datagrid.model!._selection_state.selected_areas = [];\n };\n\nconst getMouseoverListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const potentialSelection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n\n datagrid.model!._selection_state.potential_selection =\n potentialSelection;\n\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n potentialSelection,\n ]),\n );\n }\n }\n }\n };\n\nconst getMouseupListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) return;\n\n if (\n (datagrid.model!._selection_state.old_selected_areas?.length ??\n 0) > 0\n ) {\n const selected =\n datagrid.model!._selection_state.old_selected_areas![0];\n if (\n selected.x0 === selected.x1 &&\n selected.y0 === selected.y1 &&\n meta?.type === \"body\" &&\n selected.x0 === meta.x &&\n selected.y0 === meta.y\n ) {\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.old_selected_areas = [];\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n applyMouseAreaSelections(datagrid, table, className, []);\n return;\n }\n }\n\n datagrid.model!._selection_state.old_selected_areas = [];\n\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined &&\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const selection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n datagrid.model!._selection_state.selected_areas.push(selection);\n applyMouseAreaSelections(datagrid, table, className);\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n datagrid.model!._selection_state.potential_selection = undefined;\n }\n };\n\nfunction set_psp_selection(\n viewer: PerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (\n x0 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_col = x0;\n }\n\n if (\n x1 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_col = x1 + 1;\n }\n\n if (\n y0 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_row = y0;\n }\n\n if (\n y1 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n selected = datagrid.model!._selection_state.selected_areas.slice(0);\n if (datagrid.model!._selection_state.potential_selection) {\n selected.push(datagrid.model!._selection_state.potential_selection);\n }\n\n const tds = table.querySelectorAll(\"tbody td\");\n\n if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as any,\n datagrid,\n selected[0],\n );\n applyMouseAreaSelection(datagrid, table, selected, className);\n } else {\n (datagrid.parentElement as any).setSelection();\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n } else if (datagrid.model!._selection_state.dirty) {\n datagrid.model!._selection_state.dirty = false;\n const tds = table.querySelectorAll(\"tbody td\");\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n if (datagrid.model!._edit_mode === \"SELECT_REGION\" && selected.length > 0) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta || meta.type !== \"body\") continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined\n ) {\n if (\n x0 <= meta.x &&\n meta.x <= x1 &&\n y0 <= meta.y &&\n meta.y <= y1\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_ROW\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (y0 <= meta.y && meta.y <= y1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_COLUMN\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (x0 <= meta.x && meta.x <= x1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n }\n};\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport type { DatagridModel, PerspectiveViewerElement } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) return;\n\n // Style selected column for settings panel\n const selectedColumn = this._column_settings_selected_column;\n const len = headerRows.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n\n // Set row IDs\n if (len <= 1) {\n headerRows[0]?.row.removeAttribute(\"id\");\n } else {\n headerRows.forEach(({ row }, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? row.setAttribute(\"id\", id) : row.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n\n // Style column titles and edit buttons when settings open\n if (settings_open && len >= 2) {\n const titlesRow = headerRows[len - 2];\n const editBtnsRow = headerRows[len - 1];\n\n if (titlesRow && editBtnsRow) {\n // Clear menu-open from other rows\n headerRows.slice(0, len - 2).forEach(({ cells }) => {\n cells.forEach(({ element }) => {\n element.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titlesRow.cells.length; i++) {\n const title = titlesRow.cells[i]?.element;\n const editBtn = editBtnsRow.cells[i]?.element;\n if (!title || !editBtn) continue;\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n }\n }\n }\n\n // Style the actual column header rows\n const colHeadersIndex = this._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n this._styleColumnHeaderRow(colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = this._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n this._styleColumnHeaderRow(menuHeaders, regularTable, true);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to group header rows.\n */\nexport function applyGroupHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = this._config.group_by.length;\n const m: boolean[][] = [];\n let marked = new Set<number>();\n\n for (let y = 0; y < headerRows.length; y++) {\n const { row, cells } = headerRows[y];\n const tops = new Set<number>();\n\n for (let x = 0; x < cells.length; x++) {\n const { element: td, metadata } = cells[x];\n if (!metadata) continue;\n\n td.style.backgroundColor = \"\";\n\n const needs_border =\n (metadata.type === \"corner\" &&\n header_depth > 0 &&\n metadata.row_header_x === header_depth) ||\n (metadata.type === \"column_header\" && metadata.x >= 0);\n\n td.classList.toggle(\"psp-align-right\", false);\n td.classList.toggle(\"psp-align-left\", false);\n td.classList.toggle(\"psp-header-group\", true);\n td.classList.toggle(\"psp-header-leaf\", false);\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\n \"psp-header-group-corner\",\n metadata.type === \"corner\",\n );\n\n td.classList.toggle(\"psp-color-mode-bar\", false);\n td.classList.toggle(\"psp-header-sort-asc\", false);\n td.classList.toggle(\"psp-header-sort-desc\", false);\n td.classList.toggle(\"psp-header-sort-col-asc\", false);\n td.classList.toggle(\"psp-header-sort-col-desc\", false);\n td.classList.toggle(\"psp-sort-enabled\", false);\n\n // Calculate spanning for psp-is-top\n let xx = x;\n for (; m[y] && m[y][xx]; ++xx);\n tops.add(xx);\n\n const cell = td;\n for (let tx = xx; tx < xx + cell.colSpan; ++tx) {\n for (let ty = y; ty < y + cell.rowSpan; ++ty) {\n if (!m[ty]) m[ty] = [];\n m[ty][tx] = true;\n }\n }\n\n cell.classList.toggle(\"psp-is-top\", y === 0 || !marked.has(xx));\n }\n\n marked = tops;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColorRecord } from \"../../types.js\";\n\nexport function style_cell_flash(\n this: DatagridModel,\n metadata: CellMetadataBody,\n td: HTMLElement,\n [, , , , , pos_s, pos_e]: ColorRecord,\n [, , , , , neg_s, neg_e]: ColorRecord,\n is_settings_open: boolean,\n): void {\n const id = this._ids?.[metadata.dy ?? 0]?.join(\"|\");\n const metadata_path = (\n is_settings_open\n ? (metadata.column_header ?? []).slice(0, -1)\n : (metadata.column_header ?? [])\n ).join(\"|\");\n\n if (\n this.last_reverse_columns?.has(metadata_path) &&\n this.last_reverse_ids?.has(id)\n ) {\n const row_idx = this.last_reverse_ids?.get(id);\n const col_idx = this.last_reverse_columns.get(metadata_path);\n if (!this._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) >\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", neg_s);\n td.style.setProperty(\"--pulse--background-color-end\", neg_e);\n if (td.style.animationName === \"pulse_neg\") {\n td.style.animation = \"pulse_neg2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_neg 0.5s linear\";\n }\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) <\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", pos_s);\n td.style.setProperty(\"--pulse--background-color-end\", pos_e);\n if (td.style.animationName === \"pulse_pos\") {\n td.style.animation = \"pulse_pos2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_pos 0.5s linear\";\n }\n } else if (row_idx !== metadata.dy) {\n td.style.animation = \"\";\n }\n } else {\n td.style.animation = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_cell_flash } from \"./cell_flash.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: number;\n dy: number;\n column_header?: string[];\n}\n\ninterface PluginWithColors\n extends Omit<\n ColumnConfig,\n \"pos_fg_color\" | \"neg_fg_color\" | \"pos_bg_color\" | \"neg_bg_color\"\n > {\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n}\n\nexport function cell_style_numeric(\n this: DatagridModel,\n plugin: PluginWithColors | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n is_settings_open: boolean,\n): void {\n const is_positive = (metadata.user ?? 0) > 0;\n const is_negative = (metadata.user ?? 0) < 0;\n\n let pos_bg_color: ColorRecord;\n if (plugin?.pos_bg_color !== undefined) {\n pos_bg_color = plugin.pos_bg_color;\n } else {\n pos_bg_color = this._pos_bg_color;\n }\n\n let neg_bg_color: ColorRecord;\n if (plugin?.neg_bg_color !== undefined) {\n neg_bg_color = plugin.neg_bg_color;\n } else {\n neg_bg_color = this._neg_bg_color;\n }\n\n const bg_tuple: ColorRecord = is_positive\n ? pos_bg_color\n : is_negative\n ? neg_bg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n\n {\n const [hex, r, g, b] = bg_tuple;\n\n td.style.position = \"\";\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else if (plugin?.number_bg_mode === \"color\") {\n td.style.animation = \"\";\n td.style.backgroundColor = hex;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n const a = Math.max(\n 0,\n Math.min(\n 1,\n Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),\n ),\n );\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, a], source),\n );\n\n td.style.animation = \"\";\n td.style.color = foreground;\n td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;\n } else if (plugin?.number_bg_mode === \"pulse\") {\n style_cell_flash.call(\n this,\n metadata as any,\n td,\n pos_bg_color,\n neg_bg_color,\n is_settings_open,\n );\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.number_bg_mode === \"disabled\" ||\n !plugin?.number_bg_mode\n ) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n }\n }\n\n const fg_tuple: ColorRecord = (() => {\n if (plugin?.pos_fg_color !== undefined) {\n return is_positive\n ? plugin.pos_fg_color\n : is_negative\n ? plugin.neg_fg_color!\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? this._pos_fg_color\n : is_negative\n ? this._neg_fg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n }\n })();\n\n const [hex, , , , gradhex] = fg_tuple;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (plugin?.number_fg_mode === \"disabled\") {\n if (plugin?.number_bg_mode === \"color\") {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),\n );\n td.style.color = foreground;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n // Color already set above\n } else {\n td.style.color = \"\";\n }\n } else if (plugin?.number_fg_mode === \"bar\") {\n td.style.color = \"\";\n td.style.position = \"relative\";\n if (\n gradhex !== \"\" &&\n td.children.length > 0 &&\n td.children[0].nodeType === Node.ELEMENT_NODE\n ) {\n (td.children[0] as HTMLElement).style.background = gradhex;\n }\n } else if (plugin?.number_fg_mode === \"color\" || !plugin?.number_fg_mode) {\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: string | null;\n column_header?: string[];\n}\n\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_string(\n this: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[this._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return this._color;\n }\n })();\n\n const [hex, r, g, b] = colorRecord;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.string_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n if (plugin?.format === \"link\" && td.children[0]) {\n (td.children[0] as HTMLElement).style.color = hex;\n }\n } else if (\n plugin?.string_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else if (\n plugin?.string_color_mode === \"series\" &&\n metadata.user !== null &&\n column_name\n ) {\n if (!this._series_color_map.has(column_name)) {\n this._series_color_map.set(column_name, new Map());\n this._series_color_seed.set(column_name, 0);\n }\n\n const series_map = this._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = this._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n this._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n let [h, s, l] = chroma(hex).hsl();\n h = h + ((color_seed * 150) % 360);\n const color2 = chroma(h, s, l, \"hsl\");\n const [r2, g2, b2] = color2.rgb();\n const hex2 = color2.hex();\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r2, g2, b2, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex2;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_datetime(\n this: DatagridModel,\n plugin: ColumnConfig,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n const colorRecord: ColorRecord = //(() => {\n // if (plugin?.color !== undefined) {\n // return plugin.color;\n // } else {\n // return\n this._color;\n // }\n // })();\n\n const [hex, r, g, b] = colorRecord;\n\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.datetime_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.datetime_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_boolean(\n this: DatagridModel,\n _plugin: ColumnConfig | undefined,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else {\n const [hex]: ColorRecord | [string, number, number, number, string] =\n metadata.user === true\n ? this._pos_fg_color\n : metadata.user === false\n ? this._neg_fg_color\n : [\"\", 0, 0, 0, \"\"];\n td.style.backgroundColor = \"\";\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n CellMetadata,\n CellMetadataRowHeader,\n} from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel } from \"../../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\nexport function cell_style_row_header(\n this: DatagridModel,\n regularTable: RegularTableElement,\n td: HTMLElement,\n metadata: CellMetadataRowHeader,\n): void {\n const is_not_empty =\n metadata.value !== undefined &&\n metadata.value !== null &&\n metadata.value?.toString()?.trim().length > 0;\n const is_leaf =\n (metadata.row_header_x ?? 0) >= this._config.group_by.length;\n const next = regularTable.getMeta({\n dx: 0,\n dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,\n } as CellMetadata);\n\n const is_collapse =\n next &&\n next.row_header &&\n typeof next.row_header[(metadata.row_header_x ?? 0) + 1] !==\n \"undefined\";\n\n td.classList.toggle(\"psp-tree-label\", is_not_empty && !is_leaf);\n td.classList.toggle(\n \"psp-tree-label-expand\",\n is_not_empty && !is_leaf && !is_collapse,\n );\n\n td.classList.toggle(\n \"psp-tree-label-collapse\",\n is_not_empty && !is_leaf && is_collapse,\n );\n td.classList.toggle(\"psp-tree-leaf\", is_not_empty && is_leaf);\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport {\n type DatagridModel,\n type PerspectiveViewerElement,\n type ColumnsConfig,\n type DatagridPluginElement,\n get_psp_type,\n} from \"../types.js\";\n\nimport { cell_style_numeric } from \"./table_cell/numeric.js\";\nimport { cell_style_string } from \"./table_cell/string.js\";\nimport { cell_style_datetime } from \"./table_cell/datetime.js\";\nimport { cell_style_boolean } from \"./table_cell/boolean.js\";\nimport { cell_style_row_header } from \"./table_cell/row_header.js\";\nimport {\n CollectedCell,\n LocalSelectedPositionMap,\n LocalSelectedRowsMap,\n} from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n this: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n): void {\n const hasSelected = selectedRowsMap.has(regularTable);\n const selected = selectedRowsMap.get(regularTable);\n\n regularTable.classList.toggle(\n \"flat-group-rollup-mode\",\n this._config.group_rollup_mode === \"flat\",\n );\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const type = get_psp_type(this, metadata);\n const plugin = column_name\n ? plugins[column_name.toString()]\n : undefined;\n const is_numeric = type === \"integer\" || type === \"float\";\n\n // Calculate aggregate depth visibility\n // @ts-ignore\n metadata._is_hidden_by_aggregate_depth = ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n this._config.group_by.length,\n plugin?.aggregate_depth || 0,\n ))(\n (metadata.row_header as unknown[] | undefined)?.filter(\n (x) => x !== undefined,\n )?.length,\n );\n\n // Apply type-specific cell styling\n if (is_numeric) {\n cell_style_numeric.call(\n this,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean.call(this, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string.call(this, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime.call(this, plugin as any, td, metadata as any);\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n\n // Apply common cell classes\n td.classList.toggle(\n \"psp-bool-type\",\n type === \"boolean\" && metadata.user !== null,\n );\n\n td.classList.toggle(\"psp-null\", metadata.value === null);\n td.classList.toggle(\"psp-align-right\", !isHeader && is_numeric);\n td.classList.toggle(\"psp-align-left\", isHeader || !is_numeric);\n if (this._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === this._column_settings_selected_column,\n );\n } else {\n td.classList.toggle(\"psp-menu-open\", false);\n }\n\n td.classList.toggle(\n \"psp-color-mode-bar\",\n plugin?.number_fg_mode === \"bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header.call(this, regularTable, td, metadata as any);\n }\n\n // Set data attributes\n const tr = td.parentElement as HTMLElement;\n if (tr) {\n tr.dataset.y = String(metadata.y);\n }\n\n if (\n metadata.type !== \"row_header\" ||\n metadata.row_header_x ===\n (metadata.row_header as unknown[]).length - 1 ||\n (metadata.row_header as unknown[])[metadata.row_header_x + 1] ===\n undefined\n ) {\n td.dataset.y = String(metadata.y);\n if (metadata.type !== \"row_header\") {\n td.dataset.x = String(metadata.x);\n } else {\n delete td.dataset.x;\n }\n } else {\n delete td.dataset.y;\n delete td.dataset.x;\n }\n\n // Apply selection styling (if selectable)\n if (isSelectable) {\n if (!hasSelected) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n const id = this._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = (selected as unknown[]).reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const selectedArr = selected as unknown[];\n if (isHeader) {\n if (\n metadata.type === \"row_header\" &&\n metadata.row_header_x !== undefined &&\n !!id[metadata.row_header_x]\n ) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n }\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && this._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[this._config.split_by.length];\n const col_name_str = col_name?.toString();\n if (\n col_name_str &&\n type === \"string\" &&\n plugins[col_name_str]?.format === \"link\"\n ) {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n } else if (type === \"boolean\") {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\n \"boolean-editable\",\n (metadata as { user?: unknown }).user !== null,\n );\n } else {\n if (isEditable !== td.hasAttribute(\"contenteditable\")) {\n td.toggleAttribute(\"contenteditable\", isEditable);\n }\n td.classList.toggle(\"boolean-editable\", false);\n }\n } else {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n }\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n ColumnsConfig,\n DatagridPluginElement,\n SelectedPosition,\n} from \"../types.js\";\n\nimport { applyFocusStyle } from \"./focus.js\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\nimport { applyColumnHeaderStyles } from \"./editable.js\";\nimport { applyGroupHeaderStyles } from \"./group_header.js\";\nimport { applyBodyCellStyles } from \"./body.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\ninterface CollectedCell {\n element: HTMLElement;\n metadata: CellMetadata;\n isHeader: boolean;\n}\n\ninterface CollectedHeaderRow {\n row: HTMLTableRowElement;\n cells: Array<{\n element: HTMLTableCellElement;\n metadata: CellMetadata | undefined;\n }>;\n}\n\n/**\n * Context object passed through consolidated styling\n */\nexport interface StyleContext {\n model: DatagridModel;\n regularTable: RegularTableElement;\n viewer: PerspectiveViewerElement;\n datagrid: DatagridPluginElement;\n plugins: ColumnsConfig;\n isSettingsOpen: boolean;\n isSelectable: boolean;\n isEditable: boolean;\n selectedRowsMap: Map<RegularTableElement, unknown[]>;\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>;\n}\n\n// Local types for selection maps - match the actual runtime usage\n// (activate.ts uses `as any` casts when passing these)\ntype LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;\ntype LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;\n\nfunction isEditableMode(\n model: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n model._config.group_by.length === 0 &&\n model._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | (DatagridPluginElement & { dataset: DOMStringMap })\n | undefined;\n const editable = allowed || plugin?.dataset?.editMode === \"EDIT\";\n return has_pivots && !selectable && editable;\n}\n\n/**\n * Consolidated style listener that handles all cell styling in a single pass.\n * This eliminates redundant DOM traversals and reduces layout thrashing by:\n * 1. Collecting all cell metadata in a read phase\n * 2. Applying all styles in a write phase\n */\nexport function createConsolidatedStyleListener(\n datagrid: DatagridPluginElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n): (\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n) => void {\n return function consolidatedStyleListener(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = viewer.hasAttribute(\"selectable\");\n const isEditable = isEditableMode(this, viewer);\n const isEditableAllowed = isEditableMode(this, viewer, true);\n\n // Toggle edit mode class on datagrid\n datagrid.classList.toggle(\"edit-mode-allowed\", isEditableAllowed);\n const bodyCells: CollectedCell[] = [];\n const groupHeaderRows: CollectedHeaderRow[] = [];\n const tbody = regularTable.children[0]?.children[1];\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n if (metadata) {\n const isHeader = cell.tagName === \"TH\";\n bodyCells.push({\n element: cell as HTMLElement,\n metadata,\n isHeader,\n });\n }\n }\n }\n }\n\n // Collect header rows (thead)\n const thead = regularTable.children[0]?.children[0];\n if (thead) {\n for (const tr of thead.children) {\n const rowData: CollectedHeaderRow = {\n row: tr as HTMLTableRowElement,\n cells: [],\n };\n\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n rowData.cells.push({\n element: cell as HTMLTableCellElement,\n metadata,\n });\n }\n groupHeaderRows.push(rowData);\n }\n }\n\n this._applyBodyCellStyles(\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n selectedRowsMap,\n selectedPositionMap,\n viewer,\n );\n\n this._applyGroupHeaderStyles(groupHeaderRows, regularTable);\n this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);\n this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);\n };\n}\n\ndeclare module \"../types.js\" {\n interface DatagridModel {\n _applyBodyCellStyles(\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyGroupHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n ): void;\n _applyColumnHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyFocusStyle(\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n ): void;\n _styleColumnHeaderRow(\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n ): void;\n }\n}\n\n/**\n * Install the styling methods on the DatagridModel prototype.\n * This should be called once during module initialization.\n */\nexport function installConsolidatedStyleMethods(modelPrototype: any): void {\n modelPrototype._applyBodyCellStyles = applyBodyCellStyles;\n modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;\n modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;\n modelPrototype._applyFocusStyle = applyFocusStyle;\n modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n click_listener,\n mousedown_listener,\n} from \"../event_handlers/header_click.js\";\n\nimport { focusinListener, focusoutListener } from \"../event_handlers/focus.js\";\nimport { keydownListener, clickListener } from \"../event_handlers/click.js\";\n\nimport { selectionListener } from \"../event_handlers/row_select_click.js\";\nimport { deselect_all_listener } from \"../event_handlers/deselect_all.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { dispatch_click_listener } from \"../event_handlers/dispatch_click.js\";\n\nimport { addAreaMouseSelection } from \"../event_handlers/select_region.js\";\n\nimport {\n createConsolidatedStyleListener,\n installConsolidatedStyleMethods,\n} from \"../style_handlers/consolidated.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport type { RegularTableElement } from \"regular-table\";\n\ninterface ToggleColumnSettingsEvent extends CustomEvent {\n detail: {\n column_name: string | null;\n open: boolean;\n };\n}\n\n/**\n * Lazy initialize this plugin with various listeners.\n */\nexport async function activate(\n this: DatagridPluginElement,\n view: View,\n): Promise<void> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const table = await viewer.getTable();\n\n if (!this._initialized) {\n this.innerHTML = \"\";\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(this.regular_table);\n } else {\n this.appendChild(this.regular_table);\n }\n\n this.model = await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n );\n\n if (!this.model) {\n return;\n }\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n });\n\n // Create shared state maps for selection and focus tracking\n const selected_rows_map = new WeakMap<\n RegularTableElement,\n Set<number>\n >();\n const selected_position_map = new WeakMap<\n RegularTableElement,\n SelectedPosition\n >();\n\n // Install consolidated style methods on model prototype\n installConsolidatedStyleMethods(this.model);\n\n // Single consolidated style listener replaces:\n // - table_cell_style_listener\n // - group_header_style_listener\n // - column_header_style_listener\n // - selectionStyleListener\n // - editable_style_listener\n // - focus_style_listener\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n selected_rows_map as any,\n selected_position_map as any,\n ).bind(this.model, this.regular_table, viewer),\n );\n\n // uh ..\n this.regular_table.addEventListener(\n \"click\",\n click_listener.bind(\n this.model,\n this.regular_table,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"mousedown\",\n selectionListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"psp-deselect-all\",\n deselect_all_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n dispatch_click_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n mousedown_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // Editing event handlers (style handling is now in consolidated listener)\n // TODO relies on this.model._is_editable\n this.regular_table.addEventListener(\n \"click\",\n clickListener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n focusinListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n focusoutListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n keydownListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n // viewer event listeners\n viewer.addEventListener(\n \"perspective-toggle-column-settings\",\n (event: Event) => {\n const toggleEvent = event as ToggleColumnSettingsEvent;\n if (this.isConnected) {\n style_selected_column.call(\n this.model!,\n this.regular_table,\n viewer,\n toggleEvent.detail.column_name ?? undefined,\n );\n if (!toggleEvent.detail.open) {\n this.model!._column_settings_selected_column =\n undefined;\n return;\n }\n\n this.model!._column_settings_selected_column =\n toggleEvent.detail.column_name ?? undefined;\n }\n },\n );\n\n this._initialized = true;\n } else {\n await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n this.model,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { restore_column_size_overrides } from \"../model/column_overrides.js\";\nimport {\n EDIT_MODES,\n toggle_edit_mode,\n toggle_scroll_lock,\n} from \"../model/toolbar.js\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { make_color_record } from \"../color_utils.js\";\nimport type {\n DatagridPluginElement,\n ColumnOverrides,\n EditMode,\n ColumnsConfig,\n ColorRecord,\n} from \"../types.js\";\n\ninterface RestoreToken {\n columns?: Record<string, { column_size_override?: number }>;\n edit_mode?: EditMode;\n scroll_lock?: boolean;\n}\n\n// interface ColumnConfigWithColors {\n// pos_fg_color?: string;\n// neg_fg_color?: string;\n// pos_bg_color?: string;\n// neg_bg_color?: string;\n// color?: string;\n// [key: string]: unknown;\n// }\n\ninterface StylesConfig {\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n color?: ColorRecord;\n [key: string]: unknown;\n}\n\nexport function restore(\n this: DatagridPluginElement,\n token: RestoreToken,\n columns: ColumnsConfig,\n): void {\n token = JSON.parse(JSON.stringify(token));\n columns = JSON.parse(JSON.stringify(columns));\n const overrides: ColumnOverrides = {};\n\n if (token.columns) {\n for (const [col, value] of Object.entries(token.columns)) {\n if (value.column_size_override !== undefined) {\n overrides[col] = value.column_size_override;\n delete value[\"column_size_override\"];\n }\n }\n }\n\n const styles: Record<string, StylesConfig> = {};\n if (columns) {\n for (const [col_name, controls] of Object.entries(columns)) {\n styles[col_name] = {\n ...controls,\n pos_fg_color: controls.pos_fg_color\n ? make_color_record(controls.pos_fg_color)\n : undefined,\n neg_fg_color: controls.neg_fg_color\n ? make_color_record(controls.neg_fg_color)\n : undefined,\n pos_bg_color: controls.pos_bg_color\n ? make_color_record(controls.pos_bg_color)\n : undefined,\n neg_bg_color: controls.neg_bg_color\n ? make_color_record(controls.neg_bg_color)\n : undefined,\n color: controls.color\n ? make_color_record(controls.color)\n : undefined,\n };\n }\n }\n\n if (\"edit_mode\" in token && token.edit_mode) {\n if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {\n toggle_edit_mode.call(this, token.edit_mode);\n } else {\n console.error(\"Unknown edit mode \" + token.edit_mode);\n }\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n }\n\n const datagrid = this.regular_table;\n restore_column_size_overrides.call(this, overrides, true);\n (datagrid as any)[PRIVATE_PLUGIN_SYMBOL] = styles as ColumnsConfig;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { save_column_size_overrides } from \"../model/column_overrides.js\";\nimport type {\n DatagridPluginElement,\n DatagridPluginConfig,\n EditMode,\n} from \"../types.js\";\n\nexport function save(\n this: DatagridPluginElement,\n): DatagridPluginConfig | Record<string, never> {\n if (this.regular_table) {\n const token: DatagridPluginConfig = {\n columns: {},\n scroll_lock: !!this._is_scroll_lock,\n edit_mode: this._edit_mode,\n };\n\n const column_size_overrides = save_column_size_overrides.call(this);\n\n for (const col of Object.keys(column_size_overrides || {})) {\n if (!token.columns?.[col]) {\n token.columns = token.columns || {};\n token.columns[col] = {};\n }\n\n token.columns[col].column_size_override =\n column_size_overrides[col];\n }\n\n return JSON.parse(JSON.stringify(token));\n }\n return {};\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n restore_column_size_overrides,\n save_column_size_overrides,\n} from \"../model/column_overrides.js\";\nimport type { View } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface DatagridPluginWithActivate extends DatagridPluginElement {\n activate(view: View): Promise<void>;\n}\n\nexport async function draw(\n this: DatagridPluginWithActivate,\n view: View,\n): Promise<void> {\n if (this.parentElement) {\n await this.activate(view);\n }\n\n if (!this.isConnected || this.offsetParent == null || !this.model) {\n return;\n }\n\n const old_sizes = save_column_size_overrides.call(this);\n const drawPromise = this.regular_table.draw({\n invalid_columns: true,\n } as any);\n\n if (this._reset_scroll_top) {\n this.regular_table.scrollTop = 0;\n this._reset_scroll_top = false;\n }\n\n if (this._reset_scroll_left) {\n this.regular_table.scrollLeft = 0;\n this._reset_scroll_left = false;\n }\n if (this._reset_select) {\n this.regular_table.dispatchEvent(\n new CustomEvent(\"psp-deselect-all\", { bubbles: false }),\n );\n this._reset_select = false;\n }\n\n if (this._reset_column_size) {\n this.regular_table.resetAutoSize();\n this._reset_column_size = false;\n }\n\n restore_column_size_overrides.call(this, old_sizes);\n await drawPromise;\n\n this._toolbar?.classList.toggle(\n \"aggregated\",\n this.model._config.group_by.length > 0 ||\n this.model._config.split_by.length > 0,\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface NumberStyleOpts {\n datagrid_number_style: {\n fg_gradient: number;\n pos_fg_color: string;\n neg_fg_color: string;\n number_fg_mode: string;\n bg_gradient: number;\n pos_bg_color: string;\n neg_bg_color: string;\n number_bg_mode: string;\n };\n number_string_format: boolean;\n}\n\ninterface DatetimeStyleOpts {\n datagrid_datetime_style?: {\n color: string;\n bg_color: string;\n };\n datagrid_string_style?: {\n color: string;\n bg_color: string;\n };\n}\n\nexport type ColumnStyleOpts = NumberStyleOpts | DatetimeStyleOpts | null;\n\nexport default function column_style_opts(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string,\n): ColumnStyleOpts {\n if (type === \"integer\" || type === \"float\") {\n return {\n datagrid_number_style: {\n fg_gradient: 0,\n pos_fg_color: this.model!._pos_fg_color[0],\n neg_fg_color: this.model!._neg_fg_color[0],\n number_fg_mode: \"color\",\n bg_gradient: 0,\n pos_bg_color: this.model!._pos_bg_color[0],\n neg_bg_color: this.model!._neg_bg_color[0],\n number_bg_mode: \"disabled\",\n },\n number_string_format: true,\n };\n } else if (type === \"date\" || type === \"datetime\" || type === \"string\") {\n const control =\n type === \"date\" || type === \"datetime\"\n ? \"datagrid_datetime_style\"\n : `datagrid_string_style`;\n return {\n [control]: {\n color: this.model!._color[0],\n bg_color: this.model!._color[0],\n },\n } as DatetimeStyleOpts;\n } else {\n return null;\n }\n}\n", "regular-table{padding:0;margin:12px 0 0 12px;font-family:inherit;--rt-hover--border-color:var(--inactive--color,#c5c9d080);}regular-table div[tabindex]{outline:none;}regular-table>div{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;}regular-table th{text-align:center;}regular-table thead tr:not(.rt-autosize) th{overflow:hidden;max-width:0px;}regular-table thead tr:last-child .rt-float,regular-table tbody .rt-float{text-align:right;}regular-table thead .rt-integer,regular-table tbody .rt-integer{text-align:right;}regular-table tbody th{text-align:left;}regular-table span.rt-tree-container{display:flex;align-items:center;height:100%;}regular-table thead .rt-string,regular-table tbody .rt-string,regular-table thead .rt-date,regular-table tbody .rt-date,regular-table thead .rt-datetime,regular-table tbody .rt-datetime{text-align:left;}regular-table thead tr:last-child th{border-bottom:1px solid#8b868045;}regular-table tbody tr:first-child td,regular-table tbody tr:first-child th{border-top:1px solid transparent!important;}regular-table th{position:relative;}regular-table tr th span.rt-tree-group{margin-left:5px;margin-right:15px;border-left:1px solid#eee;height:100%;}regular-table td,regular-table th{white-space:nowrap;font-size:12px;padding-right:5px;padding-left:5px;padding-top:0px;padding-bottom:0px;height:19px;}regular-table table *{box-sizing:border-box;}regular-table table{position:absolute;color:#666;outline:none;}regular-table span.rt-row-header-icon{color:#aaa;padding-right:4px;font-family:var(--button--font-family);}regular-table span.rt-column-header-icon{font-size:10px;padding-left:3px;display:inline-block;width:10px;font-family:var(--button--font-family);}regular-table span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0px 0px 3px#1a7da1;}regular-table .rt-selected td{background-color:#eee;}regular-table .rt-cell-clip{overflow:hidden;text-overflow:ellipsis;}regular-table td span.rt-group-name,regular-table th span.rt-group-name{margin-right:-5px;padding-right:5px;padding-left:8px;flex:1;height:100%;}regular-table th span.rt-group-name{text-align:left;}regular-table td th span.rt-group-leaf,regular-table th span.rt-group-leaf{margin-left:16px;height:100%;}regular-table .rt-column-resize{height:100%;width:10px;position:absolute;top:0;right:0;cursor:col-resize;}regular-table a{color:var(--rt-pos-cell--color);}regular-table a:visited{color:var(--active--color);}regular-table td.psp-null:after,regular-table th.psp-null:after{content:var(--null--content,\"-\");}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-group{box-shadow:0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-is-top{box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045);}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-header-border.psp-header-group:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}perspective-viewer[settings] tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer[settings]) tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--inactive--border-color,#8b868045);}tr:only-child th{box-shadow:none!important;}regular-table tbody tr:hover th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover:after{border-color:var(--rt-hover--border-color,#c5c9d080)!important;box-shadow:0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover th.psp-tree-leaf.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr.psp-menu-open:hover:after{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:last-child:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover+tr th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td:not(.psp-row-selected):not(.psp-row-subselected){border-top-color:transparent;}regular-table tbody tr th:first-child:not(:empty),regular-table tbody tr th:first-child:empty+th:not(:empty),regular-table tbody tr th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr td:first-child{border-left-width:1px;border-left-color:transparent;}regular-table tbody tr th:last-child,regular-table tbody tr td:last-child{border-right-width:0px;border-right-color:transparent;}regular-table tbody tr:hover{color:inherit;}regular-table tbody tr:hover th:first-child:not(:empty),regular-table tbody tr:hover th:first-child:empty+th:not(:empty),regular-table tbody tr:hover th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr:hover td:first-child{border-left-color:var(--rt-hover--border-color,#c5c9d080)!important;}regular-table tbody tr:hover th:last-child,regular-table tbody tr:hover td:last-child{border-right-color:var(--rt-hover--border-color,#c5c9d080)!important;}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody td,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody{transform:translate(0,var(--regular-table--transform-y,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child th,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child th,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) var(--regular-table--clip-y,0),var(--regular-table--clip-x,0) 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr:last-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr:last-child:after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:not(:first-child):after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:hover:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:hover:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner){clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}regular-table{outline:none;}regular-table::-webkit-scrollbar,regular-table::-webkit-scrollbar-corner{background-color:transparent;height:12px;width:12px;}regular-table::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--icon--color);border:5.5px solid var(--plugin--background);max-height:50%;max-width:50%;min-width:10%;min-height:10%;}perspective-viewer .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}perspective-viewer .psp-menu-enabled:hover,perspective-viewer tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}perspective-viewer tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}perspective-viewer td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}perspective-viewer tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}perspective-viewer tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}:host .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}:host .psp-menu-enabled:hover,:host tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}:host tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}:host td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}:host tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}:host tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}perspective-viewer regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer) regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}.psp-sort-enabled:hover{cursor:pointer;}.psp-row-selected,:hover .psp-row-selected,:hover th.psp-tree-leaf.psp-row-selected,:hover th.psp-tree-label.psp-row-selected{color:white!important;background-color:var(--selected-row--background-color,#ea7319)!important;border-color:var(--selected-row--background-color,#ea7319)!important;}regular-table.flat-group-rollup-mode.vertical-row-headers th.psp-tree-label:not(:last-of-type){writing-mode:vertical-lr;}.psp-row-selected.psp-tree-label:not(:hover):before{color:white;}regular-table:not(.flat-group-rollup-mode) .psp-row-selected.psp-tree-label:not(:hover):before{color:white;}.psp-row-subselected,:hover .psp-row-subselected,:hover th.psp-tree-leaf.psp-row-subselected,:hover th.psp-tree-label.psp-row-subselected{background:rgba(234,115,25,0.2)!important;}.psp-error{color:red;}td:focus{outline:#666;outline-style:dotted;outline-width:1px;}perspective-viewer.dragging regular-table{pointer-events:none;}:host-context(perspective-viewer.dragging) regular-table{pointer-events:none;}.psp-header-border:last-child{border-right-width:0px;}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-desc-icon--mask-image);mask-image:var(--sort-desc-icon--mask-image);}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-asc-icon--mask-image);mask-image:var(--sort-asc-icon--mask-image);}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-desc-icon--mask-image);mask-image:var(--sort-col-desc-icon--mask-image);}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-asc-icon--mask-image);mask-image:var(--sort-col-asc-icon--mask-image);}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-desc-icon--mask-image);mask-image:var(--sort-abs-desc-icon--mask-image);}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-asc-icon--mask-image);mask-image:var(--sort-abs-asc-icon--mask-image);}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-desc-icon--mask-image);mask-image:var(--sort-abs-col-desc-icon--mask-image);}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-asc-icon--mask-image);mask-image:var(--sort-abs-col-asc-icon--mask-image);}tbody th:last-of-type{border-right:1px solid var(--inactive--border-color,#8b868045);overflow:hidden;text-overflow:ellipsis;}tbody th:empty{background-image:linear-gradient(to right,transparent 9px,var(--inactive--border-color,#eee) 10px,transparent 11px);background-repeat:no-repeat;min-width:20px;max-width:20px;pointer-events:none;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label{max-width:0px;min-width:0px;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label:before{color:var(--icon--color);font-family:var(--button--font-family,inherit);padding-right:11px;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-expand:before{content:var(--tree-label-expand--content,\"+\");}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-collapse:before{content:var(--tree-label-collapse--content,\"-\");}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-expand,regular-table:not(.flat-group-rollup-mode) .psp-tree-label-collapse{cursor:pointer;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label:hover:before{color:var(--active--color);text-shadow:0px 0px 5px var(--active--color);}.psp-tree-leaf{padding-left:24px;}.psp-align-right{text-align:right;}.psp-align-left{text-align:left;}.psp-positive:not(:focus){color:var(--rt-pos-cell--color);}.psp-negative:not(:focus){color:var(--rt-neg-cell--color);}regular-table table tbody td{min-width:52px!important;}.psp-is-width-override .rt-column-resize,.rt-column-resize:hover{border:1px dashed#999;border-bottom-width:0px;border-left-width:0px;}.boolean-editable{cursor:pointer;}regular-table table{user-select:none;color:inherit;border-collapse:separate;}regular-table table th{font-weight:400;}regular-table table td,regular-table table th{border-color:var(--inactive--border-color,#8b868045);height:23px;}regular-table table .psp-header-group{text-overflow:ellipsis;}regular-table table th.psp-header-leaf{border-bottom-width:0px;}regular-table table th.psp-header-leaf span{height:23px;min-height:23px;}regular-table table td,regular-table table th.psp-tree-label,regular-table table th.psp-tree-label,regular-table table th.psp-tree-leaf,regular-table table tbody tr:first-child th{border-style:solid;border-width:0px;border-top-width:1px;}regular-table table tbody th:empty{background-position:0px -10px;}regular-table table td.psp-select-region,regular-table table th.psp-select-region{background-color:var(--icon--color)!important;color:var(--plugin--background)!important;border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected){border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--datagrid-column-edit-button--content,\"Edit\");}perspective-viewer:not([settings]) regular-table #psp-column-edit-buttons:after{content:none;}:host-context(perspective-viewer:not([settings])) regular-table #psp-column-edit-buttons:after{content:none;}regular-table table thead tr:last-child:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-bottom:1px solid var(--inactive--border-color);}regular-table table tbody tr:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-top:1px solid transparent;}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--inactive--border-color);}regular-table table tbody tr:hover:not(:first-child):after{border-top:1px solid var(--rt-hover--border-color);}regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--rt-hover--border-color);}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { activate } from \"../plugin/activate.js\";\nimport { restore } from \"../plugin/restore.js\";\nimport { save } from \"../plugin/save.js\";\nimport { draw } from \"../plugin/draw.js\";\nimport column_style_controls, {\n ColumnStyleOpts,\n} from \"../plugin/column_style_controls.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type { IPerspectiveViewerPlugin } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\n PerspectiveViewerElement,\n DatagridPluginConfig,\n ColumnsConfig,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ntype RenderTarget = \"shadow\" | \"light\";\n\n/**\n * The custom element class for this plugin. The interface methods for this\n */\nexport class HTMLPerspectiveViewerDatagridPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n private static _global_stylesheet_installed: boolean = false;\n private static _sheet: CSSStyleSheet | undefined;\n\n // Determines whether this datagrid renders in the light DOM. This will\n // break style encapsulation and may cause inconsistent behavior.\n static renderTarget: RenderTarget =\n window.CSS?.supports &&\n window.CSS?.supports(\"selector(:host-context(foo))\")\n ? \"shadow\"\n : \"light\";\n\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n\n constructor() {\n super();\n this.regular_table = document.createElement(\n \"regular-table\",\n ) as RegularTableElement;\n this.regular_table.part = \"regular-table\";\n this._is_scroll_lock = false;\n this._edit_mode = \"READ_ONLY\";\n const Elem = HTMLPerspectiveViewerDatagridPluginElement;\n if (!Elem._sheet) {\n Elem._sheet = new CSSStyleSheet();\n Elem._sheet.replaceSync(datagridStyles);\n }\n\n if (Elem.renderTarget === \"shadow\") {\n const shadow = this.attachShadow({ mode: \"open\" });\n shadow.adoptedStyleSheets.push(Elem._sheet);\n } else if (\n Elem.renderTarget === \"light\" &&\n !Elem._global_stylesheet_installed\n ) {\n Elem._global_stylesheet_installed = true;\n document.adoptedStyleSheets.push(Elem._sheet);\n }\n }\n\n connectedCallback(): void {\n if (!this._toolbar) {\n this._toolbar = document.createElement(\n \"perspective-viewer-datagrid-toolbar\",\n ) as DatagridToolbarElement;\n }\n\n const parent = this.parentElement;\n if (parent) {\n parent.appendChild(this._toolbar);\n }\n }\n\n disconnectedCallback(): void {\n this._toolbar?.parentElement?.removeChild?.(this._toolbar);\n }\n\n async activate(view: View): Promise<void> {\n return await activate.call(this, view);\n }\n\n get name(): string {\n return \"Datagrid\";\n }\n\n get category(): string {\n return \"Basic\";\n }\n\n get select_mode(): string {\n return \"toggle\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] {\n return [\"Columns\"];\n }\n\n get group_rollups(): string[] {\n return [\"rollup\", \"flat\", \"total\"];\n }\n\n /**\n * Give the Datagrid a higher priority so it is loaded\n * over the default charts by default.\n */\n get priority(): number {\n return 1;\n }\n\n can_render_column_styles(type: string, _group: string): boolean {\n return type !== \"boolean\";\n }\n\n column_style_controls(type: string, group: string): ColumnStyleOpts {\n return column_style_controls.call(this, type as any, group);\n }\n\n async draw(view: View): Promise<void> {\n return await draw.call(this, view);\n }\n\n async update(view: View): Promise<void> {\n if (this.model === undefined) {\n await this.draw(view);\n } else if (this.model._config.split_by?.length > 0) {\n const dimensions = await view.dimensions();\n this.model._num_rows = dimensions.num_view_rows;\n await this.regular_table.draw();\n } else {\n this.model._num_rows = await view.num_rows();\n await this.regular_table.draw();\n }\n }\n\n async render(viewport?: ViewWindow): Promise<string> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const view = await viewer.getView();\n const json = await view.to_columns(viewport as any);\n const cols = await view.column_paths(viewport as any);\n\n const nrows =\n viewport?.end_row !== undefined &&\n viewport?.end_row !== null &&\n viewport?.start_row !== undefined &&\n viewport?.start_row !== null\n ? viewport.end_row - viewport.start_row\n : await view.num_rows();\n\n let out = \"\";\n for (let ridx = 0; ridx < nrows; ridx++) {\n for (const col_name of cols) {\n const col = (json as Record<string, unknown[]>)[col_name];\n const type = this.model!._schema[col_name];\n const pluginConfig = (this.regular_table as any)[\n PRIVATE_PLUGIN_SYMBOL\n ] as ColumnsConfig | undefined;\n const columnName = col_name.split(\"|\").at(-1)!;\n const formatter = format_raw(\n type,\n pluginConfig?.[columnName] || {},\n );\n\n if (formatter) {\n out += formatter.format(col[ridx]) + \"\\t\";\n } else {\n out += col[ridx] + \"\\t\";\n }\n }\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(): Promise<void> {\n if (!this.isConnected || this.offsetParent == null) {\n return;\n }\n\n if (this._initialized) {\n await this.regular_table.draw();\n }\n }\n\n async clear(): Promise<void> {\n this.regular_table.resetAutoSize();\n this.regular_table.clear();\n }\n\n async save(): Promise<any> {\n return save.call(this);\n }\n\n async restore(\n token: DatagridPluginConfig,\n columns_config?: ColumnsConfig,\n ): Promise<any> {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(this.model._view);\n }\n }\n\n async delete(): Promise<void> {\n this.disconnectedCallback();\n this._toolbar = undefined;\n if ((this.regular_table as any).table_model) {\n this.regular_table.resetAutoSize();\n }\n\n this.regular_table.clear();\n }\n}\n", ":host{position:relative;display:block;height:100%;}:host #container{position:absolute;display:flex;flex-direction:column;justify-content:stretch;align-items:stretch;top:0;left:0;right:0;bottom:0;}:host #toolbar{display:flex;align-items:stretch;height:100%;}:host #toolbar .hover-target{margin:0;display:inline-flex;align-items:center;cursor:pointer;}:host #toolbar .hover-target:hover{box-shadow:-4px 0 0 var(--icon--color),4px 0 0 var(--icon--color);background-color:var(--icon--color);}:host #slot-container{flex:1;position:relative;}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--toolbar-scroll-lock-active--content);}#scroll_lock:before{-webkit-mask-image:var(--toolbar-scroll-lock--content);}#select_mode:before{content:\"highlight_alt\";}#edit_mode:before{-webkit-mask-image:\"\";}#edit_mode[data-edit-mode=\"READ_ONLY\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--edit--content);}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"SELECT_ROW\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-row--content);}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-column--content);}#edit_mode[data-edit-mode=\"SELECT_REGION\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-region--content);}#edit_mode[data-edit-mode=\"READ_ONLY\"] span:before{content:var(--edit-mode--read-only--content,\"Read Only\");}#edit_mode[data-edit-mode=\"EDIT\"] span:before{content:var(--edit-mode--edit--content,\"Editable\");}#edit_mode[data-edit-mode=\"SELECT_ROW\"] span:before{content:var(--edit-mode--select-row--content,\"Row Select\");}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"] span:before{content:var(--edit-mode--select-column--content,\"Column Select\");}#edit_mode[data-edit-mode=\"SELECT_REGION\"] span:before{content:var(--edit-mode--select-region--content,\"Region Select\");}#scroll_lock span:before{content:var(--scroll-lock-toggle--content,\"Free Scroll\");}#scroll_lock.lock-scroll span:before{content:var(--scroll-lock-alt-toggle--content,\"Align Scroll\");}.button:before{width:21px;height:21px;content:\"\";-webkit-mask-size:cover;mask-size:cover;background-color:var(--icon--color);}.button.editable:before,.button.lock-scroll:before{color:inherit;}.button{display:inline-flex;justify-content:center;align-items:center;user-select:none;padding:0 5px;border:1px solid transparent;border-radius:3px;border:1px solid transparent;box-sizing:border-box;display:inline-flex;font-size:var(--label--font-size,0.75em);height:22px;user-select:none;white-space:nowrap;width:37px;}.button>span{display:none;margin:0;padding:0;}.hover-target:focus-within .button,.hover-target:hover .button{position:relative;background-color:var(--icon--color);color:var(--plugin--background);opacity:1;display:flex;align-items:center;cursor:pointer;}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--plugin--background);}.hover-target:focus-within .button>span,.hover-target:hover .button>span{display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%;margin:0;padding:5px;height:auto;white-space:pre-wrap;line-height:1;font-size:9px;background-color:var(--icon--color);width:35px;text-align:center;border-radius:0 0 3px 3px;}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nconst stylesheet = new CSSStyleSheet();\nstylesheet.replaceSync(TOOLBAR_STYLE);\n\n/**\n * The custom element for this plugin's toolbar, a component which displays in\n * the host `<perspective-viewer>`'s status bar when this plugin is active.\n * In the case of Datagrid, this comprises \"Editable\" and \"Scroll Lock\" toggle\n * buttons.\n */\nexport class HTMLPerspectiveViewerDatagridToolbarElement extends HTMLElement {\n private _initialized: boolean = false;\n\n connectedCallback(): void {\n if (this._initialized) {\n return;\n }\n\n this._initialized = true;\n this.setAttribute(\"slot\", \"statusbar-extra\");\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot!.adoptedStyleSheets.push(stylesheet);\n this.shadowRoot!.innerHTML = `\n <div id=\"toolbar\">\n <span class=\"hover-target\">\n <span id=\"scroll_lock\" class=\"button\">\n <span></span>\n </span>\n </span>\n <span class=\"hover-target\">\n <span id=\"edit_mode\" class=\"button\" data-edit-mode=\"READ_ONLY\">\n <span></span>\n </span>\n </span>\n </div>\n `;\n\n const viewer = this.parentElement as PerspectiveViewerElement;\n const plugin = this.previousElementSibling as DatagridPluginElement;\n\n plugin._scroll_lock = this.shadowRoot!.querySelector(\n \"#scroll_lock\",\n ) as HTMLElement;\n plugin._scroll_lock.addEventListener(\"click\", () =>\n toggle_scroll_lock.call(plugin),\n );\n\n plugin._edit_button = this.shadowRoot!.querySelector(\n \"#edit_mode\",\n ) as HTMLElement;\n plugin._edit_button.addEventListener(\"click\", () => {\n toggle_edit_mode.call(plugin);\n plugin.regular_table.draw();\n viewer.dispatchEvent(new Event(\"perspective-config-update\"));\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAYA,MAAO,gBCqPP,OAAS,2BAAAA,MAA+B,0BAtOjC,SAASC,EACZC,EACAC,EACU,CACV,OACIA,EAAS,OAAS,QAClBA,EAAS,OAAS,iBAClBA,EAAS,OAAS,SAEXD,EAAM,cAAcC,EAAS,CAAC,EAE9BD,EAAM,mBAAmBC,EAAS,cAAgB,GAAK,CAAC,CAEvE,CA8JO,IAAMC,EAAuC,OAChD,2BACJ,EC5LA,OAAOC,OAAY,YCOnB,IAAMC,GAAN,KAA4C,CACxC,OAAOC,EAAsB,CACzB,OAAOA,EAAM,OAAS,OAC1B,CACJ,EAKMC,GAGF,CACA,MAAO,CACH,OAAQ,CACJ,MAAO,UACP,sBAAuB,EACvB,sBAAuB,CAC3B,CACJ,EACA,SAAU,CACN,OAAQ,CACJ,UAAW,QACX,UAAW,QACf,CACJ,EACA,KAAM,CACF,OAAQ,CACJ,UAAW,OACf,CACJ,CACJ,EAEaC,EAAN,KAAqB,CAChB,YAER,aAAc,CACV,KAAK,YAAc,IAAI,GAC3B,CAEQ,0BACJC,EACAC,EACmB,CACnB,GAAIA,EAAO,aAAa,SAAW,SAAU,CACzC,IAAMC,EAAsC,CACxC,SAAUD,EAAO,aAAa,SAC9B,UACIA,EAAO,aAAa,YAAc,WAC5B,OACCA,EAAO,aAAa,WAAa,QAC5C,UACIA,EAAO,aAAa,YAAc,WAC5B,OACCA,EAAO,aAAa,WAAa,QAChD,EAEA,OAAO,IAAI,KAAK,eACZ,UAAU,UACVC,CACJ,CACJ,KAAO,CACH,IAAMA,EAAsC,CACxC,SAAUD,EAAO,aAAa,SAC9B,OAAQA,EAAO,aAAa,QAAU,GACtC,uBACIA,EAAO,aAAa,sBAC5B,EAEA,OAAIA,EAAO,aAAa,OAAS,aAC7BC,EAAQ,KAAOD,EAAO,aAAa,MAAQ,WAE3CA,EAAO,aAAa,QAAU,aAC9BC,EAAQ,MAAQD,EAAO,aAAa,OAAS,WAE7CA,EAAO,aAAa,MAAQ,aAC5BC,EAAQ,IAAMD,EAAO,aAAa,KAAO,WAGzCA,EAAO,aAAa,SACpBA,EAAO,aAAa,UAAY,aAEhCC,EAAQ,QAAUD,EAAO,YAAY,SAErCA,EAAO,aAAa,OAAS,aAC7BC,EAAQ,KAAOD,EAAO,aAAa,MAAQ,WAE3CA,EAAO,aAAa,SAAW,aAC/BC,EAAQ,OAASD,EAAO,aAAa,QAAU,WAE/CA,EAAO,aAAa,SAAW,aAC/BC,EAAQ,OAASD,EAAO,aAAa,QAAU,WAG5C,IAAI,KAAK,eACZ,UAAU,UACVC,CACJ,CACJ,CACJ,CAEQ,sBACJF,EACAC,EACmB,CACnB,IAAMC,EAAsC,CACxC,SAAU,MACV,UACID,EAAO,aAAa,YAAc,WAC5B,OACCA,EAAO,aAAa,WAAa,OAChD,EAEA,OAAO,IAAI,KAAK,eACZ,UAAU,UACVC,CACJ,CACJ,CAEQ,wBACJC,EACAF,EACiB,CACjB,IAAMG,EACFH,EAAO,eACNH,GAAcK,CAAI,GAAG,OAC1B,OAAO,IAAI,KAAK,aAAa,UAAU,UAAuBC,CAAM,CACxE,CAEQ,yBACJJ,EACAK,EACS,CACT,OAAO,IAAIT,EACf,CAEA,IAAIO,EAAkBF,EAAqD,CACvE,IAAMK,EAAgB,CAClBH,EACA,GAAG,OAAO,OAAOF,EAAO,aAAe,CAAC,CAAC,EACzC,GAAG,OAAO,OAAOA,EAAO,eAAiB,CAAC,CAAC,CAC/C,EAAE,KAAK,GAAG,EAEV,OAAK,KAAK,YAAY,IAAIK,CAAa,IAC/BH,IAAS,OACT,KAAK,YAAY,IACbG,EACA,KAAK,sBAAsBH,EAAMF,CAAM,CAC3C,EACOE,IAAS,WAChB,KAAK,YAAY,IACbG,EACA,KAAK,0BAA0BH,EAAMF,CAAM,CAC/C,EACOE,IAAS,WAAaA,IAAS,QACtC,KAAK,YAAY,IACbG,EACA,KAAK,wBAAwBH,EAAMF,CAAM,CAC7C,EACOE,IAAS,UAChB,KAAK,YAAY,IACbG,EACA,KAAK,yBAAyBH,EAAMF,CAAM,CAC9C,EAEA,KAAK,YAAY,IAAIK,EAAe,EAAK,GAI1C,KAAK,YAAY,IAAIA,CAAa,CAC7C,CACJ,EC9KA,IAAMC,GAAe,IAAIC,EACnBC,GAAoB,EAEnB,SAASC,GACZC,EACAC,EAC6B,CAC7B,OAAOL,GAAa,IAAII,EAAMC,CAAK,CACvC,CAKO,SAASC,EAEZC,EACAC,EACAC,EAAyB,CAAC,EAC1BC,EAAmB,GACQ,CAC3B,GAAIF,IAAQ,KACR,OAAO,KAGX,IAAMJ,EAAqBM,GAAoB,KAAK,cAAcH,CAAK,GACnE,KAAK,QAAQA,CAAK,GAClB,SACEI,EAAuBF,EAAQF,CAAK,GAAK,CAAC,EAGhD,IAFmBH,IAAS,WAAaA,IAAS,UAEhCO,GAAQ,iBAAmB,MAAO,CAChD,IAAM,EAAI,KAAK,IACX,EACA,KAAK,IACDT,GACA,KAAK,IAAKM,EAAiBG,EAAO,WAAY,EAC1CT,EACR,CACJ,EAEMU,EAAM,KAAK,aAAa,IAAI,EAC5BC,EAAUL,GAAkB,EAAI,OAAS,QACzCM,GAAO,EAAI,KAAK,QAAQ,CAAC,EAC/B,OAAAF,EAAI,aACA,QACA,cAAcE,CAAG,8BAA8BD,CAAM,8CACzD,EAEOD,CACX,SAAWD,GAAQ,SAAW,QAAUP,IAAS,SAAU,CACvD,IAAMS,EAAS,SAAS,cAAc,GAAG,EACzC,OAAAA,EAAO,aAAa,OAAQL,CAAa,EACzCK,EAAO,aAAa,SAAU,QAAQ,EACtCA,EAAO,YAAcL,EACdK,CACX,SAAWF,GAAQ,SAAW,QAAUP,IAAS,SAAU,CACvD,IAAMW,EAAO,SAAS,cAAc,GAAG,EACvC,OAAAA,EAAK,YAAcP,EACZO,CACX,SAAWJ,GAAQ,SAAW,WAAaP,IAAS,SAAU,CAC1D,IAAMY,EAAS,SAAS,cAAc,GAAG,EACzC,OAAAA,EAAO,YAAcR,EACdQ,CACX,KAAO,CACH,IAAMC,EAAYjB,GAAa,IAAII,EAAMO,CAAM,EAC/C,OAAOM,EAAYA,EAAU,OAAOT,CAAG,EAAKA,CAChD,CACJ,CC9DO,SAAUU,GAEbC,EAAqB,CAAC,EACtBC,EACAC,EAC0B,CAC1B,IAAMC,EACDD,EAAqBE,CAAqB,GAAK,CAAC,EACrD,QAASC,KAAQL,EAAO,CACpB,IAAMM,EAAsB,CAAC,QAAS,GAAGD,CAAI,EACvCE,EAAOD,EAASA,EAAS,OAAS,CAAC,EACrCE,EAA2BF,EAC1B,MAAM,EAAGA,EAAS,OAAS,CAAC,EAC5B,KAAK,EAAE,EACNG,EAAYC,EAAY,KAC1B,KACAT,EAAYO,EAAQ,OAAS,CAAC,EAC9BD,EACAJ,EACA,EACJ,EAEIM,aAAqB,YACrBD,EAAUA,EAAQ,OAAOC,CAAS,EAElCD,EAAUA,EAAQ,OAAO,CAAE,SAAU,IAAMC,CAAoB,CAAC,EAGpED,EAAQ,OAASP,EAAY,OAAS,EACtC,MAAMO,CACV,CACJ,CAEO,SAAUG,GAEbX,EAAqB,CAAC,EACtBC,EACAC,EAC0B,CAC1B,IAAMC,EACDD,EAAqBE,CAAqB,GAAK,CAAC,EAErD,QAASC,KAAQL,EACb,MAAMK,EAAK,IAAI,CAACO,EAAMC,IAClBH,EAAY,KAAK,KAAMT,EAAYY,CAAC,EAAGD,EAAMT,EAAS,EAAI,CAC9D,CAER,CAKO,SAAUW,GAEbd,EAAqB,CAAC,EACtBC,EACAC,EACoB,CACpB,IAAMC,EACDD,EAAqBE,CAAqB,GAAK,CAAC,EACrD,QAAWC,KAAQL,EAAO,CACtB,IAAMe,EAAsB,CAAC,EAAE,EAC/B,QAAWC,KAAOX,EACdU,EAAS,KACLL,EAAY,KACR,KACAT,EAAYe,CAAG,EACfX,EAAKW,CAAG,EACRb,EACA,EACJ,CACJ,EAGJ,MAAME,CACV,CACJ,CCxDO,SAASY,GACZC,EAOuB,CACvB,IAAIC,EACAC,EACAC,EACAC,EACAC,EAEJ,OAAO,eAEHC,EACAC,EACAC,EACAC,EACAC,EACqB,CACrB,IAAIC,EAAsB,CAAC,EACrBC,EAAyB,CAC3B,UAAWJ,EACX,UAAWD,EACX,QAASG,EACT,QAASD,EACT,GAAI,EACR,EAEII,EAA6B,KAEjC,GAAIJ,EAAKF,EAAK,GAAKG,EAAKF,EAAK,EAAG,CAC5B,KAAK,iBACD,KAAK,cAAc,YAAcA,GACjC,KAAK,cAAc,UAAYE,GAC/B,KAAK,cAAc,YAAcH,GACjC,KAAK,cAAc,UAAYE,EAEnC,GAAM,CAACK,EAAGC,CAAC,EAAI,MAAM,QAAQ,IAAI,CAC7B,KAAK,MAAM,kBAAkBH,CAAiB,EAC9C,KAAK,MAAM,YAAY,CAC3B,CAAC,EAEDC,EAAcE,EACdJ,EAAU,KAAK,MAAMG,CAAW,EAEhC,IAAME,EADI,OAAO,KAAKL,CAAO,EACL,OACnBG,GAAMA,IAAM,gBAAkBA,IAAM,QACzC,EAEIG,EAAe,GACnB,QAASC,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IAElC,KAAK,cAAcN,EAAW,UAAaM,CAAC,IAC5CF,EAAcE,CAAC,IAEfD,EAAe,GACf,KAAK,cAAcL,EAAW,UAAaM,CAAC,EACxCF,EAAcE,CAAC,GAI3B,GAAID,EAAc,CACd,GAAM,CAACE,EAAGC,CAAC,EAAI,MAAM,QAAQ,IAAI,CAC7B,KAAK,MAAM,OAAO,EAClB,KAAK,MAAM,kBAAkB,CACjC,CAAC,EAED,KAAK,QAAU,CAAE,GAAID,EAAc,GAAIC,CAAa,EACpD,QAASF,EAAI,EAAGA,EAAIF,EAAc,OAAQE,IAAK,CAE3C,IAAMG,GADoBL,EAAcE,CAAC,EAAE,MAAM,GAAG,EAE9B,KAAK,QAAQ,SAAS,MAAM,EAElD,KAAK,aAAaA,EAAIN,EAAW,SAAU,EACvC,CAAC,CAAC,KAAK,cAAcS,EAAM,EAE/B,KAAK,cAAcH,EAAIN,EAAW,SAAU,EACxC,KAAK,QAAQS,EAAM,CAC3B,CACJ,CAEA,KAAK,aAAeT,EACpB,KAAK,KACDD,EAAQ,QACR,MAAMD,EAAKF,CAAE,EACR,KAAK,IAAI,EACT,IAAI,CAAC,EAAGc,IAAU,CAACA,EAAQd,CAAE,CAAC,EAEvC,KAAK,iBAAmB,KAAK,cACxB,MAAMD,EAAIE,CAAE,EACZ,OAAO,CAACc,EAAKT,EAAGI,KACbK,EAAI,IAAIT,EAAGI,CAAC,EACLK,GACR,IAAI,GAAqB,EAEhC,KAAK,aAAe,KAAK,MAAM,OAAO,CAACA,EAAKT,EAAGI,KAC3CK,EAAI,IAAIT,GAAG,KAAK,GAAG,EAAGI,CAAC,EAChBK,GACR,IAAI,GAAqB,CAChC,MACI,KAAK,aAAa,MAAM,EACxBV,EAAc,MAAM,KAAK,MAAM,YAAY,EAG/C,IAAMW,EAAmC,CAAC,EACpCC,EAAwB,CAAC,EACzBC,EAA6B,CAAC,EAC9BC,EAAyB,CAAC,EAE1BC,EAAmB5B,EAAO,aAAa,UAAU,EACvD,QACQ6B,EAAQtB,EACZsB,EAAQ,KAAK,IAAIpB,EAAI,KAAK,cAAc,MAAM,EAC9C,EAAEoB,EACJ,CACE,IAAMC,EAAO,KAAK,cAAcD,CAAK,EAC/BE,EAAaD,EAAK,MAAM,GAAG,EAC3BT,EAASV,EAAQmB,CAAI,GAAK,IAAI,MAAMpB,EAAKF,CAAE,EAAE,KAAK,IAAI,EACtDwB,EAAY,KAAK,IAClB1B,EAAqB2B,CAAqB,IACvCF,EAAW,KAAK,QAAQ,SAAS,MAAM,CAC3C,GAAG,iBAAmB,EACtB,KAAK,QAAQ,SAAS,MAC1B,EAEAP,EAAK,KACDH,EAAO,IAAI,CAACP,EAAGI,KACNP,GAAS,eAAeO,CAAC,GAAG,QAAU,GAAKc,EACrC,GAEAE,EAAY,KACf,KACAH,EAAW,KAAK,QAAQ,SAAS,MAAM,EACvCjB,EACCR,EAAqB2B,CAAqB,GAAK,CAAC,CACrD,CAEP,CACL,EAEAR,EAAS,KAAKJ,CAAmB,EAC7BO,GACAG,EAAW,KAAK,EAAE,EAGtBL,EAAe,KAAKK,CAAU,EAC9BJ,EAAa,KAAKG,CAAI,CAC1B,CAEA,IAAMK,EAAc1B,EAAKF,EAAK,GAAKG,EAAKF,EAAK,EAGzC2B,IACA,KAAK,kBAAoBjC,EACzB,KAAK,UAAYD,EACjB,KAAK,SAAWE,EAChB,KAAK,iBAAmBC,EACxB,KAAK,qBAAuBC,EAE5BH,EAAoByB,EACpB1B,EAAYwB,EACZtB,EAAW,KAAK,KAChBC,EAAmB,KAAK,aACxBC,EAAuB,KAAK,kBAGhC,IAAM+B,EAAczB,EAAQ,eAAiB,OACvC0B,EAAU,KAAK,QAAQ,oBAAsB,OAC7CC,EAAc,MAAM,MACrBF,EACKC,EACIE,GACAC,GACJC,IACJ,KACE,KACA9B,EAAQ,aACR,KAAK,QAAQ,SACbL,CACJ,CACJ,EAEMoC,EAAmBP,EAEnBG,EAAY,CAAC,GAAG,OADhBK,GAAiB,KAAK,OAAO,EAmBnC,MAhB6B,CACzB,mBACI,KAAK,QAAQ,SAAS,QAAUf,EAAmB,EAAI,GAC3D,gBAAAc,EACA,SAAU,KAAK,UACf,YAAA7B,EACA,YAAayB,EACb,eAAAZ,EACA,KAAMF,EACN,SAAAC,EACA,0BAA2B,KAAK,IAC5B,EACA,KAAK,QAAQ,SAAS,MAC1B,CACJ,CAGJ,CACJ,CAEA,SAASkB,GAAiBC,EAAoB,CAC1C,OAAIA,EAAO,oBAAsB,OACtBA,EAAO,SAAS,OAChBA,EAAO,oBAAsB,SAE7BA,EAAO,SAAS,SAAW,EAD3B,EAIAA,EAAO,SAAS,OAAS,CAExC,CCzPA,OAAOC,OAAY,YAGZ,SAASC,GAAMC,EAAWC,EAAqB,CAClD,OAAOH,GAAO,IAAIE,EAAG,OAAOC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAK,EAAG,EAAE,IAAI,CAClE,CAIO,SAASC,EACZ,CAACC,EAAGC,EAAGH,EAAGD,CAAC,EACXK,EAAmC,CAAC,IAAK,IAAK,GAAG,EACzB,CACxB,SAASC,EAAEC,EAAWC,EAAmB,CACrC,QAAS,EAAIR,IAAMK,EAAOE,CAAC,EAAI,KAAOP,GAAKQ,EAAI,MAAQ,GAC3D,CAEA,MAAO,CAACF,EAAE,EAAGH,CAAC,EAAGG,EAAE,EAAGF,CAAC,EAAGE,EAAE,EAAGL,CAAC,CAAC,CACrC,CAGO,SAASQ,EAAiC,CAACN,EAAGC,EAAGH,CAAC,EAI9C,CAEP,OAAO,KAAK,KAAKE,EAAIA,EAAI,KAAQC,EAAIA,EAAI,KAAQH,EAAIA,EAAI,IAAK,EAAI,IAC5D,UACA,SACV,CAEA,SAASS,GAAcC,EAAiC,CACpD,GAAM,CAACR,EAAGC,EAAGH,CAAC,EAAIU,EAAU,IAAI,EAC1B,CAACC,EAAIC,EAAIC,CAAE,EAAIH,EAChB,IAAI,SAAUA,EAAU,IAAI,OAAO,EAAI,IAAM,GAAG,EAChD,IAAI,EACH,CAACI,EAAIC,EAAIC,CAAE,EAAIN,EAChB,IAAI,SAAUA,EAAU,IAAI,OAAO,EAAI,IAAM,GAAG,EAChD,IAAI,EACT,MAAO,oCAAoCC,CAAE,IAAIC,CAAE,IAAIC,CAAE,SAASX,CAAC,IAAIC,CAAC,IAAIH,CAAC,aAAac,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAC5G,CAEO,SAASC,EAAkBC,EAA4B,CAC1D,IAAMC,EAAatB,GAAOqB,CAAK,EACzBE,EAAYX,GAAcU,CAAU,EACpCE,EAAMF,EAAW,IAAI,EAC3B,MAAO,CACHD,EACAG,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLD,EACA,QAAQC,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,MAClC,QAAQA,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,KACtC,CACJ,CLnCA,SAASC,EAASC,EAAsBC,EAAaC,EAAqB,CACtE,IAAMC,EAAQ,OAAO,iBAAiBH,CAAO,EAAE,iBAAiBC,CAAG,EAAE,KAAK,EAC1E,OAAIE,EAAM,OAAS,EACRA,EAEAD,CAEf,CAEA,IAAME,GAAN,KAA6C,CACjC,MACA,UACA,OAER,YAAYC,EAAc,CACtB,KAAK,MAAQA,EACb,KAAK,UAAY,CAAC,EAClB,KAAK,OAAS,CAClB,CAEA,OAAc,CACV,KAAK,OAAS,CAClB,CAEA,KAAmB,CACV,KAAK,UAAU,KAAK,MAAM,IAC3B,KAAK,UAAU,KAAK,MAAM,EAAI,SAAS,cAAc,KAAK,KAAK,GAEnE,IAAMC,EAAO,KAAK,UAAU,KAAK,MAAM,EACvC,YAAK,QAAU,EACRA,CACX,CACJ,EAEA,eAAsBC,EAElBP,EACAQ,EACAC,EACAC,EAAiC,CAAC,EACZ,CACtB,IAAMC,EAAU,MAAMF,EAAK,WAAW,EACtC,GAAI,MAAM,OAAO,QAAS,CACtB,IAAMG,EAAM,KAAK,MAAM,QACnBC,EAAmBD,EAAI,SAAS,SAAWD,EAAO,SAAS,OACzDG,IACDF,EAAI,SAAS,SAAW,GAAKD,EAAO,SAAS,SAAW,IACzDE,EAEJ,GAAI,CAACA,EACD,QAAWE,KAAOH,EAAI,SAClBC,IAAqBF,EAAO,SAASI,CAAG,IAAMH,EAAI,SAASG,CAAG,EAItE,IAAIC,EAAmBJ,EAAI,SAAS,SAAWD,EAAO,SAAS,OAC/D,GAAI,CAACK,EACD,QAAWD,KAAOH,EAAI,SAClBI,IAAqBL,EAAO,SAASI,CAAG,IAAMH,EAAI,SAASG,CAAG,EAItE,IAAIE,EAAkBL,EAAI,QAAQ,SAAWD,EAAO,QAAQ,OAC5D,GAAI,CAACM,EACD,QAAWF,KAAOH,EAAI,QAClBK,IAAoBN,EAAO,QAAQI,CAAG,IAAMH,EAAI,QAAQG,CAAG,EAInE,IAAIG,EAAiBN,EAAI,OAAO,SAAWD,EAAO,OAAO,OACzD,GAAI,CAACO,EACD,QAAWH,KAAOH,EAAI,OAClB,QAAWO,KAAKR,EAAO,OAAOI,CAAG,EAC7BG,IACIP,EAAO,OAAOI,CAAG,EAAEI,CAAsB,IACzCP,EAAI,OAAOG,CAAG,EAAEI,CAAsB,EAKtD,IAAIC,EAAeR,EAAI,KAAK,SAAWD,EAAO,KAAK,OACnD,GAAI,CAACS,EACD,QAAWL,KAAOH,EAAI,KAClB,QAAWO,KAAKR,EAAO,KAAKI,CAAG,EAC3BK,IACIT,EAAO,KAAKI,CAAG,EAAEI,CAAsB,IACvCP,EAAI,KAAKG,CAAG,EAAEI,CAAsB,EAKpD,IAAME,EACFT,EAAI,oBAAsBD,EAAO,kBAErC,KAAK,kBAAoBE,EACzB,KAAK,mBAAqBG,EAC1B,KAAK,cACDH,GACAG,GACAE,GACAE,GACAH,EAEJ,KAAK,mBACDI,GACAL,GACAH,GACAI,GACAH,EACR,CAEA,GAAM,CAACQ,EAAcC,EAAUC,EAAQC,EAAmBC,CAAU,EAChE,MAAM,QAAQ,IAAI,CACdlB,EAAM,OAAO,EACbC,EAAK,SAAS,EACdA,EAAK,OAAO,EACZA,EAAK,kBAAkB,EACtB,KAAK,cAA2C,YAAY,CACjE,CAAC,EAECkB,EAAqBC,GACvB7B,EAASC,EAAS,uBAAwB,SAAS,CACvD,EAAE,IAAI,EAEA6B,EAAgBC,EAClB/B,EAASC,EAAS,uBAAwB,SAAS,CACvD,EAEM+B,EAAgBD,EAClB/B,EAASC,EAAS,uBAAwB,SAAS,CACvD,EAEMgC,EAAgBF,EAClBG,GAAMJ,EAAc,CAAC,EAAGF,CAAkB,CAC9C,EAEMO,EAAgBJ,EAClBG,GAAMF,EAAc,CAAC,EAAGJ,CAAkB,CAC9C,EAEMQ,EAASL,EACX/B,EAASC,EAAS,kBAAmB,SAAS,CAClD,EAEMoC,EAAkB,CACpB,GAAIZ,EACJ,GAAIC,CACR,EACMY,EAAwB,CAC1B,GAAIf,EACJ,GAAIG,CACR,EAEMa,EAA0B,CAAC,EAC3BC,EAA0B,CAAC,EAC3BC,EAA8B,CAAC,EAE/BC,EAAuB,KAAK,YAAc,YAChD,KAAK,aAAc,QAAQ,SAAWA,EAEtC,IAAMC,EAAuB,OAAO,OAAOhC,EAAQ,CAC/C,WAAAgB,EACA,MAAOjB,EACP,OAAQD,EACR,cAAA6B,EACA,QAAS1B,EACT,UAAWY,EACX,QAAAa,EACA,KAAM,CAAC,EACP,mBAAAT,EACA,OAAAQ,EACA,cAAAN,EACA,cAAAE,EACA,cAAAC,EACA,cAAAE,EACA,cAAAI,EACA,cAAAE,EACA,aAAAD,EACA,WAAAE,EACA,iBAAkB,CACd,eAAgB,CAAC,EACjB,MAAO,EACX,EACA,kBAAmB9B,EAAO,SAAS,IAAKgC,GAC7BN,EAAcM,CAAW,CACnC,EACD,kBAAmB,IAAI,IACvB,mBAAoB,IAAI,IAExB,aAAcjC,EAAO,cAAgB,IAAIN,GAAgB,KAAK,CAClE,CAAC,EAED,OAAAJ,EAAQ,gBACJ4C,GAAmB,KAAK,aAAyC,EAAE,KAC/DF,EACA1C,CACJ,EACA,CACI,aAAe,OACV,iBAAiBA,CAAO,EACxB,iBAAiB,yBAAyB,GACzC,KAAK,GAAK,MAKpB,CACJ,EAEO0C,CACX,CMrOO,IAAMG,EAAkC,CAC3C,YACA,OACA,aACA,gBACA,eACJ,EAEO,SAASC,EAEZC,EACI,CACA,OAAOA,EAAS,MAChBA,EACIF,GACKA,EAAW,QAAQ,KAAK,UAAU,EAAI,GAAKA,EAAW,MAC3D,GAGP,KAAK,eAAuB,eAAe,EAC5C,KAAK,WAAaE,EACd,KAAK,QACL,KAAK,MAAM,WAAaA,EACxB,KAAK,MAAM,iBAAmB,CAC1B,eAAgB,CAAC,EACjB,MAAO,EACX,GAGA,KAAK,eAAiB,SACtB,KAAK,aAAa,QAAQ,SAAWA,GAGzC,KAAK,QAAQ,SAAWA,CAC5B,CAEO,SAASC,EAEZC,EACI,CACA,OAAOA,EAAU,MACjBA,EAAQ,CAAC,KAAK,iBAGlB,KAAK,gBAAkBA,EACvB,KAAK,UAAU,OAAO,2BAA4BA,CAAK,EACnD,KAAK,eAAiB,QACtB,KAAK,aAAa,UAAU,OAAO,cAAeA,CAAK,CAE/D,CC5BO,SAASC,EAEZC,EACAC,EAAQ,GACJ,CACJ,GAAI,CAAC,KAAK,aACN,OAGAA,IACA,KAAK,qBAAuBD,GAGhC,IAAME,EAAgD,CAAC,EACjD,CAAE,SAAAC,CAAS,EAAI,KAAK,MAAO,QAC3BC,EAAqBD,GAAU,OAAS,EAAIA,EAAS,OAAS,EAAI,EAExE,QAAWE,KAAO,OAAO,KAAKL,CAAS,EACnC,GAAIK,IAAQ,eACRH,EAAUE,EAAqB,CAAC,EAAIJ,EAAUK,CAAG,MAG9C,CACH,IAAMC,EAAQ,KAAK,MAAO,cAAc,QAAQD,CAAG,EACnDH,EAAUI,EAAQF,CAAkB,EAAIJ,EAAUK,CAAG,CAGzD,CAGH,KAAK,cAA4C,mBAC9CH,CACJ,CACJ,CAUO,SAASK,GAEG,CACf,GAAI,CAAC,KAAK,aACN,MAAO,CAAC,EAGZ,GAAI,KAAK,qBAAsB,CAC3B,IAAMC,EAAI,KAAK,qBACf,YAAK,qBAAuB,OACrBA,CACX,CAEA,IAAMN,EACF,KAAK,cACP,gBAAgB,EACZ,CAAE,SAAAC,CAAS,EAAI,KAAK,MAAO,QAC3BC,EAAqBD,GAAU,OAAS,EAAIA,EAAS,OAAS,EAAI,EAElEH,EAA6B,CAAC,EACpC,QAAWK,KAAO,OAAO,KAAKH,CAAS,EAAG,CACtC,IAAMO,EAAS,OAAOJ,CAAG,EACzB,GAAIH,EAAUO,CAAM,IAAM,OAAW,CACjC,IAAMH,EAAQG,EAASL,EACnBE,EAAQ,GACRN,EAAU,KAAK,MAAO,cAAcM,CAAK,CAAC,EAAIJ,EAAUO,CAAM,EACvDH,IAAU,KACjBN,EAAU,aAAkBE,EAAUO,CAAM,EAEpD,CACJ,CAEA,OAAOT,CACX,CCtFO,SAASU,GAEZC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAmB,MAAM,KAC3BH,EAAa,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,QACzC,EAEMI,EAAMD,EAAiB,OACvBE,EAAgBJ,EAAO,aAAa,UAAU,EAiBpD,GAhBIG,GAAO,EACPD,EAAiB,CAAC,GAAG,gBAAgB,IAAI,EAEzCA,EAAiB,QAAQ,CAACG,EAAIC,IAAM,CAChC,IAAMC,EAASH,EAAgB,EAAI,EAC7BI,EACFF,IAAMH,GAAOI,EAAS,GAChB,oBACAD,IAAMH,EAAMI,EACV,0BACA,KACZC,EAAKH,EAAG,aAAa,KAAMG,CAAE,EAAIH,EAAG,gBAAgB,IAAI,CAC5D,CAAC,EAGLL,EAAO,UAAU,OAAO,gBAAiB,CAAC,CAACC,CAAc,EACrDG,GAAiBD,GAAO,EAAG,CAC3B,IAAMM,EAAS,MAAM,KACjBP,EAAiBC,EAAM,CAAC,EAAE,QAC9B,EACMO,EAAW,MAAM,KACnBR,EAAiBC,EAAM,CAAC,EAAE,QAC9B,EACA,GAAIM,GAAUC,EAAU,CACpBR,EAAiB,MAAM,EAAGC,EAAM,CAAC,EAAE,QAASE,GAAO,CAC/C,MAAM,KAAKA,EAAG,QAAQ,EAAE,QAASM,GAAO,CACpCA,EAAG,UAAU,OAAO,gBAAiB,EAAK,CAC9C,CAAC,CACL,CAAC,EAED,QAAS,EAAI,EAAG,EAAIF,EAAO,OAAQ,IAAK,CACpC,IAAMG,EAAQH,EAAO,CAAC,EAChBI,EAAUH,EAAS,CAAC,EAEpBI,EAAOF,EAAM,cAAgBX,EAGnC,GAFAW,EAAM,UAAU,OAAO,gBAAiBE,CAAI,EAC5CD,EAAQ,UAAU,OAAO,gBAAiBC,CAAI,EAC1C,KAAK,QAAQ,QAAQ,OAAS,EAC9B,QAAWC,KAAKhB,EAAa,iBAAiB,IAAI,EAAG,CACjD,IAAMiB,EAAOjB,EAAa,QAAQgB,CAAC,EACnC,GAAI,CAACC,GAAM,cAAe,SAC1B,IAAMC,EACFD,EAAK,cACDA,EAAK,cAAc,OAAS,CAChC,IAAMf,EACVc,EAAE,UAAU,OAAO,gBAAiBE,CAAM,CAC9C,CAER,CACJ,CACJ,CACJ,CAKO,SAASC,GAEZC,EACApB,EACAqB,EACI,CACJ,IAAMC,EACF,KAAK,QAAQ,SAAS,QACrB,KAAK,QAAQ,oBAAsB,OAAS,EAAI,GAE/CpB,EAAiB,KAAK,iCAC5B,OAAW,CAAE,QAASqB,EAAI,SAAAC,CAAS,IAAKJ,EAAU,MAAO,CACrD,GACI,CAACI,GACDA,EAAS,OAAS,QAClBA,EAAS,OAAS,aAElB,SAEJ,IAAMC,EACFD,EAAS,gBAAgB,KAAK,QAAQ,SAAS,MAAM,EAEnDE,EAAO,KAAK,QAAQ,KAAK,KAAMC,GAAMA,EAAE,CAAC,IAAMF,CAAW,EACzDG,EAAY,OAAOJ,EAAS,EAAM,IAClCK,EACDL,EAAS,OAAS,UACfA,EAAS,eAAiBF,GAC7B,CAACM,IACGJ,EAAS,EAAI,GAAK,KAAK,QAAQ,QAAQ,SAAW,EAE3DD,EAAG,UAAU,OAAO,oBAAqBM,CAAY,EACrDN,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAC7CA,EAAG,UAAU,OAAO,kBAAmB,EAAI,EAC3CA,EAAG,UAAU,OAAO,aAAc,EAAK,EACvCA,EAAG,UAAU,OAAO,oBAAqBK,CAAS,EAClDL,EAAG,UAAU,OACT,sBACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,KAC1C,EACAH,EAAG,UAAU,OACT,uBACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,MAC1C,EACAH,EAAG,UAAU,OACT,0BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,SAC1C,EACAH,EAAG,UAAU,OACT,2BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,UAC1C,EACAH,EAAG,UAAU,OACT,0BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,SAC1C,EACAH,EAAG,UAAU,OACT,2BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,UAC1C,EACAH,EAAG,UAAU,OACT,8BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,aAC1C,EACAH,EAAG,UAAU,OACT,+BACA,CAACF,GAAe,CAAC,CAACK,GAAQA,EAAK,CAAC,IAAM,cAC1C,EAEA,IAAMI,EAAOC,EAAa,KAAMP,CAAQ,EAClCQ,EAAaF,IAAS,WAAaA,IAAS,QAC5CG,EAAYH,IAAS,SACrBI,EAAUJ,IAAS,OACnBK,EAAcL,IAAS,WAsB7B,GApBAP,EAAG,UAAU,OAAO,kBAAmBS,CAAU,EACjDT,EAAG,UAAU,OAAO,iBAAkB,CAACS,CAAU,EACjDT,EAAG,UAAU,OACT,oBACCU,GAAaD,GAAcE,GAAWC,IACnC,CAACP,GACDJ,EAAS,kBAAoB,KAAK,QAAQ,SAAS,OAAS,CACpE,EACAD,EAAG,UAAU,OACT,oBACCU,GAAaD,GAAcE,GAAWC,IACnC,CAACP,GACDJ,EAAS,kBAAoB,KAAK,QAAQ,SAAS,MAC3D,EACAD,EAAG,UAAU,OACT,wBACAvB,EAAa,gBAAgB,EAAEwB,EAAS,QAAS,IAAM,MAC3D,EAGI,KAAK,QAAQ,QAAQ,OAAS,GAAKtB,EAAgB,CACnD,IAAMgB,EACFM,EAAS,gBAAgBA,EAAS,cAAc,OAAS,CAAC,IAC1DtB,EACJqB,EAAG,UAAU,OAAO,gBAAiBL,CAAM,CAC/C,CACJ,CACJ,CC7KA,IAAMkB,GAAoC,CACtC,KAAM,MACN,IAAK,OACL,WAAY,UACZ,UAAW,MACf,EAEMC,GAAwC,CAC1C,KAAM,MACN,IAAK,OACL,WAAY,UACZ,UAAW,MAKf,EAEA,eAAsBC,GAElBC,EACAC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOJ,EAAa,QAAQG,CAAM,EACxC,GAAI,CAACC,GAAM,cAAe,OAC1B,IAAMC,EAAcD,EAAK,cAAc,KAAK,QAAQ,SAAS,MAAM,EAC7DE,EACFJ,EAAM,SACLA,EAA6C,SAC9CA,EAAM,OACAK,GACAC,GAEJC,EAAMP,EAAM,SACZQ,EAAOJ,EAAY,KAAK,KAAM,GAAGD,CAAW,GAAII,CAAG,EACzD,MAAMR,EAAO,QAAQ,CAAE,KAAAS,CAAK,CAAC,CACjC,CAEO,SAASH,GAEZF,EACAI,EACU,CACV,IAAMC,EAAmB,CAAC,EACtBC,EAAQ,GACZ,QAAWC,KAAa,KAAK,QAAQ,KAAM,CACvC,GAAM,CAACC,EAAcC,CAAS,EAAIF,EAClC,GAAIC,IAAiBR,EAAa,CAC9BM,EAAQ,GACR,IAAMI,EAAOC,GAAY,KAAK,KAAMX,EAAaS,EAAWL,CAAG,EAC3DM,GACAL,EAAK,KAAKK,CAAI,CAEtB,MACIL,EAAK,KAAKE,CAAS,CAE3B,CAEA,OAAKD,GACDD,EAAK,KAAK,CAACL,EAAaI,EAAM,WAAa,MAAM,CAAC,EAG/CC,CACX,CAEO,SAASF,GAEZH,EACAI,EACU,CACV,OAAW,CAACI,EAAcC,CAAS,IAAK,KAAK,QAAQ,KACjD,GAAID,IAAiBR,EAAa,CAC9B,IAAMK,EAAOM,GAAY,KAAK,KAAMX,EAAaS,EAAWL,CAAG,EAC/D,OAAOC,EAAO,CAACA,CAAI,EAAI,CAAC,CAC5B,CAGJ,MAAO,CAAC,CAACL,EAAaI,EAAM,WAAa,MAAM,CAAC,CACpD,CAEO,SAASO,GAEZX,EACAY,EACAC,EACoB,CAEpB,IAAMC,EADkB,KAAK,QAAQ,SAAS,OAAS,EACvBrB,GAAqBD,GAC/CuB,EAAoCH,EACpCE,EAAMF,CAAQ,EACd,OAEN,GAAIG,EACA,MAAO,CAACf,EAAae,CAAY,CAIzC,CC1GA,eAAsBC,GAElBC,EACAC,EACa,CACb,IAAMC,EAAOF,EAAa,QAAQC,EAAM,MAAqB,EAC7D,GAAI,CAACC,GAAQA,EAAK,OAAS,aAAc,OACzC,IAAMC,EAAeF,EAAM,OAAmB,UAAU,SACpD,yBACJ,EAEIA,EAAM,UAAYE,EAClB,KAAK,MAAM,UACND,EAAK,WAAyB,OAAQE,GAAMA,IAAM,MAAS,EACvD,OAAS,CAClB,EACOH,EAAM,SACb,KAAK,MAAM,UACNC,EAAK,WAAyB,OAAQE,GAAMA,IAAM,MAAS,EACvD,OAAS,CAClB,EACOD,EACP,KAAK,MAAM,SAASD,EAAK,CAAC,EAE1B,KAAK,MAAM,OAAOA,EAAK,CAAC,EAG5B,KAAK,UAAY,MAAM,KAAK,MAAM,SAAS,EAC3C,KAAK,aAAe,MAAM,KAAK,MAAM,YAAY,EACjDF,EAAa,KAAK,CACtB,CCxBA,eAAsBK,GAElBC,EACAC,EACAC,EACa,CACb,GAAIA,EAAM,QAAU,EAChB,OAGJ,IAAIC,EAASD,EAAM,OACnB,GAAIC,GAAQ,UAAY,IAIxB,MAAOA,GAAUA,EAAO,UAAY,MAAQA,EAAO,UAAY,MAE3D,GADAA,EAASA,EAAO,cACZ,CAACA,GAAU,CAACH,EAAa,SAASG,CAAM,EACxC,OAIR,GAAKA,EAEL,IAAIA,EAAO,UAAU,SAAS,gBAAgB,EAAG,CAC7CC,GAAsB,KAAK,KAAMJ,EAAcE,CAAK,EACpD,MACJ,CAEA,GAAIC,EAAO,UAAU,SAAS,kBAAkB,EAAG,CAE/C,IAAME,EADOL,EAAa,QAAQG,CAAM,GACd,gBAAgB,KAAK,QAAQ,SAAS,MAAM,EACtE,MAAMF,EAAO,qBAAqB,GAAGI,CAAW,EAAE,CACtD,MAAWF,EAAO,UAAU,SAAS,kBAAkB,GACnDG,GAAY,KAAK,KAAMN,EAAcC,EAAQC,EAAOC,CAAM,GAElE,CAEO,SAASI,GACZP,EACAE,EACI,CACJ,GAAIA,EAAM,QAAU,EAChB,OAGJ,IAAIC,EAASD,EAAM,OACnB,KAAOC,GAAUA,EAAO,UAAY,MAAQA,EAAO,UAAY,MAE3D,GADAA,EAASA,EAAO,cACZ,CAACA,GAAU,CAACH,EAAa,SAASG,CAAM,EACxC,OAIHA,IAEDA,EAAO,UAAU,SAAS,gBAAgB,GAAKD,EAAM,QAAU,IAG/DC,EAAO,UAAU,SAAS,iBAAiB,GAC3C,CAACA,EAAO,UAAU,SAAS,mBAAmB,IAE9CD,EAAM,yBAAyB,CAEvC,CChEO,SAASM,GACZC,EACAC,EACAC,EACO,CACP,IAAMC,EAAOH,EAAM,QAAQE,CAAW,EACtC,GAAI,CAACC,EACD,MAAO,GAEX,IAAMC,EAAOH,EAAM,QAAQA,EAAM,cAAcE,EAAK,CAAE,CAAC,EACnDE,EAAyCH,EAAY,aAAe,GAClEI,EAAKL,EAAM,KAAKE,EAAK,EAAKA,EAAK,EAAE,EAAE,CAAC,EAC1C,GAAIC,IAAS,SAAWA,IAAS,UAAW,CACxC,IAAMG,EAAS,WAAWF,EAAK,QAAQ,KAAM,EAAE,CAAC,EAChD,GAAI,MAAME,CAAM,EACZ,MAAO,GAEXF,EAAOE,CACX,SAAWH,IAAS,QAAUA,IAAS,WAAY,CAC/C,IAAMG,EAAS,KAAK,MAAMF,CAAI,EAC9B,GAAI,MAAME,CAAM,EACZ,MAAO,GAEXF,EAAOE,CACX,MAAWH,IAAS,YAChBC,EAAOA,IAAS,OAAS,GAAQA,IAAS,QAAU,GAAO,MAG/D,IAAMG,EAAM,CACR,UAAWF,EACX,CAACL,EAAM,cAAcE,EAAK,CAAC,CAAC,EAAGE,CACnC,EAEA,OAAAJ,EAAM,OAAO,OAAO,CAACO,CAAG,EAAG,CAAE,QAASP,EAAM,WAAY,OAAQ,IAAK,CAAC,EAC/D,EACX,CAEO,SAASQ,GAEZT,EACAU,EACAC,EACI,CACJ,IAAMR,EAAOH,EAAM,QAAQW,EAAM,MAAqB,EACtD,GAAIR,GAAM,OAAS,QAAUA,GAAM,OAAS,gBAAiB,CACzD,IAAMS,EAAe,KAAK,aAAaT,EAAK,CAAC,EACvCU,EAAUC,EAAa,KAAMX,CAAI,IAAM,UACvCY,EAAWJ,EAAM,OAAmB,UAAU,SAChD,UACJ,EAEIC,GAAgBC,GAAW,CAACE,GAC5BhB,GAAWC,EAAO,KAAMW,EAAM,MAAqB,CAE3D,CACJ,CCvDO,SAASK,GAEZC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAoBD,EAAoB,IAAID,CAAY,EACxDG,EAAOH,EAAa,YAAY,EAEtC,GAAIE,EAAmB,CACnB,OAAW,CAAE,QAASE,EAAI,SAAAC,CAAS,IAAKN,EACpC,GACIM,EAAS,OAAS,QAClBA,EAAS,IAAMH,EAAkB,GACjCG,EAAS,IAAMH,EAAkB,EACnC,CACMC,EAAK,gBAAkBC,GACvBA,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,EAEpC,MACJ,CAKA,SAAS,gBAAkB,SAAS,MACpCJ,EAAa,SAASG,EAAK,aAAa,GAEvCA,EAAK,cAA8B,KAAK,CAEjD,CACJ,CASO,SAASG,GACZN,EACAC,EACO,CACP,IAAMC,EAAoBD,EAAoB,IAAID,CAAY,EAC9D,GAAI,CAACE,EACD,MAAO,GAGX,IAAMC,EAAOH,EAAa,YAAY,EAChCO,EAAQP,EAAa,SAAS,CAAC,GAAG,SAAS,CAAC,EAElD,GAAIO,EACA,QAAWC,KAAMD,EAAM,SACnB,QAAWE,KAAQD,EAAG,SAAU,CAC5B,IAAMH,EAAWL,EAAa,QAAQS,CAAmB,EACzD,GACIJ,GAAU,OAAS,QACnBA,EAAS,IAAMH,EAAkB,GACjCG,EAAS,IAAMH,EAAkB,EAEjC,OAAIC,EAAK,gBAAkBM,GACtBA,EAAqB,MAAM,CAAE,cAAe,EAAK,CAAC,EAEhD,EAEf,CAKR,OACI,SAAS,gBAAkB,SAAS,MACpCT,EAAa,SAASG,EAAK,aAAa,GAEvCA,EAAK,cAA8B,KAAK,EAGtC,EACX,CCxEA,SAASO,GACLC,EAC+B,CAC/B,IAAIC,EACJ,OAAO,kBAEAC,EACmB,CACtB,GAAID,EAAa,CACb,MAAMA,EACN,MACJ,CAEA,IAAIE,EACJF,EAAc,IAAI,QAASG,GAAOD,EAAUC,CAAE,EAC9C,IAAMC,EAAS,MAAML,EAAK,MAAM,KAAME,CAAI,EAC1C,OAAAD,EAAc,OACdE,EAAS,EACFE,CACX,CACJ,CAOA,SAASC,IAA6C,CAClD,GAAI,KAAK,kBAAmB,CACxB,IAAMC,EAAU,KAAK,YAAY,EAC5B,aAAa,GACZ,WAAW,CAAC,EAClB,GAAI,CAACA,EAAQ,MAAO,GACpB,IAAMC,EAAQD,EAAO,WAAW,EAChC,OAAAC,EAAM,mBAAmB,IAAI,EAC7BA,EAAM,OAAOD,EAAO,aAAcA,EAAO,SAAS,EAC3CC,EAAM,SAAS,EAAE,MAC5B,KACI,QAAO,KAAK,gBAAkB,CAEtC,CAEA,IAAMC,EAAgBV,GAAK,eAEvBW,EACAC,EACAC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOL,EAAM,QAAQE,CAAW,EACtC,GAAI,CAACG,GAAQA,EAAK,OAAS,OAAQ,OACnC,IAAMC,EAAc,KAAK,cAAc,OACjCC,EAAW,KAAK,UAChBC,EAAoBP,EAAsB,IAAID,CAAK,EACzD,GAAI,CAACQ,EACD,OAGAH,EAAK,EAAIF,EAAKG,GAAe,GAAKD,EAAK,EAAIF,IAC3CK,EAAkB,EAAIH,EAAK,EAAIF,GAG/BE,EAAK,EAAID,EAAKG,GAAY,GAAKF,EAAK,EAAID,IACxCI,EAAkB,EAAIH,EAAK,EAAID,GAGnC,IAAMK,EAAO,KAAK,IAAIJ,EAAK,GAAK,GAAI,CAAC,EAC/BK,EAAO,KAAK,IAAIL,EAAK,GAAK,GAAIC,CAAW,EACzCK,EAAO,KAAK,IAAIN,EAAK,GAAK,EAAG,CAAC,EAC9BO,EAAO,KAAK,IAAIP,EAAK,GAAK,GAAIE,CAAQ,EACxCb,EAAIW,EAAK,GAAKF,EACdU,EAAIR,EAAK,GAAKD,EAClB,KACI,CAACU,GAAkBd,EAAOC,CAAqB,GAC/CP,GAAKe,GACLf,EAAIgB,GACJG,GAAKF,GACLE,EAAID,GAEJ,MAAMZ,EAAM,aAAaN,EAAGmB,CAAC,EAC7BZ,EAAsB,IAAID,EAAOQ,CAAiB,EAClDd,GAAKS,EACLU,GAAKT,CAEb,CAAC,EAED,SAASW,GACLC,EACAhB,EACAiB,EACO,CACP,IAAMZ,EAAOL,EAAM,QAAQiB,CAAM,EACjC,OAAOZ,GAAM,OAAS,QAAUA,EAAK,IAAMW,EAAM,UAAY,CACjE,CAEO,SAASE,GAEZlB,EACAmB,EACAlB,EACAmB,EACI,CACJ,IAAMH,EAAUjB,EAAM,YAAY,EAC7B,cAEL,OADCoB,EAAM,OAAuB,UAAU,OAAO,WAAW,EAClDA,EAAM,IAAK,CACf,IAAK,QACDA,EAAM,eAAe,EACjBL,GAAW,KAAMf,EAAOiB,CAAM,GAC9BA,EAAO,KAAK,EACZhB,EAAsB,OAAOD,CAAK,GAC3BoB,EAAM,SACbrB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,EACA,EACJ,EAEAlB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,EACA,CACJ,EAEJ,MACJ,IAAK,YACGrB,GAAO,KAAKqB,CAAgC,IAAM,IAClDG,EAAM,eAAe,EACrBrB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,GACA,CACJ,GAEJ,MACJ,IAAK,UACDG,EAAM,eAAe,EACrBrB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,EACA,EACJ,EACA,MACJ,IAAK,aAEGrB,GAAO,KAAKqB,CAAgC,KAC3CA,EAAO,aAAa,QAAU,KAE/BG,EAAM,eAAe,EACrBrB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,EACA,CACJ,GAEJ,MACJ,IAAK,YACDG,EAAM,eAAe,EACrBrB,EAAc,KACV,KACAC,EACAC,EACAgB,EACA,EACA,CACJ,EACA,MACJ,QACJ,CACJ,CC5LO,SAASI,EAEZC,EACAC,EAAmB,GACZ,CACP,IAAMC,EACF,KAAK,QAAQ,SAAS,SAAW,GACjC,KAAK,QAAQ,SAAS,SAAW,EAC/BC,EAAaH,EAAO,aAAa,YAAY,EAC7CI,EAASJ,EAAO,SAAS,CAAC,EAG1BK,EAAWJ,GAAcG,GAAQ,aAAe,OACtD,OAAOF,GAAc,CAACC,GAAcE,CACxC,CAEO,SAASC,GAEZC,EACAP,EACAQ,EACAC,EACI,CACJ,GAAI,KAAK,aAAe,OAAQ,CAC5B,GAAI,CAACV,EAAY,KAAK,KAAMC,CAAM,EAC9B,OAGSM,GAAgB,KACzB,KACAC,EACAP,EACAQ,EACAC,CACJ,CACJ,MACI,QAAQ,MACJ,QAAQ,KAAK,UAAU,0CAC3B,CAER,CAEO,SAASC,GAEZH,EACAP,EACAS,EACI,CACJ,GAAI,KAAK,aAAe,OAAQ,CAC5B,GAAI,CAACV,EAAY,KAAK,KAAMC,CAAM,EAC9B,OAGOU,GAAc,KAAK,KAAMH,EAAOP,EAAQS,CAAK,CAC5D,MAAW,KAAK,aAAe,aAEpB,KAAK,aAAe,iBAEpB,KAAK,aAAe,cAEpB,KAAK,aAAe,iBAG3B,QAAQ,MACJ,QAAQ,KAAK,UAAU,wCAC3B,CAER,CCpEO,SAASE,GAEZC,EACAC,EACAC,EACAC,EACI,CACJ,GAAIC,EAAY,KAAK,KAAMH,CAAM,GAAKC,EAAsB,IAAIF,CAAK,EAAG,CACpE,IAAMK,EAASF,EAAM,OACrBE,EAAO,UAAU,OAAO,WAAW,EACnC,IAAMC,EAAmBJ,EAAsB,IAAIF,CAAK,EACxDE,EAAsB,OAAOF,CAAK,EAC9BM,EAAiB,UAAYD,EAAO,cAC/BE,GAAWP,EAAO,KAAMK,CAAM,IAC/BA,EAAO,YAAcC,EAAiB,SAAW,GACjDD,EAAO,UAAU,IAAI,WAAW,EAChCA,EAAO,MAAM,GAGzB,CACJ,CAEO,SAASG,GAEZR,EACAS,EACAP,EACAC,EACI,CACJ,IAAME,EAASF,EAAM,OACfO,EAAOV,EAAM,QAAQK,CAAM,EACjC,GAAIK,GAAM,OAAS,OAAQ,CACvB,IAAMC,EAA8B,CAChC,EAAGD,EAAK,EACR,EAAGA,EAAK,EACR,QAASL,EAAO,aAAe,MACnC,EACAH,EAAsB,IAAIF,EAAOW,CAAS,CAC9C,CACJ,CCrCA,eAAOC,EACH,CAAE,MAAAC,EAAO,QAAAC,CAAQ,EACjBC,EACAC,EACyB,CACzB,IAAMC,EAAWH,EAAQ,SACnBI,EAAWJ,EAAQ,SACnBK,EAAYJ,GAAW,EAAIA,EAAU,EACrCK,EAAUD,EAAY,EACtBE,EAAK,MAAMR,EAAM,QAAQ,CAAE,UAAAM,EAAW,QAAAC,CAAQ,CAAC,EAE/CE,EADYD,EAAE,IAAKE,GAAMA,EAAE,YAAY,EACV,CAAC,GAAK,CAAC,EACpCC,EAAcP,EACf,IAAI,CAACQ,EAAOC,IAA8B,CACvC,IAAMC,EAAcL,EAAgBI,CAAK,EACzC,OAAOC,EAAc,CAACF,EAAO,KAAME,CAAW,EAAI,MACtD,CAAC,EACA,OAAQJ,GAAmBA,IAAM,MAAS,EAEzCK,EAAeX,EAAS,OAAS,EAAID,EAAU,EAAIA,EACnDa,EAAe,OAAO,KAAKR,EAAE,CAAC,CAAC,EAAEO,CAAY,EAC7CE,EAA2B,CAC7B,IAAKT,EAAE,CAAC,EACR,aAAc,CAAC,EACf,OAAQ,CAAE,OAAQ,CAAC,CAAE,CACzB,EAEIU,EAA2B,CAAC,EAChC,GAAIF,EAAc,CACd,IAAMG,EAAkBH,EAAa,MAAM,GAAG,EAC9CC,EAAO,aAAe,CAACE,EAAgBd,EAAS,MAAM,CAAC,EACvDa,EAAiBb,EACZ,IAAI,CAACO,EAAOC,IAA8B,CACvC,IAAMC,EAAcK,EAAgBN,CAAK,EACzC,OAAOC,EAAc,CAACF,EAAO,KAAME,CAAW,EAAI,MACtD,CAAC,EACA,OAAQJ,GAAmBA,IAAM,MAAS,EAC1C,OAAO,CAAC,CAAC,CAAE,CAAEU,CAAK,IAAMA,IAAU,cAAc,CACzD,CAEA,IAAMC,EAASpB,EAAQ,OAAO,OAAOU,CAAW,EAAE,OAAOO,CAAc,EACvE,OAAAD,EAAO,OAAS,CAAE,OAAAI,CAAO,EAClBJ,CACX,CC7CA,eAAsBK,GAElBC,EACAC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOJ,EAAa,QAAQG,EAAM,MAAqB,EAC7D,GAAKF,EAAO,aAAa,YAAY,GACjC,CAAAE,EAAM,SACN,CAAAA,EAAM,UACNA,EAAM,SAAW,IAIrBA,EAAM,yBAAyB,EAE3B,EAACC,IAIAA,EAAK,OAAS,QAAUA,EAAK,OAAS,eAAiBA,EAAK,GAAK,GAAG,CACrE,IAAMC,EAAK,KAAK,OAAOD,EAAK,EAAIA,EAAK,EAAE,EACjCE,EAAWJ,EAAkB,IAAIF,CAAY,EAC7CO,EACF,CAAC,CAACD,GACFA,EAAS,OAAgB,CAACE,EAAKC,EAAGC,IAAMF,GAAOC,IAAMJ,EAAGK,CAAC,EAAG,EAAI,EAE9DC,EACF,CAAC,CAACL,GAAYD,EAAG,SAAWC,EAAS,QAAUC,EAE7C,CAAE,IAAAK,EAAK,aAAAC,EAAc,OAAAC,CAAO,EAAI,MAAMC,EACxC,KACAX,EAAK,EACLA,EAAK,OAAS,OAASA,EAAK,EAAI,CACpC,EAEIY,EACAL,GACAT,EAAkB,OAAOF,CAAY,EACrCgB,EAAS,IAAIC,EACT,GACAL,EACA,CAAC,EACD,CAAC,EACD,CAAC,CAAE,OAAQ,gBAAgB,KAAK,QAAQ,MAAM,CAAE,CAAC,CACrD,IAEAV,EAAkB,IAAIF,EAAcK,CAAE,EACtCW,EAAS,IAAIC,EACT,GACAL,EACAC,EACA,CAAC,EACD,CAACC,CAAM,CACX,GAGJ,MAAMd,EAAa,KAAK,CAAE,eAAgB,EAAK,CAAC,EAChDG,EAAM,QAAU,GAChBF,EAAO,cACH,IAAI,YAAqC,qBAAsB,CAC3D,QAAS,GACT,SAAU,GACV,OAAAe,CACJ,CAAC,CACL,CACJ,CACJ,CC1EA,eAAsBE,GAClBC,EACAC,EACAC,EACa,CACbA,EAAkB,OAAOF,CAAY,EACrC,QAAWG,KAAMH,EAAa,iBAAiB,OAAO,EAClDG,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAC7CA,EAAG,UAAU,OAAO,sBAAuB,EAAK,CAExD,CCPA,eAAsBC,GAElBC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOH,EAAM,QAAQE,EAAM,MAAqB,EACtD,GAAI,CAACC,GAAQA,EAAK,OAAS,OAAQ,OACnC,GAAM,CAAE,EAAAC,EAAG,EAAAC,CAAE,EAAIF,EACX,CAAE,IAAAG,EAAK,aAAAC,EAAc,OAAAC,CAAO,EAAI,MAAMC,EAAc,KAAMJ,EAAGD,CAAC,EACpEH,EAAO,cACH,IAAI,YAAoC,oBAAqB,CACzD,QAAS,GACT,SAAU,GACV,OAAQ,CACJ,IAAAK,EACA,aAAAC,EACA,OAAAC,CACJ,CACJ,CAAC,CACL,CACJ,CCrBA,IAAME,GAA4B,sBAOrBC,GAAwB,CACjCC,EACAC,EACA,CACI,UAAAC,EAAYJ,GACZ,SAAAK,EAAW,CAAC,CAChB,EAAkC,CAAC,KAEnCH,EAAS,MAAO,iBAAmB,CAC/B,eAAgBG,EAChB,MAAO,EACX,EAEAF,EAAM,iBACF,YACAG,GAAqBJ,EAAUC,EAAOC,CAAS,CACnD,EAEAD,EAAM,iBACF,YACAI,GAAqBL,EAAUC,EAAOC,CAAS,CACnD,EAEAD,EAAM,iBACF,UACAK,GAAmBN,EAAUC,EAAOC,CAAS,CACjD,EAEAD,EAAM,iBAAiB,IACnBM,EAAyBP,EAAUC,EAAOC,CAAS,CACvD,EAEOD,GAGLG,GACF,CACIJ,EACAC,EACAC,IAEHM,GAAuB,CACpB,IAAMC,EAAaD,EACnB,GACIC,EAAW,SAAW,IACrBT,EAAS,MAAO,aAAe,iBAC5BA,EAAS,MAAO,aAAe,cAC/BA,EAAS,MAAO,aAAe,iBACrC,CACEA,EAAS,MAAO,iBAAiB,8BAAgC,CAAC,EAClE,IAAMU,EAAOT,EAAM,QAAQQ,EAAW,MAAqB,EAC3D,GACIC,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACEV,EAAS,MAAO,iBAAiB,8BAC7B,CACI,EAAGU,EAAK,EACR,EAAGA,EAAK,CACZ,EAEJV,EAAS,MAAO,iBAAiB,mBAC7BA,EAAS,MAAO,iBAAiB,eACrCA,EAAS,MAAO,iBAAiB,eAAiB,CAAC,EAEnD,IAAMW,EAAuB,CACzB,GAAID,EAAK,EACT,GAAIA,EAAK,EACT,GAAIA,EAAK,EACT,GAAIA,EAAK,CACb,EACAV,EAAS,MAAO,iBAAiB,oBAAsBW,EACvDJ,EACIP,EACAC,EACAC,EACAF,EAAS,MAAO,iBAAiB,eAAe,OAAO,CACnDW,CACJ,CAAC,CACL,EAEA,MACJ,CACJ,CAEAX,EAAS,MAAO,iBAAiB,eAAiB,CAAC,CACvD,EAEEK,GACF,CACIL,EACAC,EACAC,IAEHM,GAAuB,CACpB,IAAMC,EAAaD,EACnB,IACIR,EAAS,MAAO,aAAe,iBAC/BA,EAAS,MAAO,aAAe,cAC/BA,EAAS,MAAO,aAAe,kBAG3BA,EAAS,MAAO,iBACX,+BACLA,EAAS,MAAO,iBAAiB,8BAC5B,IAAM,OACb,CACE,IAAMU,EAAOT,EAAM,QAAQQ,EAAW,MAAqB,EAC3D,GACIC,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACE,IAAME,EAAoC,CACtC,GAAI,KAAK,IACLF,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,CACJ,EAEAA,EAAS,MAAO,iBAAiB,oBAC7BY,EAEJL,EACIP,EACAC,EACAC,EACAF,EAAS,MAAO,iBAAiB,eAAe,OAAO,CACnDY,CACJ,CAAC,CACL,CACJ,CACJ,CAER,EAEEN,GACF,CACIN,EACAC,EACAC,IAEHM,GAAuB,CACpB,IAAMC,EAAaD,EACnB,GACIR,EAAS,MAAO,aAAe,iBAC/BA,EAAS,MAAO,aAAe,cAC/BA,EAAS,MAAO,aAAe,gBACjC,CACE,IAAMU,EAAOT,EAAM,QAAQQ,EAAW,MAAqB,EAC3D,GAAI,CAACC,EAAM,OAEX,IACKV,EAAS,MAAO,iBAAiB,oBAAoB,QAClD,GAAK,EACX,CACE,IAAMG,EACFH,EAAS,MAAO,iBAAiB,mBAAoB,CAAC,EAC1D,GACIG,EAAS,KAAOA,EAAS,IACzBA,EAAS,KAAOA,EAAS,IACzBO,GAAM,OAAS,QACfP,EAAS,KAAOO,EAAK,GACrBP,EAAS,KAAOO,EAAK,EACvB,CACEV,EAAS,MAAO,iBAAiB,eAAiB,CAAC,EACnDA,EAAS,MAAO,iBAAiB,mBAAqB,CAAC,EACvDA,EAAS,MAAO,iBAAiB,8BAC7B,CAAC,EACLA,EAAS,MAAO,iBAAiB,oBAC7B,OACJO,EAAyBP,EAAUC,EAAOC,EAAW,CAAC,CAAC,EACvD,MACJ,CACJ,CAIA,GAFAF,EAAS,MAAO,iBAAiB,mBAAqB,CAAC,EAGnDA,EAAS,MAAO,iBACX,+BACLA,EAAS,MAAO,iBAAiB,8BAC5B,IAAM,QACXU,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACE,IAAMG,EAA2B,CAC7B,GAAI,KAAK,IACLH,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLU,EAAK,EACLV,EAAS,MAAO,iBACX,8BAA8B,CACvC,CACJ,EACAA,EAAS,MAAO,iBAAiB,eAAe,KAAKa,CAAS,EAC9DN,EAAyBP,EAAUC,EAAOC,CAAS,CACvD,CAEAF,EAAS,MAAO,iBAAiB,8BAAgC,CAAC,EAClEA,EAAS,MAAO,iBAAiB,oBAAsB,MAC3D,CACJ,EAEJ,SAASc,GACLC,EACAf,EACA,CAAE,GAAAgB,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,EACb,CACJ,IAAMC,EAAuB,CAAC,EACxBC,EAAOrB,EAAS,MAAO,WAEzBgB,IAAO,QACP,CAAC,gBAAiB,eAAe,EAAE,QAAQK,CAAI,EAAI,KAEnDD,EAAS,UAAYJ,GAIrBC,IAAO,QACP,CAAC,gBAAiB,eAAe,EAAE,QAAQI,CAAI,EAAI,KAEnDD,EAAS,QAAUH,EAAK,GAIxBC,IAAO,QACP,CAAC,aAAc,eAAe,EAAE,QAAQG,CAAI,EAAI,KAEhDD,EAAS,UAAYF,GAIrBC,IAAO,QACP,CAAC,aAAc,eAAe,EAAE,QAAQE,CAAI,EAAI,KAEhDD,EAAS,QAAUD,EAAK,GAG5BJ,EAAO,aAAaK,CAAQ,CAChC,CAEO,IAAMb,EAA2B,CACpCP,EACAC,EACAC,EACAC,IACO,CACP,GACIH,EAAS,MAAO,aAAe,iBAC/BA,EAAS,MAAO,aAAe,cAC/BA,EAAS,MAAO,aAAe,gBACjC,CACEG,EAAWH,EAAS,MAAO,iBAAiB,eAAe,MAAM,CAAC,EAC9DA,EAAS,MAAO,iBAAiB,qBACjCG,EAAS,KAAKH,EAAS,MAAO,iBAAiB,mBAAmB,EAGtE,IAAMsB,EAAMrB,EAAM,iBAAiB,UAAU,EAE7C,GAAIE,EAAS,OAAS,EAClBW,GACId,EAAS,cACTA,EACAG,EAAS,CAAC,CACd,EACAoB,GAAwBvB,EAAUC,EAAOE,EAAUD,CAAS,MACzD,CACFF,EAAS,cAAsB,aAAa,EAC7C,QAAWwB,KAAMF,EACbE,EAAG,UAAU,OAAOtB,CAAS,CAErC,CACJ,SAAWF,EAAS,MAAO,iBAAiB,MAAO,CAC/CA,EAAS,MAAO,iBAAiB,MAAQ,GACzC,IAAMsB,EAAMrB,EAAM,iBAAiB,UAAU,EAC7C,QAAWuB,KAAMF,EACbE,EAAG,UAAU,OAAOtB,CAAS,CAErC,CACJ,EAEMqB,GAA0B,CAC5BvB,EACAC,EACAE,EACAD,IACO,CACP,GAAIF,EAAS,MAAO,aAAe,iBAAmBG,EAAS,OAAS,EAAG,CACvE,IAAMmB,EAAMrB,EAAM,iBAAiB,UAAU,EAE7C,QAAWuB,KAAMF,EAAK,CAClB,IAAMZ,EAAOT,EAAM,QAAQuB,CAAiB,EAC5C,GAAI,CAACd,GAAQA,EAAK,OAAS,OAAQ,SACnC,IAAIe,EAAW,GACf,OAAW,CAAE,GAAAT,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,IAAKhB,EAEzBa,IAAO,QACPE,IAAO,QACPD,IAAO,QACPE,IAAO,QAGHH,GAAMN,EAAK,GACXA,EAAK,GAAKO,GACVC,GAAMR,EAAK,GACXA,EAAK,GAAKS,IAEVM,EAAW,GACXzB,EAAS,MAAO,iBAAiB,MAAQ,GACzCwB,EAAG,UAAU,IAAItB,CAAS,GAKjCuB,GACDD,EAAG,UAAU,OAAOtB,CAAS,CAErC,CACJ,SACIF,EAAS,MAAO,aAAe,cAC/BG,EAAS,OAAS,EACpB,CACE,IAAMmB,EAAMrB,EAAM,iBAAiB,UAAU,EAE7C,QAAWuB,KAAMF,EAAK,CAClB,IAAMZ,EAAOT,EAAM,QAAQuB,CAAiB,EAC5C,GAAI,CAACd,EAAM,SACX,IAAIe,EAAW,GACf,OAAW,CAAE,GAAAT,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,IAAKhB,EAEzBa,IAAO,QACPE,IAAO,QACPD,IAAO,QACPE,IAAO,QACPT,GAAM,OAAS,QAEXQ,GAAMR,EAAK,GAAKA,EAAK,GAAKS,IAC1BnB,EAAS,MAAO,iBAAiB,MAAQ,GACzCyB,EAAW,GACXD,EAAG,UAAU,IAAItB,CAAS,GAKjCuB,GACDD,EAAG,UAAU,OAAOtB,CAAS,CAErC,CACJ,SACIF,EAAS,MAAO,aAAe,iBAC/BG,EAAS,OAAS,EACpB,CACE,IAAMmB,EAAMrB,EAAM,iBAAiB,UAAU,EAE7C,QAAWuB,KAAMF,EAAK,CAClB,IAAMZ,EAAOT,EAAM,QAAQuB,CAAiB,EAC5C,GAAI,CAACd,EAAM,SACX,IAAIe,EAAW,GACf,OAAW,CAAE,GAAAT,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,IAAKhB,EAEzBa,IAAO,QACPE,IAAO,QACPD,IAAO,QACPE,IAAO,QACPT,GAAM,OAAS,QAEXM,GAAMN,EAAK,GAAKA,EAAK,GAAKO,IAC1BjB,EAAS,MAAO,iBAAiB,MAAQ,GACzCyB,EAAW,GACXD,EAAG,UAAU,IAAItB,CAAS,GAKjCuB,GACDD,EAAG,UAAU,OAAOtB,CAAS,CAErC,CACJ,CACJ,ECjaO,SAASwB,GAEZC,EACAC,EACAC,EACI,CACJ,GAAIF,EAAW,SAAW,EAAG,OAG7B,IAAMG,EAAiB,KAAK,iCACtBC,EAAMJ,EAAW,OACjBK,EAAgBH,EAAO,aAAa,UAAU,EAqBpD,GAlBIE,GAAO,EACPJ,EAAW,CAAC,GAAG,IAAI,gBAAgB,IAAI,EAEvCA,EAAW,QAAQ,CAAC,CAAE,IAAAM,CAAI,EAAGC,IAAM,CAC/B,IAAMC,EAASH,EAAgB,EAAI,EAC7BI,EACFF,IAAMH,GAAOI,EAAS,GAChB,oBACAD,IAAMH,EAAMI,EACV,0BACA,KACZC,EAAKH,EAAI,aAAa,KAAMG,CAAE,EAAIH,EAAI,gBAAgB,IAAI,CAC9D,CAAC,EAGLJ,EAAO,UAAU,OAAO,gBAAiB,CAAC,CAACC,CAAc,EAGrDE,GAAiBD,GAAO,EAAG,CAC3B,IAAMM,EAAYV,EAAWI,EAAM,CAAC,EAC9BO,EAAcX,EAAWI,EAAM,CAAC,EAEtC,GAAIM,GAAaC,EAAa,CAE1BX,EAAW,MAAM,EAAGI,EAAM,CAAC,EAAE,QAAQ,CAAC,CAAE,MAAAQ,CAAM,IAAM,CAChDA,EAAM,QAAQ,CAAC,CAAE,QAAAC,CAAQ,IAAM,CAC3BA,EAAQ,UAAU,OAAO,gBAAiB,EAAK,CACnD,CAAC,CACL,CAAC,EAED,QAASN,EAAI,EAAGA,EAAIG,EAAU,MAAM,OAAQH,IAAK,CAC7C,IAAMO,EAAQJ,EAAU,MAAMH,CAAC,GAAG,QAC5BQ,EAAUJ,EAAY,MAAMJ,CAAC,GAAG,QACtC,GAAI,CAACO,GAAS,CAACC,EAAS,SAExB,IAAMC,EAAOF,EAAM,cAAgBX,EACnCW,EAAM,UAAU,OAAO,gBAAiBE,CAAI,EAC5CD,EAAQ,UAAU,OAAO,gBAAiBC,CAAI,CAClD,CACJ,CACJ,CAGA,IAAMC,EAAkB,KAAK,QAAQ,SAAS,OAC9C,GAAIA,EAAkBjB,EAAW,OAAQ,CACrC,IAAMkB,EAAalB,EAAWiB,CAAe,EACzCC,GACA,KAAK,sBAAsBA,EAAYjB,EAAc,EAAK,CAElE,CAEA,IAAMkB,EAAmB,KAAK,QAAQ,SAAS,OAAS,EACxD,GAAIA,EAAmBnB,EAAW,OAAQ,CACtC,IAAMoB,EAAcpB,EAAWmB,CAAgB,EAC3CC,GACA,KAAK,sBAAsBA,EAAanB,EAAc,EAAI,CAElE,CACJ,CCzEO,SAASoB,GAEZC,EACAC,EACI,CACJ,IAAMC,EAAe,KAAK,QAAQ,SAAS,OACrCC,EAAiB,CAAC,EACpBC,EAAS,IAAI,IAEjB,QAASC,EAAI,EAAGA,EAAIL,EAAW,OAAQK,IAAK,CACxC,GAAM,CAAE,IAAAC,EAAK,MAAAC,CAAM,EAAIP,EAAWK,CAAC,EAC7BG,EAAO,IAAI,IAEjB,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACnC,GAAM,CAAE,QAASC,EAAI,SAAAC,CAAS,EAAIJ,EAAME,CAAC,EACzC,GAAI,CAACE,EAAU,SAEfD,EAAG,MAAM,gBAAkB,GAE3B,IAAME,EACDD,EAAS,OAAS,UACfT,EAAe,GACfS,EAAS,eAAiBT,GAC7BS,EAAS,OAAS,iBAAmBA,EAAS,GAAK,EAExDD,EAAG,UAAU,OAAO,kBAAmB,EAAK,EAC5CA,EAAG,UAAU,OAAO,iBAAkB,EAAK,EAC3CA,EAAG,UAAU,OAAO,mBAAoB,EAAI,EAC5CA,EAAG,UAAU,OAAO,kBAAmB,EAAK,EAC5CA,EAAG,UAAU,OAAO,oBAAqBE,CAAY,EACrDF,EAAG,UAAU,OACT,0BACAC,EAAS,OAAS,QACtB,EAEAD,EAAG,UAAU,OAAO,qBAAsB,EAAK,EAC/CA,EAAG,UAAU,OAAO,sBAAuB,EAAK,EAChDA,EAAG,UAAU,OAAO,uBAAwB,EAAK,EACjDA,EAAG,UAAU,OAAO,0BAA2B,EAAK,EACpDA,EAAG,UAAU,OAAO,2BAA4B,EAAK,EACrDA,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAG7C,IAAIG,EAAKJ,EACT,KAAON,EAAEE,CAAC,GAAKF,EAAEE,CAAC,EAAEQ,CAAE,EAAG,EAAEA,EAAG,CAC9BL,EAAK,IAAIK,CAAE,EAEX,IAAMC,EAAOJ,EACb,QAASK,EAAKF,EAAIE,EAAKF,EAAKC,EAAK,QAAS,EAAEC,EACxC,QAASC,EAAKX,EAAGW,EAAKX,EAAIS,EAAK,QAAS,EAAEE,EACjCb,EAAEa,CAAE,IAAGb,EAAEa,CAAE,EAAI,CAAC,GACrBb,EAAEa,CAAE,EAAED,CAAE,EAAI,GAIpBD,EAAK,UAAU,OAAO,aAAcT,IAAM,GAAK,CAACD,EAAO,IAAIS,CAAE,CAAC,CAClE,CAEAT,EAASI,CACb,CACJ,CCjEO,SAASS,GAEZC,EACAC,EACA,CAAC,CAAE,CAAE,CAAE,CAAE,CAAEC,EAAOC,CAAK,EACvB,CAAC,CAAE,CAAE,CAAE,CAAE,CAAEC,EAAOC,CAAK,EACvBC,EACI,CACJ,IAAMC,EAAK,KAAK,OAAOP,EAAS,IAAM,CAAC,GAAG,KAAK,GAAG,EAC5CQ,GACFF,GACON,EAAS,eAAiB,CAAC,GAAG,MAAM,EAAG,EAAE,EACzCA,EAAS,eAAiB,CAAC,GACpC,KAAK,GAAG,EAEV,GACI,KAAK,sBAAsB,IAAIQ,CAAa,GAC5C,KAAK,kBAAkB,IAAID,CAAE,EAC/B,CACE,IAAME,EAAU,KAAK,kBAAkB,IAAIF,CAAE,EACvCG,EAAU,KAAK,qBAAqB,IAAIF,CAAa,EACtD,KAAK,iBAGNE,IAAY,QACZD,IAAY,QACX,KAAK,YAAYC,CAAO,IAAID,CAAO,IAChC,QACH,KAAK,UAAWC,CAAO,EAAGD,CAAO,GAC5BT,EAAS,MAAQ,IAEvBC,EAAG,MAAM,YAAY,kCAAmCG,CAAK,EAC7DH,EAAG,MAAM,YAAY,gCAAiCI,CAAK,EACvDJ,EAAG,MAAM,gBAAkB,YAC3BA,EAAG,MAAM,UAAY,yBAErBA,EAAG,MAAM,UAAY,yBAGzBS,IAAY,QACZD,IAAY,QACX,KAAK,YAAYC,CAAO,IAAID,CAAO,IAChC,QACH,KAAK,UAAWC,CAAO,EAAGD,CAAO,GAC5BT,EAAS,MAAQ,IAEvBC,EAAG,MAAM,YAAY,kCAAmCC,CAAK,EAC7DD,EAAG,MAAM,YAAY,gCAAiCE,CAAK,EACvDF,EAAG,MAAM,gBAAkB,YAC3BA,EAAG,MAAM,UAAY,yBAErBA,EAAG,MAAM,UAAY,yBAElBQ,IAAYT,EAAS,KAC5BC,EAAG,MAAM,UAAY,IAhCrBA,EAAG,MAAM,UAAY,EAkC7B,MACIA,EAAG,MAAM,UAAY,EAE7B,CCrCO,SAASU,GAEZC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,GAAeF,EAAS,MAAQ,GAAK,EACrCG,GAAeH,EAAS,MAAQ,GAAK,EAEvCI,EACAN,GAAQ,eAAiB,OACzBM,EAAeN,EAAO,aAEtBM,EAAe,KAAK,cAGxB,IAAIC,EACAP,GAAQ,eAAiB,OACzBO,EAAeP,EAAO,aAEtBO,EAAe,KAAK,cAGxB,IAAMC,EAAwBJ,EACxBE,EACAD,EACEE,EACA,CACI,GACA,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,GACA,GACA,EACJ,EAER,CACI,GAAM,CAACE,EAAKC,EAAG,EAAG,CAAC,EAAIF,EAGvB,GADAP,EAAG,MAAM,SAAW,GAChBC,EAAS,8BACTD,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,gBAAkB,WACpBD,GAAQ,iBAAmB,QAClCC,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,gBAAkBQ,UACpBT,GAAQ,iBAAmB,WAAY,CAC9C,IAAMW,EAAI,KAAK,IACX,EACA,KAAK,IACD,EACA,KAAK,KAAKT,EAAS,MAAQ,IAAMF,EAAO,aAAe,EAAE,CAC7D,CACJ,EACMY,EAAS,KAAK,mBACdC,EAAaC,EACfC,EAAU,CAACL,EAAG,EAAG,EAAGC,CAAC,EAAGC,CAAM,CAClC,EAEAX,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,MAAQY,EACjBZ,EAAG,MAAM,gBAAkB,QAAQS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAIC,CAAC,GACvD,MAAWX,GAAQ,iBAAmB,SAClCgB,GAAiB,KACb,KACAd,EACAD,EACAK,EACAC,EACAJ,CACJ,EACAF,EAAG,MAAM,gBAAkB,KAE3BD,GAAQ,iBAAmB,YAC1BA,GAAQ,eAETC,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,gBAAkB,GAKnC,CAEA,IAAMgB,EACEjB,GAAQ,eAAiB,OAClBI,EACDJ,EAAO,aACPK,EACEL,EAAO,aACP,CACI,GACA,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,GACA,GACA,EACJ,EAEDI,EACD,KAAK,cACLC,EACE,KAAK,cACL,CACI,GACA,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,KAAK,mBAAmB,CAAC,EACzB,GACA,GACA,EACJ,EAIV,CAACI,EAAK,CAAE,CAAE,CAAES,CAAO,EAAID,EAE7B,GAAIf,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,WACVD,GAAQ,iBAAmB,WAClC,GAAIA,GAAQ,iBAAmB,QAAS,CACpC,IAAMY,EAAS,KAAK,mBACdC,EAAaC,EACfC,EAAU,CAACP,EAAS,CAAC,EAAGA,EAAS,CAAC,EAAGA,EAAS,CAAC,EAAG,CAAC,EAAGI,CAAM,CAChE,EACAX,EAAG,MAAM,MAAQY,CACrB,MAAWb,GAAQ,iBAAmB,aAGlCC,EAAG,MAAM,MAAQ,SAEdD,GAAQ,iBAAmB,OAClCC,EAAG,MAAM,MAAQ,GACjBA,EAAG,MAAM,SAAW,WAEhBiB,IAAY,IACZjB,EAAG,SAAS,OAAS,GACrBA,EAAG,SAAS,CAAC,EAAE,WAAa,KAAK,eAEhCA,EAAG,SAAS,CAAC,EAAkB,MAAM,WAAaiB,KAEhDlB,GAAQ,iBAAmB,SAAW,CAACA,GAAQ,kBACtDC,EAAG,MAAM,MAAQQ,EAEzB,CC7KA,OAAOU,OAAY,YAiBZ,SAASC,GAEZC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAcD,EAAS,gBAAgB,KAAK,QAAQ,SAAS,MAAM,EACnEE,EACEJ,GAAQ,QAAU,OACXA,EAAO,MAEP,KAAK,OAId,CAACK,EAAKC,EAAGC,EAAGC,CAAC,EAAIJ,EAEvB,GAAIF,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,WAEjBD,GAAQ,oBAAsB,cAC9BE,EAAS,OAAS,KAElBD,EAAG,MAAM,MAAQI,EACjBJ,EAAG,MAAM,gBAAkB,GACvBD,GAAQ,SAAW,QAAUC,EAAG,SAAS,CAAC,IACzCA,EAAG,SAAS,CAAC,EAAkB,MAAM,MAAQI,WAGlDL,GAAQ,oBAAsB,cAC9BE,EAAS,OAAS,KACpB,CACE,IAAMO,EAAS,KAAK,mBACdC,EAAaC,EACfC,EAAU,CAACN,EAAGC,EAAGC,EAAG,CAAC,EAAGC,CAAM,CAClC,EACAR,EAAG,MAAM,MAAQS,EACjBT,EAAG,MAAM,gBAAkBI,CAC/B,SACIL,GAAQ,oBAAsB,UAC9BE,EAAS,OAAS,MAClBC,EACF,CACO,KAAK,kBAAkB,IAAIA,CAAW,IACvC,KAAK,kBAAkB,IAAIA,EAAa,IAAI,GAAK,EACjD,KAAK,mBAAmB,IAAIA,EAAa,CAAC,GAG9C,IAAMU,EAAa,KAAK,kBAAkB,IAAIV,CAAW,EACzD,GAAID,EAAS,MAAQ,CAACW,EAAW,IAAIX,EAAS,IAAI,EAAG,CACjD,IAAMY,EAAO,KAAK,mBAAmB,IAAIX,CAAW,GAAK,EACzDU,EAAW,IAAIX,EAAS,KAAMY,CAAI,EAClC,KAAK,mBAAmB,IAAIX,EAAaW,EAAO,CAAC,CACrD,CAEA,IAAMC,EAAaF,EAAW,IAAIX,EAAS,IAAK,GAAK,EACjD,CAACc,EAAGC,EAAGC,CAAC,EAAIC,GAAOd,CAAG,EAAE,IAAI,EAChCW,EAAIA,EAAMD,EAAa,IAAO,IAC9B,IAAMK,EAASD,GAAOH,EAAGC,EAAGC,EAAG,KAAK,EAC9B,CAACG,EAAIC,EAAIC,CAAE,EAAIH,EAAO,IAAI,EAC1BI,EAAOJ,EAAO,IAAI,EAClBX,EAAS,KAAK,mBACdC,EAAaC,EACfC,EAAU,CAACS,EAAIC,EAAIC,EAAI,CAAC,EAAGd,CAAM,CACrC,EACAR,EAAG,MAAM,MAAQS,EACjBT,EAAG,MAAM,gBAAkBuB,CAC/B,MACIvB,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,EAEzB,CClFO,SAASwB,GAEZC,EACAC,EACAC,EACI,CACJ,IAAMC,EAKF,KAAK,OAIH,CAACC,EAAKC,EAAGC,EAAGC,CAAC,EAAIJ,EAGvB,GAAID,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,WAEjBD,GAAQ,sBAAwB,cAChCE,EAAS,OAAS,KAElBD,EAAG,MAAM,MAAQG,EACjBH,EAAG,MAAM,gBAAkB,WAE3BD,GAAQ,sBAAwB,cAChCE,EAAS,OAAS,KACpB,CACE,IAAMM,EAAS,KAAK,mBACdC,EAAaC,EACfC,EAAU,CAACN,EAAGC,EAAGC,EAAG,CAAC,EAAGC,CAAM,CAClC,EACAP,EAAG,MAAM,MAAQQ,EACjBR,EAAG,MAAM,gBAAkBG,CAC/B,MACIH,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,EAEzB,CC7CO,SAASW,GAEZC,EACAC,EACAC,EACI,CAEJ,GAAIA,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,OACd,CACH,GAAM,CAACE,CAAG,EACND,EAAS,OAAS,GACZ,KAAK,cACLA,EAAS,OAAS,GAChB,KAAK,cACL,CAAC,GAAI,EAAG,EAAG,EAAG,EAAE,EAC5BD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQE,CACrB,CACJ,CChBO,SAASC,GAEZC,EACAC,EACAC,EACI,CACJ,IAAMC,EACFD,EAAS,QAAU,QACnBA,EAAS,QAAU,MACnBA,EAAS,OAAO,SAAS,GAAG,KAAK,EAAE,OAAS,EAC1CE,GACDF,EAAS,cAAgB,IAAM,KAAK,QAAQ,SAAS,OACpDG,EAAOL,EAAa,QAAQ,CAC9B,GAAI,EACJ,IAAKE,EAAS,GAAK,IAAMA,EAAS,IAAM,GAAK,CACjD,CAAiB,EAEXI,EACFD,GACAA,EAAK,YACL,OAAOA,EAAK,YAAYH,EAAS,cAAgB,GAAK,CAAC,EACnD,IAERD,EAAG,UAAU,OAAO,iBAAkBE,GAAgB,CAACC,CAAO,EAC9DH,EAAG,UAAU,OACT,wBACAE,GAAgB,CAACC,GAAW,CAACE,CACjC,EAEAL,EAAG,UAAU,OACT,0BACAE,GAAgB,CAACC,GAAWE,CAChC,EACAL,EAAG,UAAU,OAAO,gBAAiBE,GAAgBC,CAAO,CAChE,CCjBO,SAASG,GAEZC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAcH,EAAgB,IAAID,CAAY,EAC9CK,EAAWJ,EAAgB,IAAID,CAAY,EAEjDA,EAAa,UAAU,OACnB,yBACA,KAAK,QAAQ,oBAAsB,MACvC,EAEA,OAAW,CAAE,QAASM,EAAI,SAAAC,EAAU,SAAAC,CAAS,IAAKb,EAAO,CACrD,IAAMc,EACFF,EAAS,gBAAgB,KAAK,QAAQ,SAAS,MAAM,EACnDG,EAAOC,EAAa,KAAMJ,CAAQ,EAClCK,EAASH,EACTb,EAAQa,EAAY,SAAS,CAAC,EAC9B,OACAI,EAAaH,IAAS,WAAaA,IAAS,QAIlDH,EAAS,+BAAkCO,GACvCA,IAAM,GAAKA,IAAM,OACX,GACAA,EAAI,EACJ,KAAK,IACD,KAAK,QAAQ,SAAS,OACtBF,GAAQ,iBAAmB,CAC/B,GACLL,EAAS,YAAsC,OAC3CO,GAAMA,IAAM,MACjB,GAAG,MACP,EAGID,EACAE,GAAmB,KACf,KACAH,EACAN,EACAC,EACAV,CACJ,EACOa,IAAS,UAChBM,GAAmB,KAAK,KAAMJ,EAAQN,EAAIC,CAAe,EAClDG,IAAS,SAChBO,GAAkB,KAAK,KAAML,EAAeN,EAAIC,CAAe,EACxDG,IAAS,QAAUA,IAAS,WACnCQ,GAAoB,KAAK,KAAMN,EAAeN,EAAIC,CAAe,GAEjED,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,IAIrBA,EAAG,UAAU,OACT,gBACAI,IAAS,WAAaH,EAAS,OAAS,IAC5C,EAEAD,EAAG,UAAU,OAAO,WAAYC,EAAS,QAAU,IAAI,EACvDD,EAAG,UAAU,OAAO,kBAAmB,CAACE,GAAYK,CAAU,EAC9DP,EAAG,UAAU,OAAO,iBAAkBE,GAAY,CAACK,CAAU,EACzD,KAAK,iCACLP,EAAG,UAAU,OACT,gBACAG,IAAgB,KAAK,gCACzB,EAEAH,EAAG,UAAU,OAAO,gBAAiB,EAAK,EAG9CA,EAAG,UAAU,OACT,qBACAM,GAAQ,iBAAmB,OAASC,CACxC,EAGIL,GACAW,GAAsB,KAAK,KAAMnB,EAAcM,EAAIC,CAAe,EAItE,IAAMa,EAAKd,EAAG,cAwBd,GAvBIc,IACAA,EAAG,QAAQ,EAAI,OAAOb,EAAS,CAAC,GAIhCA,EAAS,OAAS,cAClBA,EAAS,eACJA,EAAS,WAAyB,OAAS,GAC/CA,EAAS,WAAyBA,EAAS,aAAe,CAAC,IACxD,QAEJD,EAAG,QAAQ,EAAI,OAAOC,EAAS,CAAC,EAC5BA,EAAS,OAAS,aAClBD,EAAG,QAAQ,EAAI,OAAOC,EAAS,CAAC,EAEhC,OAAOD,EAAG,QAAQ,IAGtB,OAAOA,EAAG,QAAQ,EAClB,OAAOA,EAAG,QAAQ,GAIlBR,EACA,GAAI,CAACM,EACDE,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAC7CA,EAAG,UAAU,OAAO,sBAAuB,EAAK,MAC7C,CACH,IAAMe,EAAK,KAAK,MAAMd,EAAS,GAAK,IAAMA,EAAS,IAAM,EAAE,EACrDe,EAAajB,EAAuB,OACtC,CAACkB,EAAKT,EAAGU,IAAMD,GAAOT,IAAMO,EAAGG,CAAC,EAChC,EACJ,EAEMC,EAAcpB,EAChBG,GAEID,EAAS,OAAS,cAClBA,EAAS,eAAiB,QACxBc,EAAGd,EAAS,YAAY,GAE1BD,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAC7CA,EAAG,UAAU,OAAO,sBAAuB,EAAK,IAYpDA,EAAG,UAAU,OACT,mBACAe,EAAG,SAAWI,EAAY,QAAUH,CACxC,EACAhB,EAAG,UAAU,OACT,sBACAe,EAAG,SAAWI,EAAY,QAAUH,CACxC,EAER,CAIJ,GAAI,CAACd,GAAYD,EAAS,OAAS,OAC/B,GAAIR,GAAc,KAAK,aAAaQ,EAAS,CAAC,EAAG,CAG7C,IAAMmB,EADFnB,EAAS,gBAAgB,KAAK,QAAQ,SAAS,MAAM,GAC1B,SAAS,EAEpCmB,GACAhB,IAAS,UACTd,EAAQ8B,CAAY,GAAG,SAAW,QAElCpB,EAAG,gBAAgB,kBAAmB,EAAK,EAC3CA,EAAG,UAAU,OAAO,mBAAoB,EAAK,GACtCI,IAAS,WAChBJ,EAAG,gBAAgB,kBAAmB,EAAK,EAC3CA,EAAG,UAAU,OACT,mBACCC,EAAgC,OAAS,IAC9C,IAEIR,IAAeO,EAAG,aAAa,iBAAiB,GAChDA,EAAG,gBAAgB,kBAAmBP,CAAU,EAEpDO,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAErD,MACIA,EAAG,gBAAgB,kBAAmB,EAAK,EAC3CA,EAAG,UAAU,OAAO,mBAAoB,EAAK,CAGzD,CACJ,CCnKA,SAASqB,GACLC,EACAC,EACAC,EAAmB,GACZ,CACP,IAAMC,EACFH,EAAM,QAAQ,SAAS,SAAW,GAClCA,EAAM,QAAQ,SAAS,SAAW,EAChCI,EAAaH,EAAO,aAAa,YAAY,EAC7CI,EAASJ,EAAO,SAAS,CAAC,EAG1BK,EAAWJ,GAAWG,GAAQ,SAAS,WAAa,OAC1D,OAAOF,GAAc,CAACC,GAAcE,CACxC,CAQO,SAASC,GACZC,EACAC,EACAC,EAKM,CACN,OAAO,SAEHC,EACAV,EACI,CACJ,IAAMW,EACDD,EAAqBE,CAAqB,GAAK,CAAC,EAC/CC,EAAiBb,EAAO,aAAa,UAAU,EAC/Cc,EAAed,EAAO,aAAa,YAAY,EAC/Ce,EAAajB,GAAe,KAAME,CAAM,EACxCgB,EAAoBlB,GAAe,KAAME,EAAQ,EAAI,EAG3DO,EAAS,UAAU,OAAO,oBAAqBS,CAAiB,EAChE,IAAMC,EAA6B,CAAC,EAC9BC,EAAwC,CAAC,EACzCC,EAAQT,EAAa,SAAS,CAAC,GAAG,SAAS,CAAC,EAClD,GAAIS,EACA,QAAWC,KAAMD,EAAM,SACnB,QAAWE,KAAQD,EAAG,SAAU,CAC5B,IAAME,EAAWZ,EAAa,QAC1BW,CACJ,EAEA,GAAIC,EAAU,CACV,IAAMC,EAAWF,EAAK,UAAY,KAClCJ,EAAU,KAAK,CACX,QAASI,EACT,SAAAC,EACA,SAAAC,CACJ,CAAC,CACL,CACJ,CAKR,IAAMC,EAAQd,EAAa,SAAS,CAAC,GAAG,SAAS,CAAC,EAClD,GAAIc,EACA,QAAWJ,KAAMI,EAAM,SAAU,CAC7B,IAAMC,EAA8B,CAChC,IAAKL,EACL,MAAO,CAAC,CACZ,EAEA,QAAWC,KAAQD,EAAG,SAAU,CAC5B,IAAME,EAAWZ,EAAa,QAC1BW,CACJ,EAEAI,EAAQ,MAAM,KAAK,CACf,QAASJ,EACT,SAAAC,CACJ,CAAC,CACL,CACAJ,EAAgB,KAAKO,CAAO,CAChC,CAGJ,KAAK,qBACDR,EACAN,EACAE,EACAC,EACAC,EACAL,EACAF,EACAC,EACAT,CACJ,EAEA,KAAK,wBAAwBkB,EAAiBR,CAAY,EAC1D,KAAK,yBAAyBQ,EAAiBR,EAAcV,CAAM,EACnE,KAAK,iBAAiBiB,EAAWP,EAAcD,CAAmB,CACtE,CACJ,CAyCO,SAASiB,GAAgCC,EAA2B,CACvEA,EAAe,qBAAuBC,GACtCD,EAAe,wBAA0BE,GACzCF,EAAe,yBAA2BG,GAC1CH,EAAe,iBAAmBI,GAClCJ,EAAe,sBAAwBK,EAC3C,CCrKA,eAAsBC,GAElBC,EACa,CACb,IAAMC,EAAS,KAAK,cACdC,EAAQ,MAAMD,EAAO,SAAS,EAEpC,GAAK,KAAK,aAuKN,MAAME,EAAY,KACd,KACA,KAAK,cACLD,EACAF,EACA,KAAK,KACT,MA7KoB,CAepB,GAdA,KAAK,UAAY,GACb,KAAK,WACL,KAAK,WAAW,YAAY,KAAK,aAAa,EAE9C,KAAK,YAAY,KAAK,aAAa,EAGvC,KAAK,MAAQ,MAAMG,EAAY,KAC3B,KACA,KAAK,cACLD,EACAF,CACJ,EAEI,CAAC,KAAK,MACN,OAGJI,GAAsB,KAAM,KAAK,cAAe,CAC5C,UAAW,mBACf,CAAC,EAGD,IAAMC,EAAoB,IAAI,QAIxBC,EAAwB,IAAI,QAMlCC,GAAgC,KAAK,KAAK,EAS1C,KAAK,cAAc,iBACfC,GACI,KACAH,EACAC,CACJ,EAAE,KAAK,KAAK,MAAO,KAAK,cAAeL,CAAM,CACjD,EAGA,KAAK,cAAc,iBACf,QACAQ,GAAe,KACX,KAAK,MACL,KAAK,aACT,CACJ,EAEA,KAAK,cAAc,iBACf,YACAC,GAAkB,KACd,KAAK,MACL,KAAK,cACLT,EACAI,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,mBACAM,GAAsB,KAClB,KAAK,MACL,KAAK,cACLV,EACAI,CACJ,CACJ,EAGA,KAAK,cAAc,iBACf,QACAO,GAAwB,KACpB,KAAK,MACL,KAAK,cACLX,CACJ,CACJ,EAGA,KAAK,cAAc,iBACf,YACAY,GAAmB,KACf,KAAK,MACL,KAAK,cACLZ,CACJ,CACJ,EAIA,KAAK,cAAc,iBACf,QACAa,GAAc,KACV,KAAK,MACL,KAAK,cACLb,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,UACAc,GAAgB,KACZ,KAAK,MACL,KAAK,cACLd,EACAK,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,WACAU,GAAiB,KACb,KAAK,MACL,KAAK,cACLf,EACAK,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,UACAW,GAAgB,KACZ,KAAK,MACL,KAAK,cACLhB,EACAK,CACJ,CACJ,EAGAL,EAAO,iBACH,qCACCiB,GAAiB,CACd,IAAMC,EAAcD,EACpB,GAAI,KAAK,YAAa,CAOlB,GANAE,GAAsB,KAClB,KAAK,MACL,KAAK,cACLnB,EACAkB,EAAY,OAAO,aAAe,MACtC,EACI,CAACA,EAAY,OAAO,KAAM,CAC1B,KAAK,MAAO,iCACR,OACJ,MACJ,CAEA,KAAK,MAAO,iCACRA,EAAY,OAAO,aAAe,MAC1C,CACJ,CACJ,EAEA,KAAK,aAAe,EACxB,CASJ,CCtLO,SAASE,GAEZC,EACAC,EACI,CACJD,EAAQ,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,EACxCC,EAAU,KAAK,MAAM,KAAK,UAAUA,CAAO,CAAC,EAC5C,IAAMC,EAA6B,CAAC,EAEpC,GAAIF,EAAM,QACN,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQJ,EAAM,OAAO,EAC/CI,EAAM,uBAAyB,SAC/BF,EAAUC,CAAG,EAAIC,EAAM,qBACvB,OAAOA,EAAM,sBAKzB,IAAMC,EAAuC,CAAC,EAC9C,GAAIJ,EACA,OAAW,CAACK,EAAUC,CAAQ,IAAK,OAAO,QAAQN,CAAO,EACrDI,EAAOC,CAAQ,EAAI,CACf,GAAGC,EACH,aAAcA,EAAS,aACjBC,EAAkBD,EAAS,YAAY,EACvC,OACN,aAAcA,EAAS,aACjBC,EAAkBD,EAAS,YAAY,EACvC,OACN,aAAcA,EAAS,aACjBC,EAAkBD,EAAS,YAAY,EACvC,OACN,aAAcA,EAAS,aACjBC,EAAkBD,EAAS,YAAY,EACvC,OACN,MAAOA,EAAS,MACVC,EAAkBD,EAAS,KAAK,EAChC,MACV,EAIJ,cAAeP,GAASA,EAAM,YAC1BS,EAAW,QAAQT,EAAM,SAAS,IAAM,GACxCU,EAAiB,KAAK,KAAMV,EAAM,SAAS,EAE3C,QAAQ,MAAM,qBAAuBA,EAAM,SAAS,GAIxD,gBAAiBA,GACjBW,EAAmB,KAAK,KAAMX,EAAM,WAAW,EAGnD,IAAMY,EAAW,KAAK,cACtBC,EAA8B,KAAK,KAAMX,EAAW,EAAI,EACvDU,EAAiBE,CAAqB,EAAIT,CAC/C,CC1FO,SAASU,IAEgC,CAC5C,GAAI,KAAK,cAAe,CACpB,IAAMC,EAA8B,CAChC,QAAS,CAAC,EACV,YAAa,CAAC,CAAC,KAAK,gBACpB,UAAW,KAAK,UACpB,EAEMC,EAAwBC,EAA2B,KAAK,IAAI,EAElE,QAAWC,KAAO,OAAO,KAAKF,GAAyB,CAAC,CAAC,EAChDD,EAAM,UAAUG,CAAG,IACpBH,EAAM,QAAUA,EAAM,SAAW,CAAC,EAClCA,EAAM,QAAQG,CAAG,EAAI,CAAC,GAG1BH,EAAM,QAAQG,CAAG,EAAE,qBACfF,EAAsBE,CAAG,EAGjC,OAAO,KAAK,MAAM,KAAK,UAAUH,CAAK,CAAC,CAC3C,CACA,MAAO,CAAC,CACZ,CCrBA,eAAsBI,GAElBC,EACa,CAKb,GAJI,KAAK,eACL,MAAM,KAAK,SAASA,CAAI,EAGxB,CAAC,KAAK,aAAe,KAAK,cAAgB,MAAQ,CAAC,KAAK,MACxD,OAGJ,IAAMC,EAAYC,EAA2B,KAAK,IAAI,EAChDC,EAAc,KAAK,cAAc,KAAK,CACxC,gBAAiB,EACrB,CAAQ,EAEJ,KAAK,oBACL,KAAK,cAAc,UAAY,EAC/B,KAAK,kBAAoB,IAGzB,KAAK,qBACL,KAAK,cAAc,WAAa,EAChC,KAAK,mBAAqB,IAE1B,KAAK,gBACL,KAAK,cAAc,cACf,IAAI,YAAY,mBAAoB,CAAE,QAAS,EAAM,CAAC,CAC1D,EACA,KAAK,cAAgB,IAGrB,KAAK,qBACL,KAAK,cAAc,cAAc,EACjC,KAAK,mBAAqB,IAG9BC,EAA8B,KAAK,KAAMH,CAAS,EAClD,MAAME,EAEN,KAAK,UAAU,UAAU,OACrB,aACA,KAAK,MAAM,QAAQ,SAAS,OAAS,GACjC,KAAK,MAAM,QAAQ,SAAS,OAAS,CAC7C,CACJ,CC3Be,SAARE,GAEHC,EACAC,EACe,CACf,OAAID,IAAS,WAAaA,IAAS,QACxB,CACH,sBAAuB,CACnB,YAAa,EACb,aAAc,KAAK,MAAO,cAAc,CAAC,EACzC,aAAc,KAAK,MAAO,cAAc,CAAC,EACzC,eAAgB,QAChB,YAAa,EACb,aAAc,KAAK,MAAO,cAAc,CAAC,EACzC,aAAc,KAAK,MAAO,cAAc,CAAC,EACzC,eAAgB,UACpB,EACA,qBAAsB,EAC1B,EACOA,IAAS,QAAUA,IAAS,YAAcA,IAAS,SAKnD,CACH,CAJAA,IAAS,QAAUA,IAAS,WACtB,0BACA,uBAEE,EAAG,CACP,MAAO,KAAK,MAAO,OAAO,CAAC,EAC3B,SAAU,KAAK,MAAO,OAAO,CAAC,CAClC,CACJ,EAEO,IAEf,CC3EA,IAAAE,GAAA,wgoBCwCO,IAAMC,EAAN,MAAMC,UACD,WAEZ,CACI,OAAe,6BAAwC,GACvD,OAAe,OAIf,OAAO,aACH,OAAO,KAAK,UACZ,OAAO,KAAK,SAAS,8BAA8B,EAC7C,SACA,QAEV,cACA,MACA,SACA,aACA,aACA,gBACA,WACA,aACA,kBACA,mBACA,cACA,mBAEA,aAAc,CACV,MAAM,EACN,KAAK,cAAgB,SAAS,cAC1B,eACJ,EACA,KAAK,cAAc,KAAO,gBAC1B,KAAK,gBAAkB,GACvB,KAAK,WAAa,YAClB,IAAMC,EAAOD,EACRC,EAAK,SACNA,EAAK,OAAS,IAAI,cAClBA,EAAK,OAAO,YAAYC,EAAc,GAGtCD,EAAK,eAAiB,SACP,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,EAC1C,mBAAmB,KAAKA,EAAK,MAAM,EAE1CA,EAAK,eAAiB,SACtB,CAACA,EAAK,+BAENA,EAAK,6BAA+B,GACpC,SAAS,mBAAmB,KAAKA,EAAK,MAAM,EAEpD,CAEA,mBAA0B,CACjB,KAAK,WACN,KAAK,SAAW,SAAS,cACrB,qCACJ,GAGJ,IAAME,EAAS,KAAK,cAChBA,GACAA,EAAO,YAAY,KAAK,QAAQ,CAExC,CAEA,sBAA6B,CACzB,KAAK,UAAU,eAAe,cAAc,KAAK,QAAQ,CAC7D,CAEA,MAAM,SAASC,EAA2B,CACtC,OAAO,MAAMC,GAAS,KAAK,KAAMD,CAAI,CACzC,CAEA,IAAI,MAAe,CACf,MAAO,UACX,CAEA,IAAI,UAAmB,CACnB,MAAO,OACX,CAEA,IAAI,aAAsB,CACtB,MAAO,QACX,CAEA,IAAI,oBAAyC,CAE7C,CAEA,IAAI,qBAAgC,CAChC,MAAO,CAAC,SAAS,CACrB,CAEA,IAAI,eAA0B,CAC1B,MAAO,CAAC,SAAU,OAAQ,OAAO,CACrC,CAMA,IAAI,UAAmB,CACnB,MAAO,EACX,CAEA,yBAAyBE,EAAcC,EAAyB,CAC5D,OAAOD,IAAS,SACpB,CAEA,sBAAsBA,EAAcE,EAAgC,CAChE,OAAOC,GAAsB,KAAK,KAAMH,EAAaE,CAAK,CAC9D,CAEA,MAAM,KAAKJ,EAA2B,CAClC,OAAO,MAAMM,GAAK,KAAK,KAAMN,CAAI,CACrC,CAEA,MAAM,OAAOA,EAA2B,CACpC,GAAI,KAAK,QAAU,OACf,MAAM,KAAK,KAAKA,CAAI,UACb,KAAK,MAAM,QAAQ,UAAU,OAAS,EAAG,CAChD,IAAMO,EAAa,MAAMP,EAAK,WAAW,EACzC,KAAK,MAAM,UAAYO,EAAW,cAClC,MAAM,KAAK,cAAc,KAAK,CAClC,MACI,KAAK,MAAM,UAAY,MAAMP,EAAK,SAAS,EAC3C,MAAM,KAAK,cAAc,KAAK,CAEtC,CAEA,MAAM,OAAOQ,EAAwC,CAEjD,IAAMR,EAAO,MADE,KAAK,cACM,QAAQ,EAC5BS,EAAO,MAAMT,EAAK,WAAWQ,CAAe,EAC5CE,EAAO,MAAMV,EAAK,aAAaQ,CAAe,EAE9CG,EACFH,GAAU,UAAY,QACtBA,GAAU,UAAY,MACtBA,GAAU,YAAc,QACxBA,GAAU,YAAc,KAClBA,EAAS,QAAUA,EAAS,UAC5B,MAAMR,EAAK,SAAS,EAE1BY,EAAM,GACV,QAASC,EAAO,EAAGA,EAAOF,EAAOE,IAAQ,CACrC,QAAWC,KAAYJ,EAAM,CACzB,IAAMK,EAAON,EAAmCK,CAAQ,EAClDZ,EAAO,KAAK,MAAO,QAAQY,CAAQ,EACnCE,EAAgB,KAAK,cACvBC,CACJ,EACMC,EAAaJ,EAAS,MAAM,GAAG,EAAE,GAAG,EAAE,EACtCK,EAAYC,GACdlB,EACAc,IAAeE,CAAU,GAAK,CAAC,CACnC,EAEIC,EACAP,GAAOO,EAAU,OAAOJ,EAAIF,CAAI,CAAC,EAAI,IAErCD,GAAOG,EAAIF,CAAI,EAAI,GAE3B,CACAD,GAAO;AAAA,CACX,CAEA,OAAOA,EAAI,KAAK,CACpB,CAEA,MAAM,QAAwB,CACtB,CAAC,KAAK,aAAe,KAAK,cAAgB,MAI1C,KAAK,cACL,MAAM,KAAK,cAAc,KAAK,CAEtC,CAEA,MAAM,OAAuB,CACzB,KAAK,cAAc,cAAc,EACjC,KAAK,cAAc,MAAM,CAC7B,CAEA,MAAM,MAAqB,CACvB,OAAOS,GAAK,KAAK,IAAI,CACzB,CAEA,MAAM,QACFC,EACAC,EACY,CACZ,OAAOC,GAAQ,KAAK,KAAMF,EAAOC,GAAkB,CAAC,CAAC,CACzD,CAEA,MAAM,SAAyB,CAEvB,KAAK,OAAO,OACZ,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,CAExC,CAEA,MAAM,QAAwB,CAC1B,KAAK,qBAAqB,EAC1B,KAAK,SAAW,OACX,KAAK,cAAsB,aAC5B,KAAK,cAAc,cAAc,EAGrC,KAAK,cAAc,MAAM,CAC7B,CACJ,EC9PA,IAAAE,GAAA,u3GCmBA,IAAMC,GAAa,IAAI,cACvBA,GAAW,YAAYC,EAAa,EAQ7B,IAAMC,EAAN,cAA0D,WAAY,CACjE,aAAwB,GAEhC,mBAA0B,CACtB,GAAI,KAAK,aACL,OAGJ,KAAK,aAAe,GACpB,KAAK,aAAa,OAAQ,iBAAiB,EAC3C,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,EAClC,KAAK,WAAY,mBAAmB,KAAKF,EAAU,EACnD,KAAK,WAAY,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAe7B,IAAMG,EAAS,KAAK,cACdC,EAAS,KAAK,uBAEpBA,EAAO,aAAe,KAAK,WAAY,cACnC,cACJ,EACAA,EAAO,aAAa,iBAAiB,QAAS,IAC1CC,EAAmB,KAAKD,CAAM,CAClC,EAEAA,EAAO,aAAe,KAAK,WAAY,cACnC,YACJ,EACAA,EAAO,aAAa,iBAAiB,QAAS,IAAM,CAChDE,EAAiB,KAAKF,CAAM,EAC5BA,EAAO,cAAc,KAAK,EAC1BD,EAAO,cAAc,IAAI,MAAM,2BAA2B,CAAC,CAC/D,CAAC,CACL,CACJ,E1ChDA,eAAeI,IAAmC,CAC9C,eAAe,OACX,sCACAC,CACJ,EAEA,eAAe,OACX,8BACAC,CACJ,EAEA,MAAM,eAAe,YAAY,oBAAoB,EAC3B,eAAe,IACrC,oBACJ,EACkB,eAAe,6BAA6B,CAClE,CAEAF,GAAkB",
|
|
6
|
+
"names": ["PerspectiveSelectDetail", "get_psp_type", "model", "metadata", "PRIVATE_PLUGIN_SYMBOL", "chroma", "BooleanFormatter", "val", "LEGACY_CONFIG", "FormatterCache", "_type", "plugin", "options", "type", "format", "_plugin", "formatter_key", "FORMAT_CACHE", "FormatterCache", "MAX_BAR_WIDTH_PCT", "format_raw", "type", "value", "format_cell", "title", "val", "plugins", "use_table_schema", "plugin", "div", "anchor", "pct", "bold", "italic", "formatter", "format_tree_header_row_path", "paths", "row_headers", "regularTable", "plugins", "PRIVATE_PLUGIN_SYMBOL", "path", "fullPath", "last", "newPath", "formatted", "format_cell", "format_flat_header_row_path", "part", "i", "format_tree_header", "new_path", "idx", "createDataListener", "viewer", "last_meta", "last_column_paths", "last_ids", "last_reverse_ids", "last_reverse_columns", "regularTable", "x0", "y0", "x1", "y1", "columns", "new_window", "num_columns", "x", "z", "new_col_paths", "changed_cols", "i", "a", "b", "column", "index", "acc", "data", "metadata", "column_headers", "column_paths", "is_settings_open", "ipath", "path", "path_parts", "agg_depth", "PRIVATE_PLUGIN_SYMBOL", "format_cell", "is_dim_call", "is_row_path", "is_flat", "row_headers", "format_flat_header_row_path", "format_tree_header_row_path", "format_tree_header", "num_row_headers", "row_header_depth", "config", "chroma", "blend", "a", "b", "rgbaToRgb", "r", "g", "source", "f", "i", "c", "infer_foreground_from_background", "make_gradient", "chromahex", "r1", "g1", "b1", "r2", "g2", "b2", "make_color_record", "color", "chroma_neg", "_neg_grad", "rgb", "get_rule", "regular", "tag", "def", "color", "ElemFactoryImpl", "name", "elem", "createModel", "table", "view", "extend", "config", "old", "group_by_changed", "type_changed", "lvl", "split_by_changed", "columns_changed", "filter_changed", "i", "sort_changed", "group_rollup_mode_changed", "table_schema", "num_rows", "schema", "expression_schema", "_edit_port", "_plugin_background", "chroma", "_pos_fg_color", "make_color_record", "_neg_fg_color", "_pos_bg_color", "blend", "_neg_bg_color", "_color", "_schema", "_table_schema", "_column_paths", "_is_editable", "_column_types", "_edit_mode", "model", "column_path", "createDataListener", "EDIT_MODES", "toggle_edit_mode", "mode", "toggle_scroll_lock", "force", "restore_column_size_overrides", "old_sizes", "cache", "overrides", "group_by", "tree_header_offset", "key", "index", "save_column_size_overrides", "x", "numKey", "style_selected_column", "regularTable", "viewer", "selectedColumn", "group_header_trs", "len", "settings_open", "tr", "i", "offset", "id", "titles", "editBtns", "th", "title", "editBtn", "open", "r", "meta", "isOpen", "styleColumnHeaderRow", "headerRow", "is_menu_row", "header_depth", "td", "metadata", "column_name", "sort", "x", "is_corner", "needs_border", "type", "get_psp_type", "is_numeric", "is_string", "is_date", "is_datetime", "ROW_SORT_ORDER", "ROW_COL_SORT_ORDER", "sortHandler", "regularTable", "viewer", "event", "target", "meta", "column_name", "sort_method", "append_sort", "override_sort", "abs", "sort", "found", "sort_term", "_column_name", "_sort_dir", "term", "create_sort", "sort_dir", "_abs", "order", "inc_sort_dir", "expandCollapseHandler", "regularTable", "event", "meta", "is_collapse", "x", "mousedown_listener", "regularTable", "viewer", "event", "target", "expandCollapseHandler", "column_name", "sortHandler", "click_listener", "write_cell", "table", "model", "active_cell", "meta", "type", "text", "id", "parsed", "msg", "clickListener", "_viewer", "event", "is_editable2", "is_bool", "get_psp_type", "is_null", "applyFocusStyle", "cells", "regularTable", "selectedPositionMap", "selected_position", "host", "td", "metadata", "focusSelectedCell", "tbody", "tr", "cell", "lock", "body", "lockPromise", "args", "resolve", "x", "result", "getPos", "_range", "range", "moveSelection", "table", "selected_position_map", "active_cell", "dx", "dy", "meta", "num_columns", "num_rows", "selected_position", "xmin", "xmax", "ymin", "ymax", "y", "focusSelectedCell", "isLastCell", "model", "target", "keydownListener", "_viewer", "event", "is_editable", "viewer", "allowed", "has_pivots", "selectable", "plugin", "editable", "keydownListener", "table", "selected_position_map", "event", "clickListener", "focusoutListener", "table", "viewer", "selected_position_map", "event", "is_editable", "target", "selectedPosition", "write_cell", "focusinListener", "_viewer", "meta", "new_state", "getCellConfig", "_view", "_config", "row_idx", "col_idx", "group_by", "split_by", "start_row", "end_row", "r", "group_by_values", "x", "row_filters", "pivot", "index", "pivot_value", "column_index", "column_paths", "result", "column_filters", "split_by_values", "value", "filter", "selectionListener", "regularTable", "viewer", "selected_rows_map", "event", "meta", "id", "selected", "key_match", "agg", "x", "i", "is_deselect", "row", "column_names", "config", "getCellConfig", "detail", "PerspectiveSelectDetail", "deselect_all_listener", "regularTable", "_viewer", "selected_rows_map", "td", "dispatch_click_listener", "table", "viewer", "event", "meta", "x", "y", "row", "column_names", "config", "getCellConfig", "MOUSE_SELECTED_AREA_CLASS", "addAreaMouseSelection", "datagrid", "table", "className", "selected", "getMousedownListener", "getMouseoverListener", "getMouseupListener", "applyMouseAreaSelections", "event", "mouseEvent", "meta", "start", "potentialSelection", "selection", "set_psp_selection", "viewer", "x0", "x1", "y0", "y1", "viewport", "mode", "tds", "applyMouseAreaSelection", "td", "rendered", "applyColumnHeaderStyles", "headerRows", "regularTable", "viewer", "selectedColumn", "len", "settings_open", "row", "i", "offset", "id", "titlesRow", "editBtnsRow", "cells", "element", "title", "editBtn", "open", "colHeadersIndex", "colHeaders", "menuHeadersIndex", "menuHeaders", "applyGroupHeaderStyles", "headerRows", "regularTable", "header_depth", "m", "marked", "y", "row", "cells", "tops", "x", "td", "metadata", "needs_border", "xx", "cell", "tx", "ty", "style_cell_flash", "metadata", "td", "pos_s", "pos_e", "neg_s", "neg_e", "is_settings_open", "id", "metadata_path", "row_idx", "col_idx", "cell_style_numeric", "plugin", "td", "metadata", "is_settings_open", "is_positive", "is_negative", "pos_bg_color", "neg_bg_color", "bg_tuple", "hex", "r", "a", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "style_cell_flash", "fg_tuple", "gradhex", "chroma", "cell_style_string", "plugin", "td", "metadata", "column_name", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "series_map", "seed", "color_seed", "h", "s", "l", "chroma", "color2", "r2", "g2", "b2", "hex2", "cell_style_datetime", "plugin", "td", "metadata", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "cell_style_boolean", "_plugin", "td", "metadata", "hex", "cell_style_row_header", "regularTable", "td", "metadata", "is_not_empty", "is_leaf", "next", "is_collapse", "applyBodyCellStyles", "cells", "plugins", "isSettingsOpen", "isSelectable", "isEditable", "regularTable", "selectedRowsMap", "selectedPositionMap", "viewer", "hasSelected", "selected", "td", "metadata", "isHeader", "column_name", "type", "get_psp_type", "plugin", "is_numeric", "x", "cell_style_numeric", "cell_style_boolean", "cell_style_string", "cell_style_datetime", "cell_style_row_header", "tr", "id", "key_match", "agg", "i", "selectedArr", "col_name_str", "isEditableMode", "model", "viewer", "allowed", "has_pivots", "selectable", "plugin", "editable", "createConsolidatedStyleListener", "datagrid", "selectedRowsMap", "selectedPositionMap", "regularTable", "plugins", "PRIVATE_PLUGIN_SYMBOL", "isSettingsOpen", "isSelectable", "isEditable", "isEditableAllowed", "bodyCells", "groupHeaderRows", "tbody", "tr", "cell", "metadata", "isHeader", "thead", "rowData", "installConsolidatedStyleMethods", "modelPrototype", "applyBodyCellStyles", "applyGroupHeaderStyles", "applyColumnHeaderStyles", "applyFocusStyle", "styleColumnHeaderRow", "activate", "view", "viewer", "table", "createModel", "addAreaMouseSelection", "selected_rows_map", "selected_position_map", "installConsolidatedStyleMethods", "createConsolidatedStyleListener", "click_listener", "selectionListener", "deselect_all_listener", "dispatch_click_listener", "mousedown_listener", "clickListener", "focusinListener", "focusoutListener", "keydownListener", "event", "toggleEvent", "style_selected_column", "restore", "token", "columns", "overrides", "col", "value", "styles", "col_name", "controls", "make_color_record", "EDIT_MODES", "toggle_edit_mode", "toggle_scroll_lock", "datagrid", "restore_column_size_overrides", "PRIVATE_PLUGIN_SYMBOL", "save", "token", "column_size_overrides", "save_column_size_overrides", "col", "draw", "view", "old_sizes", "save_column_size_overrides", "drawPromise", "restore_column_size_overrides", "column_style_opts", "type", "_group", "perspective_viewer_datagrid_default", "HTMLPerspectiveViewerDatagridPluginElement", "_HTMLPerspectiveViewerDatagridPluginElement", "Elem", "perspective_viewer_datagrid_default", "parent", "view", "activate", "type", "_group", "group", "column_style_opts", "draw", "dimensions", "viewport", "json", "cols", "nrows", "out", "ridx", "col_name", "col", "pluginConfig", "PRIVATE_PLUGIN_SYMBOL", "columnName", "formatter", "format_raw", "save", "token", "columns_config", "restore", "perspective_viewer_datagrid_toolbar_default", "stylesheet", "perspective_viewer_datagrid_toolbar_default", "HTMLPerspectiveViewerDatagridToolbarElement", "viewer", "plugin", "toggle_scroll_lock", "toggle_edit_mode", "_register_element", "HTMLPerspectiveViewerDatagridToolbarElement", "HTMLPerspectiveViewerDatagridPluginElement"]
|
|
7
7
|
}
|