@perspective-dev/viewer-datagrid 4.4.1 → 4.5.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.
Files changed (37) hide show
  1. package/dist/cdn/perspective-viewer-datagrid.js +4 -4
  2. package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
  3. package/dist/esm/custom_elements/datagrid.d.ts +12 -17
  4. package/dist/esm/model/meta_columns.d.ts +1 -0
  5. package/dist/esm/perspective-viewer-datagrid.js +3 -3
  6. package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
  7. package/dist/esm/plugin/column_config_schema.d.ts +31 -0
  8. package/package.json +1 -1
  9. package/src/ts/color_utils.ts +50 -13
  10. package/src/ts/custom_elements/datagrid.ts +63 -48
  11. package/src/ts/data_listener/format_tree_header.ts +2 -2
  12. package/src/ts/data_listener/formatter_cache.ts +8 -95
  13. package/src/ts/data_listener/index.ts +9 -3
  14. package/src/ts/event_handlers/click/edit_click.ts +3 -0
  15. package/src/ts/event_handlers/dispatch_click.ts +4 -1
  16. package/src/ts/event_handlers/expand_collapse.ts +4 -1
  17. package/src/ts/event_handlers/header_click.ts +9 -3
  18. package/src/ts/event_handlers/keydown/edit_keydown.ts +11 -2
  19. package/src/ts/event_handlers/select_region.ts +15 -4
  20. package/src/ts/event_handlers/sort.ts +4 -1
  21. package/src/ts/get_cell_config.ts +10 -3
  22. package/src/ts/model/column_overrides.ts +3 -5
  23. package/src/ts/model/create.ts +22 -5
  24. package/src/ts/{plugin/column_style_controls.ts → model/meta_columns.ts} +33 -62
  25. package/src/ts/model/toolbar.ts +11 -2
  26. package/src/ts/plugin/activate.ts +3 -1
  27. package/src/ts/plugin/column_config_schema.ts +187 -0
  28. package/src/ts/plugin/draw.ts +1 -0
  29. package/src/ts/plugin/restore.ts +6 -2
  30. package/src/ts/plugin/save.ts +1 -5
  31. package/src/ts/style_handlers/body.ts +6 -2
  32. package/src/ts/style_handlers/column_header.ts +6 -2
  33. package/src/ts/style_handlers/consolidated.ts +1 -0
  34. package/src/ts/style_handlers/editable.ts +6 -2
  35. package/src/ts/style_handlers/focus.ts +2 -0
  36. package/src/ts/style_handlers/group_header.ts +10 -4
  37. package/dist/esm/plugin/column_style_controls.d.ts +0 -28
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/ts/index.ts", "../../src/ts/types.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/create.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/event_handlers/focus.ts", "../../src/ts/style_handlers/focus.ts", "../../src/ts/event_handlers/keydown/edit_keydown.ts", "../../src/ts/event_handlers/click.ts", "../../src/ts/get_cell_config.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 ViewConfigUpdate,\n} from \"@perspective-dev/client\";\nimport type {\n HTMLPerspectiveViewerElement,\n ViewerConfig,\n} from \"@perspective-dev/viewer\";\nimport type { RegularTableElement } from \"regular-table\";\nimport type { 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 | \"SELECT_ROW_TREE\";\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: ViewerConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _theme: string;\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 _tree_selection_id?: unknown[];\n _last_insert_configs?: ViewConfigUpdate[];\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// 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/src/ts/extensions.js\";\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 positions\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n\n// Centralized editable mode check - used by style handlers and event handlers\nexport function isEditableMode(\n model: DatagridModel,\n viewer: HTMLPerspectiveViewerElement,\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 plugin = viewer.children[0] as DatagridPluginElement | undefined;\n const editable = allowed || plugin?._edit_mode === \"EDIT\";\n return has_pivots && editable;\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 { 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 type { 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 (\n is_numeric &&\n (plugin?.number_fg_mode === \"bar\" ||\n plugin?.number_fg_mode === \"label-bar\")\n ) {\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 anchor = (val as number) >= 0 ? \"\" : \"justify-self:flex-end;\";\n const pct = (a * 100).toFixed(2);\n\n if (plugin.number_fg_mode === \"bar\") {\n const div = this._div_factory.get();\n div.className = \"psp-bar\";\n div.setAttribute(\n \"style\",\n `${anchor}width:${pct}%;height:80%;top:10%;pointer-events:none;background:var(--psp-label-bar-color)`,\n );\n\n return div;\n } else {\n const formatter = FORMAT_CACHE.get(type, plugin);\n const label = formatter ? formatter.format(val) : (val as string);\n\n const div = this._div_factory.get();\n div.className = \"psp-bar\";\n div.setAttribute(\n \"style\",\n `--label:\"${label}\";${anchor}width:${pct}%;height:80%;top:10%;pointer-events:none;background:var(--psp-label-bar-color)`,\n );\n return div;\n }\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 { DatagridModel, RegularTable, Schema } from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport type { ViewConfig, ViewWindow } from \"@perspective-dev/client\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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: HTMLPerspectiveViewerElement,\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 type { ColorRecord } from \"./types.js\";\n\n/** 8-bit sRGB color as `[r, g, b]` with each channel in `[0, 255]`. */\nexport type RGB = [number, number, number];\n\n/** HSL color as `[h, s, l]` with `h` in degrees `[0, 360)` and `s`, `l` in `[0, 1]`. */\nexport type HSL = [number, number, number];\n\nconst parse_cache = new Map<string, RGB>();\nlet parse_ctx: CanvasRenderingContext2D | null = null;\n\n/** Parse a CSS hex color (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`). Returns `null` if `input` is not a hex literal. Alpha is ignored. */\nfunction parse_hex(input: string): RGB | null {\n const s = input.startsWith(\"#\") ? input.slice(1) : input;\n if (s.length === 3 || s.length === 4) {\n const r = parseInt(s[0] + s[0], 16);\n const g = parseInt(s[1] + s[1], 16);\n const b = parseInt(s[2] + s[2], 16);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) return [r, g, b];\n } else if (s.length === 6 || s.length === 8) {\n const r = parseInt(s.slice(0, 2), 16);\n const g = parseInt(s.slice(2, 4), 16);\n const b = parseInt(s.slice(4, 6), 16);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) return [r, g, b];\n }\n return null;\n}\n\n/** Parse a CSS `rgb()` or `rgba()` functional color. Returns `null` if `input` does not match. Alpha is ignored. */\nfunction parse_rgb_fn(input: string): RGB | null {\n const m = input.match(\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)/i,\n );\n if (!m) return null;\n return [\n Math.round(parseFloat(m[1])),\n Math.round(parseFloat(m[2])),\n Math.round(parseFloat(m[3])),\n ];\n}\n\n/** Fallback parser that defers to the browser by assigning `input` to a 2D canvas `fillStyle` and re-reading the normalized value. Handles named colors, `hsl()`, etc. Returns `[0, 0, 0]` if the value is invalid or no canvas context is available. */\nfunction parse_via_canvas(input: string): RGB {\n if (!parse_ctx) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n parse_ctx = canvas.getContext(\"2d\");\n }\n if (!parse_ctx) return [0, 0, 0];\n parse_ctx.fillStyle = \"#000\";\n parse_ctx.fillStyle = input;\n const normalized = parse_ctx.fillStyle as string;\n return parse_hex(normalized) ?? parse_rgb_fn(normalized) ?? [0, 0, 0];\n}\n\n/** Parse any CSS color string into an `RGB` triple. Tries hex and `rgb()` fast paths, then falls back to a canvas-based parser for named colors, `hsl()`, etc. Results are memoized per input. */\nexport function parseColor(input: string): RGB {\n const key = input.trim();\n const cached = parse_cache.get(key);\n if (cached) return cached;\n const rgb = parse_hex(key) ?? parse_rgb_fn(key) ?? parse_via_canvas(key);\n parse_cache.set(key, rgb);\n return rgb;\n}\n\n/** Format a single channel as a clamped, zero-padded two-digit hex byte. */\nfunction toHex(c: number): string {\n const v = Math.max(0, Math.min(255, Math.round(c)));\n return v.toString(16).padStart(2, \"0\");\n}\n\n/** Format an `RGB` triple as a `#rrggbb` hex string. Channels are clamped to `[0, 255]`. */\nexport function rgbToHex([r, g, b]: RGB): string {\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/** Convert sRGB to HSL. Output `h` is in degrees `[0, 360)`; `s` and `l` are in `[0, 1]`. */\nexport function rgbToHsl([r, g, b]: RGB): HSL {\n const rn = r / 255,\n gn = g / 255,\n bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n const d = max - min;\n let h = 0;\n let s = 0;\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === rn) h = ((gn - bn) / d + (gn < bn ? 6 : 0)) * 60;\n else if (max === gn) h = ((bn - rn) / d + 2) * 60;\n else h = ((rn - gn) / d + 4) * 60;\n }\n return [h, s, l];\n}\n\n/** Convert HSL to sRGB. `h` is wrapped into `[0, 360)`; `s` and `l` are expected in `[0, 1]`. Output channels are rounded to integers in `[0, 255]`. */\nexport function hslToRgb([h, s, l]: HSL): RGB {\n const hn = (((h % 360) + 360) % 360) / 360;\n if (s === 0) {\n const v = Math.round(l * 255);\n return [v, v, v];\n }\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const f = (t: number): number => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n return [\n Math.round(f(hn + 1 / 3) * 255),\n Math.round(f(hn) * 255),\n Math.round(f(hn - 1 / 3) * 255),\n ];\n}\n\n/**\n * Blend two `RGB` colors using LRGB (gamma-naive linear) interpolation,\n * matching chroma-js's default `mix` mode. `f` is the weight of `b` in `[0, 1]`\n * (0 returns `a`, 1 returns `b`).\n */\nexport function mixRgb(a: RGB, b: RGB, f = 0.5): RGB {\n return [\n Math.round(Math.sqrt(a[0] * a[0] * (1 - f) + b[0] * b[0] * f)),\n Math.round(Math.sqrt(a[1] * a[1] * (1 - f) + b[1] * b[1] * f)),\n Math.round(Math.sqrt(a[2] * a[2] * (1 - f) + b[2] * b[2] * f)),\n ];\n}\n\n/** 50/50 LRGB blend of CSS color `a` with `RGB`-ish triple `b`, returned as `#rrggbb`. */\nexport function blend(a: string, b: number[]): string {\n return rgbToHex(mixRgb(parseColor(a), [b[0], b[1], b[2]], 0.5));\n}\n\n/** Composite a premultiplied-style `RGBA` cell color over `source` (default white) and return the resulting opaque `RGB`. Used to flatten heatmap cells against 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/** Pick a readable foreground (`#161616` or `#ffffff`) for the given background using a perceptual luminance threshold. */\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\n/** Build a CSS `linear-gradient` that fans `rgb` \u00B115\u00B0 in hue, used as the negative-value swatch in column color pickers. */\nfunction make_gradient(rgb: RGB): string {\n const [h, s, l] = rgbToHsl(rgb);\n const [r, g, b] = rgb;\n const [r1, g1, b1] = hslToRgb([h - 15, s, l]);\n const [r2, g2, b2] = hslToRgb([h + 15, s, l]);\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\n/** Precompute the tuple of derived color strings (RGB channels, gradient, opaque/transparent rgba) cached on the model for a configured plugin color. */\nexport function make_color_record(color: string): ColorRecord {\n const rgb = parseColor(color);\n const _neg_grad = make_gradient(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 { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record, parseColor } 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} from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nfunction arraysChanged<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return true;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return true;\n }\n return false;\n}\n\nfunction nestedArraysChanged<T>(a: T[][], b: T[][]): boolean {\n if (a.length !== b.length) return true;\n for (let i = 0; i < a.length; i++) {\n if (a[i].length !== b[i].length) return true;\n for (let j = 0; j < a[i].length; j++) {\n if (a[i][j] !== b[i][j]) return true;\n }\n }\n return false;\n}\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 theme: string,\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 const group_by_changed = arraysChanged(old.group_by, config.group_by);\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n const split_by_changed = arraysChanged(old.split_by, config.split_by);\n const columns_changed = arraysChanged(old.columns, config.columns);\n const filter_changed = nestedArraysChanged(\n old.filter as unknown[][],\n config.filter as unknown[][],\n );\n\n const sort_changed = nestedArraysChanged(\n old.sort as unknown[][],\n config.sort as unknown[][],\n );\n\n const group_rollup_mode_changed =\n old.group_rollup_mode !== config.group_rollup_mode;\n\n const theme_changed = this.model._theme !== theme;\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 theme_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 HTMLPerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = parseColor(\n get_rule(regular, \"--psp--background-color\", \"#FFFFFF\"),\n );\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--psp-datagrid--pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--psp-datagrid--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, \"--psp-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 let _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n\n if (\n _edit_mode === \"SELECT_ROW_TREE\" &&\n (config.group_by.length === 0 || config.group_rollup_mode === \"flat\")\n ) {\n _edit_mode = \"READ_ONLY\";\n this._edit_mode = _edit_mode;\n }\n\n this._edit_button!.dataset.editMode = _edit_mode;\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 _theme: theme,\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(\n this.parentElement as HTMLPerspectiveViewerElement,\n ).bind(model, regular) 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 type {\n DatagridModel,\n DatagridPluginElement,\n EditMode,\n} 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 \"SELECT_ROW_TREE\",\n] as const;\n\nfunction isSelectRowTreeAvailable(model?: DatagridModel): boolean {\n if (!model) return false;\n return (\n model._config.group_by.length > 0 &&\n model._config.group_rollup_mode !== \"flat\"\n );\n}\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n let idx = EDIT_MODES.indexOf(this._edit_mode);\n do {\n idx = (idx + 1) % EDIT_MODES.length;\n } while (\n EDIT_MODES[idx] === \"SELECT_ROW_TREE\" &&\n !isSelectRowTreeAvailable(this.model)\n );\n mode = EDIT_MODES[idx];\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._tree_selection_id = undefined;\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\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 regular_table = this.regular_table as RegularTableWithOverrides;\n const overrides: Record<number, number | undefined> = {\n ...regular_table.saveColumnSizes(),\n };\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 // Skip keys that don't resolve to a known column \u2014 e.g. on the\n // first draw after `activate`, `_column_paths` has not yet been\n // populated by the data listener, so we leave any existing\n // `regular-table` widths untouched rather than clobbering them\n // with garbage indices.\n if (index === -1) {\n continue;\n }\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n regular_table.restoreColumnSizes(overrides);\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 { get_psp_type, type DatagridModel } from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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 model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\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 (model._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 model: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth =\n model._config.group_by.length -\n (model._config.group_rollup_mode === \"flat\" ? 1 : 0);\n\n const selectedColumn = model._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?.[model._config.split_by.length];\n\n const sort = model._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) % model._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(model, 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 === model._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 === model._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 (model._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 type { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SortRotationOrder, SortTerm } from \"../types.js\";\nimport type { SortDir } from \"@perspective-dev/client\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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};\n\nexport async function sortHandler(\n model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\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[model._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(model, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n model: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of model._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort(model, 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 model: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of model._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort(model, 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 model: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = model._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 model: 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 model._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n model._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n model._view.collapse(meta.y);\n } else {\n model._view.expand(meta.y);\n }\n\n model._num_rows = await model._view.num_rows();\n model._num_columns = await model._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 { RegularTable, DatagridModel } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createMousedownListener(\n model: DatagridModel,\n regularTable: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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 if (model._edit_mode !== \"SELECT_ROW_TREE\") {\n expandCollapseHandler(model, regularTable, mouseEvent);\n }\n\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name =\n meta?.column_header?.[model._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler(model, regularTable, viewer, mouseEvent, target);\n }\n };\n}\n\nexport function createDblclickListener(\n model: DatagridModel,\n regularTable: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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 if (model._edit_mode === \"SELECT_ROW_TREE\") {\n expandCollapseHandler(model, regularTable, mouseEvent);\n }\n }\n };\n}\n\nexport function createClickListener(regularTable: RegularTable): EventListener {\n return (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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 (\n target.classList.contains(\"psp-tree-label\") &&\n mouseEvent.offsetX < 26\n ) {\n mouseEvent.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n mouseEvent.stopImmediatePropagation();\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 { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n get_psp_type,\n} from \"../../types.js\";\n\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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 model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\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 = model._is_editable[meta.x];\n const is_bool = get_psp_type(model, 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, model, 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 { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n SelectedPosition,\n SelectedPositionMap,\n} from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createFocusoutListener(\n model: DatagridModel,\n table: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const focusEvent = event as FocusEvent;\n if (isEditableMode(model, viewer) && selected_position_map.has(table)) {\n const target = focusEvent.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, model, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n };\n}\n\nexport function createFocusinListener(\n _model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const focusEvent = event as FocusEvent;\n const target = focusEvent.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}\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, SelectedPositionMap } from \"../types.js\";\nimport { CollectedCell } 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 _model: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: SelectedPositionMap,\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: SelectedPositionMap,\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 SelectedPositionMap,\n} from \"../../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\ntype AsyncMoveFunction = (\n model: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n) => Promise<void | undefined>;\n\nfunction lock(body: AsyncMoveFunction): AsyncMoveFunction {\n let lockPromise: Promise<void> | undefined;\n return async function (\n model: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n ): Promise<void | 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(\n model,\n table,\n selected_position_map,\n active_cell,\n dx,\n dy,\n );\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(elem: ContentEditableElement): number {\n if (elem.isContentEditable) {\n const _range = (elem.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) return 0;\n const range = _range.cloneRange();\n range.selectNodeContents(elem);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return elem.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n model: 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 = model._column_paths.length;\n const num_rows = model._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 model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\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(model, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n break;\n case \"ArrowLeft\":\n if (getPos(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(model, table, selected_position_map, target, 0, -1);\n break;\n case \"ArrowRight\":\n if (\n getPos(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(model, table, selected_position_map, target, 0, 1);\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 { DatagridModel, SelectedPositionMap } from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createKeydownListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const keyEvent = event as KeyboardEvent;\n if (model._edit_mode === \"EDIT\") {\n if (!isEditableMode(model, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener(\n model,\n table,\n viewer,\n selected_position_map,\n keyEvent,\n );\n } else {\n console.debug(\n `Mode ${model._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n };\n}\n\nexport function createEditClickListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (model._edit_mode === \"EDIT\") {\n if (!isEditableMode(model, viewer)) {\n return;\n }\n\n edit_click.clickListener(model, table, viewer, mouseEvent);\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 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 { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type { DatagridModel, PerspectiveClickDetail } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createDispatchClickListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta || meta.type !== \"body\") return;\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(model, 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}\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 EditMode,\n SelectionArea,\n} from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport type { ViewWindow } from \"@perspective-dev/client\";\nimport type { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\nexport type OnSelectCallback = (\n area: SelectionArea,\n isDeselect: boolean,\n) => void;\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n onSelect?: OnSelectCallback;\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n onSelect,\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, onSelect),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nfunction isSingleClickMode(mode: EditMode): boolean {\n return mode === \"SELECT_ROW_TREE\";\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 isSelectionMode(datagrid.model!._edit_mode)\n ) {\n if (isSingleClickMode(datagrid.model!._edit_mode)) return;\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 const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode) && !isSingleClickMode(mode)) {\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 onSelect?: OnSelectCallback,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode)) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) return;\n\n // For single-click modes (SELECT_ROW_TREE), handle toggle\n if (isSingleClickMode(mode)) {\n if (\n (meta.type === \"body\" || meta.type === \"row_header\") &&\n meta.y !== undefined &&\n meta.y >= 0\n ) {\n const existing =\n datagrid.model!._selection_state.selected_areas;\n const isSameRow =\n existing.length > 0 && existing[0].y0 === meta.y;\n\n if (isSameRow) {\n // Deselect\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.dirty = true;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n [],\n );\n onSelect?.(existing[0], true);\n } else {\n // Select new row\n const area: SelectionArea = {\n x0: 0,\n x1: 0,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.selected_areas = [\n area,\n ];\n datagrid.model!._selection_state.dirty = true;\n applyMouseAreaSelections(datagrid, table, className);\n onSelect?.(area, false);\n }\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n return;\n }\n\n // Drag-based modes (SELECT_ROW, SELECT_COLUMN, SELECT_REGION)\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 modeIncludesColumns(mode: EditMode): boolean {\n return mode === \"SELECT_COLUMN\" || mode === \"SELECT_REGION\";\n}\n\nfunction modeIncludesRows(mode: EditMode): boolean {\n return (\n mode === \"SELECT_ROW\" ||\n mode === \"SELECT_REGION\" ||\n mode === \"SELECT_ROW_TREE\"\n );\n}\n\nfunction set_psp_selection(\n viewer: HTMLPerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (x0 !== undefined && modeIncludesColumns(mode)) {\n viewport.start_col = x0;\n }\n\n if (x1 !== undefined && modeIncludesColumns(mode)) {\n viewport.end_col = x1 + 1;\n }\n\n if (y0 !== undefined && modeIncludesRows(mode)) {\n viewport.start_row = y0;\n }\n\n if (y1 !== undefined && modeIncludesRows(mode)) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\ntype CellPredicate = (meta: CellMetadataBody, area: SelectionArea) => boolean;\n\nconst SELECTION_PREDICATES: Record<string, CellPredicate> = {\n SELECT_REGION: (m, a) =>\n a.x0 <= m.x && m.x <= a.x1 && a.y0 <= m.y && m.y <= a.y1,\n SELECT_ROW: (m, a) => a.y0 <= m.y && m.y <= a.y1,\n SELECT_ROW_TREE: (m, a) => a.y0 <= m.y && m.y <= a.y1,\n SELECT_COLUMN: (m, a) => a.x0 <= m.x && m.x <= a.x1,\n};\n\nfunction isSelectionMode(mode: EditMode): boolean {\n return (\n mode === \"SELECT_REGION\" ||\n mode === \"SELECT_ROW\" ||\n mode === \"SELECT_COLUMN\" ||\n mode === \"SELECT_ROW_TREE\"\n );\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode)) {\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 if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as HTMLPerspectiveViewerElement,\n datagrid,\n selected[0],\n );\n\n // SELECT_ROW_TREE styling is handled entirely by the\n // identity-based system in body.ts, which styles both td\n // and th uniformly in a single draw pass.\n if (!isSingleClickMode(mode)) {\n applyMouseAreaSelection(datagrid, table, selected, className);\n }\n } else {\n (\n datagrid.parentElement as HTMLPerspectiveViewerElement\n ).setSelection();\n const tds = table.querySelectorAll(\"tbody td\");\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 cells = table.querySelectorAll(\"tbody td, tbody th\");\n for (const cell of cells) {\n cell.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n const predicate = SELECTION_PREDICATES[datagrid.model!._edit_mode];\n if (!predicate || selected.length === 0) return;\n const tds = table.querySelectorAll(\"tbody td\");\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 area of selected) {\n if (\n area.x0 !== undefined &&\n area.y0 !== undefined &&\n area.x1 !== undefined &&\n area.y1 !== undefined &&\n predicate(meta, area)\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\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 } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n model: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) return;\n\n // Style selected column for settings panel\n const selectedColumn = model._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 = model._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n styleColumnHeaderRow(model, colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = model._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n styleColumnHeaderRow(model, 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 model: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = model._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-color-mode-label-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 model: 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 = model._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 model.last_reverse_columns?.has(metadata_path) &&\n model.last_reverse_ids?.has(id)\n ) {\n const row_idx = model.last_reverse_ids?.get(id);\n const col_idx = model.last_reverse_columns.get(metadata_path);\n if (!model._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (model.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 (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (model.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 model: 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 = model._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 = model._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 model._plugin_background[0],\n model._plugin_background[1],\n model._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 = model._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(\n model,\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 model._plugin_background[0],\n model._plugin_background[1],\n model._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? model._pos_fg_color\n : is_negative\n ? model._neg_fg_color\n : [\n \"\",\n model._plugin_background[0],\n model._plugin_background[1],\n model._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 = model._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 td.style.setProperty(\"--psp-label-bar-color\", gradhex);\n td.style.setProperty(\"--psp-label-bar-bg\", hex);\n } else if (plugin?.number_fg_mode === \"label-bar\") {\n td.style.color = \"\";\n td.style.setProperty(\"--psp-label-bar-color\", gradhex);\n td.style.setProperty(\"--psp-label-bar-bg\", hex);\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 {\n hslToRgb,\n infer_foreground_from_background,\n parseColor,\n rgbaToRgb,\n rgbToHex,\n rgbToHsl,\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 model: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[model._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return model._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 = model._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 (!model._series_color_map.has(column_name)) {\n model._series_color_map.set(column_name, new Map());\n model._series_color_seed.set(column_name, 0);\n }\n\n const series_map = model._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = model._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n model._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n const [h, s, l] = rgbToHsl(parseColor(hex));\n const rotated = hslToRgb([h + ((color_seed * 150) % 360), s, l]);\n const [r2, g2, b2] = rotated;\n const hex2 = rgbToHex(rotated);\n const source = model._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\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_datetime(\n model: DatagridModel,\n plugin: PluginWithColor,\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 model._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 = model._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 model: 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 ? model._pos_fg_color\n : metadata.user === false\n ? model._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 model: 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) >= model._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 ColumnsConfig,\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 { CollectedCell } from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n model: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n): void {\n const selectedId = isSelectable ? model._tree_selection_id : undefined;\n\n regularTable.classList.toggle(\n \"flat-group-rollup-mode\",\n model._config.group_rollup_mode === \"flat\",\n );\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[model._config.split_by.length];\n const type = get_psp_type(model, 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 =\n model._config.group_rollup_mode === \"rollup\" &&\n ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n model._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(\n model,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean(model, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string(model, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime(model, plugin as any, td, metadata);\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 (model._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === model._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 td.classList.toggle(\n \"psp-color-mode-label-bar\",\n plugin?.number_fg_mode === \"label-bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header(model, 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 tree selection styling (SELECT_ROW_TREE).\n // psp-select-region-inactive is exclusively a tree-selection class,\n // so always clean it up. psp-select-region is shared with the\n // coordinate-based selection modes, so only touch it when in\n // SELECT_ROW_TREE mode (isSelectable).\n td.classList.toggle(\"psp-select-region-inactive\", false);\n if (isSelectable) {\n if (!selectedId) {\n td.classList.toggle(\"psp-select-region\", false);\n } else {\n const id = model._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = selectedId.reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const isExact = id.length === selectedId.length && key_match;\n const isSub = id.length !== selectedId.length && key_match;\n\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-select-region\", false);\n } else {\n td.classList.toggle(\"psp-select-region\", isExact);\n td.classList.toggle(\n \"psp-select-region-inactive\",\n isSub,\n );\n }\n } else {\n td.classList.toggle(\"psp-select-region\", isExact);\n td.classList.toggle(\"psp-select-region-inactive\", isSub);\n }\n }\n } else {\n td.classList.toggle(\"psp-select-region\", false);\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && model._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[model._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 ColumnsConfig,\n DatagridPluginElement,\n SelectedPositionMap,\n} from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nimport { applyFocusStyle } from \"./focus.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\";\nimport { CollectedCell, CollectedHeaderRow } from \"./types.js\";\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 model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n selectedPositionMap: SelectedPositionMap,\n): () => void {\n return function consolidatedStyleListener(): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = model._edit_mode === \"SELECT_ROW_TREE\";\n const isEditable = isEditableMode(model, viewer);\n const isEditableAllowed = isEditableMode(model, 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 (\n metadata &&\n (metadata.type === \"body\" ||\n metadata.type === \"row_header\")\n ) {\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 applyBodyCellStyles(\n model,\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n );\n\n applyGroupHeaderStyles(model, groupHeaderRows, regularTable);\n applyColumnHeaderStyles(model, groupHeaderRows, regularTable, viewer);\n applyFocusStyle(model, bodyCells, regularTable, selectedPositionMap);\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_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n createMousedownListener,\n createClickListener,\n createDblclickListener,\n} from \"../event_handlers/header_click.js\";\n\nimport {\n createFocusinListener,\n createFocusoutListener,\n} from \"../event_handlers/focus.js\";\nimport {\n createKeydownListener,\n createEditClickListener,\n} from \"../event_handlers/click.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { createDispatchClickListener } from \"../event_handlers/dispatch_click.js\";\n\nimport {\n addAreaMouseSelection,\n type OnSelectCallback,\n} from \"../event_handlers/select_region.js\";\n\nimport { createConsolidatedStyleListener } from \"../style_handlers/consolidated.js\";\n\nimport getCellConfig from \"../get_cell_config.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport {\n type DatagridPluginElement,\n type SelectedPositionMap,\n type SelectionArea,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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 HTMLPerspectiveViewerElement;\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 viewer.getAttribute(\"theme\")!,\n );\n\n if (!this.model) {\n return;\n }\n\n const model = this.model;\n const regularTable = this.regular_table;\n const onSelect: OnSelectCallback = async (\n area: SelectionArea,\n isDeselect: boolean,\n ) => {\n if (model._edit_mode !== \"SELECT_ROW_TREE\") return;\n\n // Store the selected row identity on the model so it persists\n // even when the selected row scrolls out of the viewport.\n if (isDeselect) {\n model._tree_selection_id = undefined;\n } else {\n const idx = area.y0 - (model._last_window?.start_row ?? 0);\n if (idx >= 0 && idx < model._ids.length) {\n model._tree_selection_id = model._ids[idx];\n }\n }\n\n const { row, column_names, config } = await getCellConfig(\n model,\n area.y0,\n 0,\n );\n\n let detail: PerspectiveSelectDetail;\n if (isDeselect) {\n if ((model._last_insert_configs?.length || 0) > 0) {\n detail = new PerspectiveSelectDetail(\n false,\n row,\n [],\n model._last_insert_configs ?? [],\n [],\n );\n } else {\n throw new Error(\"Suprious deselect\");\n }\n\n model._last_insert_configs = undefined;\n } else {\n detail = new PerspectiveSelectDetail(\n true,\n row,\n column_names,\n model._last_insert_configs ?? [],\n [config],\n );\n model._last_insert_configs = [config];\n }\n\n await regularTable.draw({ preserve_width: true });\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\n \"perspective-global-filter\",\n {\n bubbles: true,\n composed: true,\n detail,\n },\n ),\n );\n };\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n onSelect,\n });\n\n // Create shared state map for focus tracking\n const selected_position_map: SelectedPositionMap = new WeakMap();\n\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"click\",\n createClickListener(this.regular_table),\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n createDispatchClickListener(this.model, this.regular_table, viewer),\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n createMousedownListener(this.model, this.regular_table, viewer),\n );\n\n this.regular_table.addEventListener(\n \"dblclick\",\n createDblclickListener(this.model, this.regular_table, viewer),\n );\n\n // Editing event handlers\n this.regular_table.addEventListener(\n \"click\",\n createEditClickListener(this.model, this.regular_table, viewer),\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n createFocusinListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n createFocusoutListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n createKeydownListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\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(\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 viewer.getAttribute(\"theme\")!,\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\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 type { 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{--psp-datagrid--hover--border-color:var(--psp-inactive--color,#c5c9d080);margin:12px 0 0 12px;padding:0;font-family:inherit;& div[tabindex]{outline:none}&>div{position:absolute;inset:0;overflow:hidden}& th{text-align:center}& thead tr:not(.rt-autosize) th{max-width:0;overflow:hidden}& thead tr:last-child .rt-float,& tbody .rt-float,& thead .rt-integer,& tbody .rt-integer{text-align:right}& tbody th{text-align:left}& span.rt-tree-container{align-items:center;height:100%;display:flex}& thead .rt-string,& tbody .rt-string,& thead .rt-date,& tbody .rt-date,& thead .rt-datetime,& tbody .rt-datetime{text-align:left}& thead tr:last-child th{border-bottom:1px solid #8b868045}& tbody tr:first-child td,& tbody tr:first-child th{border-top:1px solid #0000!important}& th{position:relative}& tr th span.rt-tree-group{border-left:1px solid #eee;height:100%;margin-left:5px;margin-right:15px}& td,& th{white-space:nowrap;height:var(--psp-datagrid--row--height,19px);padding:0 5px}& table *{box-sizing:border-box}& table{color:#666;outline:none;position:absolute}& span.rt-row-header-icon{color:#aaa;font-family:var(--psp-button--font-family);padding-right:4px}& span.rt-column-header-icon{width:10px;font-size:10px;font-family:var(--psp-button--font-family);padding-left:3px;display:inline-block}& span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0 0 3px #1a7da1}& .rt-selected td{background-color:#eee}& .rt-cell-clip{text-overflow:ellipsis;overflow:hidden}& td span.rt-group-name,& th span.rt-group-name{flex:1;height:100%;margin-right:-5px;padding-left:8px;padding-right:5px}& th span.rt-group-name{text-align:left}& td th span.rt-group-leaf,& th span.rt-group-leaf{height:100%;margin-left:16px}& .rt-column-resize{cursor:col-resize;width:10px;height:100%;position:absolute;top:0;right:0}& a{color:var(--psp-datagrid--pos-cell--color)}& a:visited{color:var(--psp-active--color)}& td.psp-null:after,& th.psp-null:after{content:var(--psp-label--null--content,\"-\");color:var(--psp-label--null--color,inherit);font-size:var(--psp-label--null--font-size,inherit);vertical-align:middle}}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--psp-inactive--border-color,#8b868045)}.psp-header-group{box-shadow:0px 10px 0 -9px var(--psp-inactive--border-color,#8b868045)}.psp-is-top{box-shadow:5px 4px 0px -4px var(--psp-inactive--border-color,#8b868045)}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--psp-inactive--border-color,#8b868045), 0px 10px 0 -9px var(--psp-inactive--border-color,#8b868045)}.psp-header-border.psp-header-group{&:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--psp-inactive--border-color,#8b868045), 0px 10px 0 -9px var(--psp-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(--psp-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(--psp-inactive--border-color,#8b868045)}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--psp-inactive--border-color,#8b868045)}tr:only-child th{box-shadow:none!important}regular-table{& tbody{& tr:hover th.psp-tree-leaf:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover th.psp-tree-label:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover td:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover:after{box-shadow:0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080);border-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important;&.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), 0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080)}}& tr:last-child:hover td:not(.psp-select-region):not(.psp-select-region-inactive).psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), inset 0px -2px 0px var(--psp--color), 0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080)}& tr:hover+tr th.psp-tree-leaf:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover+tr th.psp-tree-label:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover+tr td:not(.psp-select-region):not(.psp-select-region-inactive){border-top-color:#0000}& tr{& th:first-child:not(:empty),& th:first-child:empty+th:not(:empty),& th:first-child:empty~th:empty+th:not(:empty),& td:first-child{border-left-width:1px;border-left-color:#0000}& th:last-child,& td:last-child{border-right-width:0;border-right-color:#0000}}& tr:hover{color:inherit;& th:first-child:not(:empty),& th:first-child:empty+th:not(:empty),& th:first-child:empty~th:empty+th:not(:empty),& td:first-child{border-left-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important}& th:last-child,& td:last-child{border-right-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important}}}}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table,:host(:not(.sub-cell-scroll-disabled)) regular-table table{& tbody td,& thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px))}& tbody{transform:translate(0, var(--regular-table--transform-y,0px))}& tbody tr:first-child{& td,& th,&:after{clip-path:polygon(0 var(--regular-table--clip-y,0), 0 200%, 200% 200%, 200% var(--regular-table--clip-y,0))}}& 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)}& 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))}& thead tr:last-child:after,& tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px))}& 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))}& 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;&::-webkit-scrollbar,&::-webkit-scrollbar-corner{background-color:#0000;width:12px;height:12px}&::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--psp--color);border:5.5px solid var(--psp--background-color);min-width:10%;max-width:50%;min-height:10%;max-height:50%}}perspective-viewer,:host{& .psp-menu-enabled{border-radius:3px 3px 0 0;padding:0 6px;font-size:8px}& .psp-menu-enabled:hover,& tr:not(.rt-autosize) th.psp-menu-open{color:var(--psp--background-color);background-color:var(--psp--color);border-bottom-color:var(--psp--color);cursor:pointer}& tr:not(.rt-autosize) th.psp-menu-open{&:before{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:10px;height:8px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--column-settings--mask-image);mask-image:var(--psp-icon--column-settings--mask-image);background-color:var(--psp--background-color);margin-right:4px;display:inline-block}}& td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color)}& tr:first-child td.psp-menu-open{border-top-color:var(--psp--color)!important}& tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), inset 0px -2px 0px var(--psp--color)}}perspective-viewer,:host-context(perspective-viewer){& regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--psp-inactive--border-color,#8b868045)}}.psp-sort-enabled:hover{cursor:pointer}regular-table.flat-group-rollup-mode.vertical-row-headers th.psp-tree-label:not(:last-of-type){writing-mode:vertical-lr}.psp-select-region-inactive,:hover .psp-select-region-inactive,:hover th.psp-tree-leaf.psp-select-region-inactive,:hover th.psp-tree-label.psp-select-region-inactive{background-color:var(--psp-inactive--color)!important;color:var(--psp--background-color)!important;border-color:var(--psp--background-color)!important}.psp-error{color:red}td:focus{outline:1px dotted #666}perspective-viewer.dragging,:host-context(perspective-viewer.dragging){& regular-table{pointer-events:none}}.psp-header-border:last-child{border-right-width:0}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-desc--mask-image);mask-image:var(--psp-icon--sort-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-asc--mask-image);mask-image:var(--psp-icon--sort-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-col-desc--mask-image);mask-image:var(--psp-icon--sort-col-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-col-asc--mask-image);mask-image:var(--psp-icon--sort-col-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-desc--mask-image);mask-image:var(--psp-icon--sort-abs-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-asc--mask-image);mask-image:var(--psp-icon--sort-abs-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-col-desc--mask-image);mask-image:var(--psp-icon--sort-abs-col-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-col-asc--mask-image);mask-image:var(--psp-icon--sort-abs-col-asc--mask-image);margin-left:4px;display:inline-block}tbody th:last-of-type{border-right:1px solid var(--psp-inactive--border-color,#8b868045);text-overflow:ellipsis;overflow:hidden}tbody th:empty{background-image:linear-gradient(to right, transparent 9px, var(--psp-inactive--border-color,#eee) 10px, transparent 11px);pointer-events:none;background-repeat:no-repeat;min-width:20px;max-width:20px}regular-table:not(.flat-group-rollup-mode){& .psp-tree-label{min-width:0;max-width:0}& .psp-tree-label:before{color:var(--psp--color);font-family:var(--psp-button--font-family,inherit);padding-right:11px}& .psp-tree-label-expand:before{content:var(--psp-label--tree-expand--content,\"+\")}& .psp-tree-label-collapse:before{content:var(--psp-label--tree-collapse--content,\"-\")}& .psp-tree-label-expand,& .psp-tree-label-collapse{cursor:pointer}& .psp-tree-label:hover:before{color:var(--psp-active--color);text-shadow:0px 0px 5px var(--psp-active--color)}}.psp-tree-leaf{padding-left:24px}.psp-align-right{text-align:right}.psp-color-mode-bar{padding:0 2px}.psp-color-mode-label-bar{padding:0 2px;position:relative;& .psp-bar{isolation:isolate;position:unset}& .psp-bar:before{color:#0000;pointer-events:none;content:var(--label);justify-content:flex-end;align-items:center;padding:0 3px;display:inline-flex}& .psp-bar:after{color:var(--psp-label-bar-bg);content:var(--label);mix-blend-mode:difference;justify-content:flex-end;align-items:center;padding:0 5px;display:inline-flex;position:absolute;inset:0}}.psp-label-bar{pointer-events:none;justify-content:flex-end;align-items:center;padding:0;display:flex;inset:0}.psp-label-bar-fill{background:var(--psp-label-bar-color);pointer-events:none;height:80%;position:absolute;top:10%}.psp-label-bar-text{color:var(--psp-label-bar-bg);mix-blend-mode:difference;pointer-events:none;position:relative}.psp-align-left{text-align:left}.psp-positive:not(:focus){color:var(--psp-datagrid--pos-cell--color)}.psp-negative:not(:focus){color:var(--psp-datagrid--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-width:1px 1px 0 0}.boolean-editable{cursor:pointer}regular-table table{user-select:none;color:inherit;border-collapse:separate;font-size:1em;& th{font-weight:400}& td,& th{border-color:var(--psp-inactive--border-color,#8b868045);height:var(--psp-datagrid--row--height,23px)}& .psp-header-group{text-overflow:ellipsis}& th.psp-header-leaf{border-bottom-width:0;& span{height:var(--psp-datagrid--row--height,23px);min-height:var(--psp-datagrid--row--height,23px)}}& td,& th.psp-tree-label,& th.psp-tree-label,& th.psp-tree-leaf,& tbody tr:first-child th{border-style:solid;border-width:1px 0 0}& tbody th:empty{background-position:0 -10px}& td.psp-select-region,& th.psp-select-region{background-color:var(--psp--color)!important;color:var(--psp--background-color)!important;border-color:var(--psp--background-color)!important}}regular-table tbody tr:hover td.psp-select-region:not(.psp-select-region-inactive),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-select-region-inactive){border-color:var(--psp--background-color)!important}regular-table tbody tr:hover{& td.psp-select-region.psp-menu-open{&:not(.psp-select-region-inactive){box-shadow:inset -2px 0px 0px var(--psp--background-color), inset 2px 0px 0px var(--psp--background-color)}}}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--background-color), inset 2px 0px 0px var(--psp--background-color)}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--psp-datagrid--column-edit-button--content,\"Edit\")}perspective-viewer:not([settings]),:host-context(perspective-viewer:not([settings])){& regular-table #psp-column-edit-buttons:after{content:none}}regular-table table thead tr:last-child:after{box-sizing:border-box;width:10000px;height:var(--psp-datagrid--row--height,23px);content:\" \";border-bottom:1px solid var(--psp-inactive--border-color);display:block}regular-table table tbody tr:after{box-sizing:border-box;width:10000px;height:var(--psp-datagrid--row--height,23px);content:\" \";border-top:1px solid #0000;display:block}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--psp-inactive--border-color)}regular-table table tbody tr:hover:not(:first-child):after,regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--psp-datagrid--hover--border-color)}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,#0080ff80)}to{background-color:var(--pulse--background-color-end,#0080ff00)}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,#0080ff80)}to{background-color:var(--pulse--background-color-end,#0080ff00)}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,#ff190080)}to{background-color:var(--pulse--background-color-end,#ff190000)}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,#ff190080)}to{background-color:var(--pulse--background-color-end,#ff190000)}}", "// \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 {\n HTMLPerspectiveViewerElement,\n IPerspectiveViewerPlugin,\n} from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\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 HTMLPerspectiveViewerElement;\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(_view: View): 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 save(): any {\n return save.call(this);\n }\n\n restore(token: DatagridPluginConfig, columns_config?: ColumnsConfig): void {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(view: View): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(view);\n }\n }\n\n delete(): 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{height:100%;display:block;position:relative}:host #container{flex-direction:column;justify-content:stretch;align-items:stretch;display:flex;position:absolute;inset:0}:host #toolbar{align-items:stretch;height:100%;display:flex}:host #toolbar .hover-target{cursor:pointer;align-items:center;margin:0;display:inline-flex;&:hover{box-shadow:-4px 0 0 var(--psp--color), 4px 0 0 var(--psp--color);background-color:var(--psp--color)}}:host #slot-container{flex:1;position:relative}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--psp-toolbar-scroll-lock-active--content)}#scroll_lock:before{-webkit-mask-image:var(--psp-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(--psp-toolbar-edit-mode-read-only--content)}#edit_mode[data-edit-mode=EDIT]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-edit--content)}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=EDIT]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-read-only--content)}#edit_mode[data-edit-mode=SELECT_ROW]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-row--content)}#edit_mode[data-edit-mode=SELECT_COLUMN]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-column--content)}#edit_mode[data-edit-mode=SELECT_REGION]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-region--content)}#edit_mode[data-edit-mode=SELECT_ROW_TREE]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-row-tree--content)}#edit_mode[data-edit-mode=READ_ONLY] span:before{content:var(--psp-label--edit-mode-read-only--content,\"Read Only\")}#edit_mode[data-edit-mode=EDIT] span:before{content:var(--psp-label--edit-mode-edit--content,\"Editable\")}#edit_mode[data-edit-mode=SELECT_ROW] span:before{content:var(--psp-label--edit-mode-select-row--content,\"Row Select\")}#edit_mode[data-edit-mode=SELECT_COLUMN] span:before{content:var(--psp-label--edit-mode-select-column--content,\"Column Select\")}#edit_mode[data-edit-mode=SELECT_REGION] span:before{content:var(--psp-label--edit-mode-select-region--content,\"Region Select\")}#edit_mode[data-edit-mode=SELECT_ROW_TREE] span:before{content:var(--psp-label--edit-mode-select-row-tree--content,\"Tree Select\")}#scroll_lock span:before{content:var(--psp-label--scroll-lock-toggle--content,\"Free Scroll\")}#scroll_lock.lock-scroll span:before{content:var(--psp-label--scroll-lock-alt-toggle--content,\"Align Scroll\")}.button:before{content:\"\";background-color:var(--psp--color);width:21px;height:21px;-webkit-mask-size:cover;mask-size:cover}.button.editable:before,.button.lock-scroll:before{color:inherit}.button{user-select:none;box-sizing:border-box;font-size:var(--label--font-size,.75em);white-space:nowrap;border:1px solid #0000;border-radius:3px;justify-content:center;align-items:center;width:37px;height:22px;padding:0 5px;display:inline-flex}.button>span{margin:0;padding:0;display:none}.hover-target:focus-within .button,.hover-target:hover .button{background-color:var(--psp--color);color:var(--psp--background-color);opacity:1;cursor:pointer;align-items:center;display:flex;position:relative}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--psp--background-color)}.hover-target:focus-within .button>span,.hover-target:hover .button>span{white-space:pre-wrap;background-color:var(--psp--color);text-align:center;border-radius:0 0 3px 3px;width:35px;height:auto;margin:0;padding:5px;font-size:9px;line-height:1;display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%}", "// \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 { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type { DatagridPluginElement } 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 HTMLPerspectiveViewerElement;\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\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": ["PerspectiveSelectDetail", "get_psp_type", "model", "metadata", "PRIVATE_PLUGIN_SYMBOL", "isEditableMode", "viewer", "allowed", "has_pivots", "plugin", "editable", "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", "a", "anchor", "pct", "div", "formatter", "label", "bold", "italic", "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", "parse_cache", "parse_ctx", "parse_hex", "input", "s", "r", "g", "b", "parse_rgb_fn", "m", "parse_via_canvas", "canvas", "normalized", "parseColor", "key", "cached", "rgb", "toHex", "c", "rgbToHex", "rgbToHsl", "rn", "gn", "bn", "max", "min", "l", "d", "h", "hslToRgb", "hn", "v", "q", "p", "f", "t", "mixRgb", "a", "blend", "rgbaToRgb", "source", "i", "infer_foreground_from_background", "make_gradient", "r1", "g1", "b1", "r2", "g2", "b2", "make_color_record", "color", "_neg_grad", "arraysChanged", "a", "b", "i", "nestedArraysChanged", "j", "get_rule", "regular", "tag", "def", "color", "ElemFactoryImpl", "name", "elem", "createModel", "table", "view", "theme", "extend", "config", "old", "group_by_changed", "type_changed", "split_by_changed", "columns_changed", "filter_changed", "sort_changed", "group_rollup_mode_changed", "theme_changed", "table_schema", "num_rows", "schema", "expression_schema", "_edit_port", "_plugin_background", "parseColor", "_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", "isSelectRowTreeAvailable", "model", "toggle_edit_mode", "mode", "idx", "toggle_scroll_lock", "force", "restore_column_size_overrides", "old_sizes", "cache", "regular_table", "overrides", "group_by", "tree_header_offset", "key", "index", "save_column_size_overrides", "x", "numKey", "style_selected_column", "model", "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", "model", "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", "model", "regularTable", "event", "meta", "is_collapse", "x", "createMousedownListener", "model", "regularTable", "viewer", "event", "mouseEvent", "target", "expandCollapseHandler", "column_name", "sortHandler", "createDblclickListener", "createClickListener", "write_cell", "table", "model", "active_cell", "meta", "type", "text", "id", "parsed", "msg", "clickListener", "_viewer", "event", "is_editable2", "is_bool", "get_psp_type", "is_null", "createFocusoutListener", "model", "table", "viewer", "selected_position_map", "event", "focusEvent", "isEditableMode", "target", "selectedPosition", "write_cell", "createFocusinListener", "_model", "_viewer", "meta", "new_state", "applyFocusStyle", "_model", "cells", "regularTable", "selectedPositionMap", "selected_position", "host", "td", "metadata", "focusSelectedCell", "tbody", "tr", "cell", "lock", "body", "lockPromise", "model", "table", "selected_position_map", "active_cell", "dx", "dy", "resolve", "x", "result", "getPos", "elem", "_range", "range", "moveSelection", "meta", "num_columns", "num_rows", "selected_position", "xmin", "xmax", "ymin", "ymax", "y", "focusSelectedCell", "isLastCell", "target", "keydownListener", "_viewer", "event", "createKeydownListener", "model", "table", "viewer", "selected_position_map", "event", "keyEvent", "isEditableMode", "keydownListener", "createEditClickListener", "mouseEvent", "clickListener", "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", "createDispatchClickListener", "model", "table", "viewer", "event", "mouseEvent", "meta", "x", "y", "row", "column_names", "config", "getCellConfig", "MOUSE_SELECTED_AREA_CLASS", "addAreaMouseSelection", "datagrid", "table", "className", "selected", "onSelect", "getMousedownListener", "getMouseoverListener", "getMouseupListener", "applyMouseAreaSelections", "isSingleClickMode", "mode", "event", "mouseEvent", "isSelectionMode", "meta", "start", "potentialSelection", "existing", "area", "selection", "modeIncludesColumns", "modeIncludesRows", "set_psp_selection", "viewer", "x0", "x1", "y0", "y1", "viewport", "SELECTION_PREDICATES", "m", "a", "applyMouseAreaSelection", "tds", "td", "cells", "cell", "predicate", "rendered", "applyColumnHeaderStyles", "model", "headerRows", "regularTable", "viewer", "selectedColumn", "len", "settings_open", "row", "i", "offset", "id", "titlesRow", "editBtnsRow", "cells", "element", "title", "editBtn", "open", "colHeadersIndex", "colHeaders", "styleColumnHeaderRow", "menuHeadersIndex", "menuHeaders", "applyGroupHeaderStyles", "model", "headerRows", "regularTable", "header_depth", "m", "marked", "y", "row", "cells", "tops", "x", "td", "metadata", "needs_border", "xx", "cell", "tx", "ty", "style_cell_flash", "model", "metadata", "td", "pos_s", "pos_e", "neg_s", "neg_e", "is_settings_open", "id", "metadata_path", "row_idx", "col_idx", "cell_style_numeric", "model", "plugin", "td", "metadata", "is_settings_open", "is_positive", "is_negative", "pos_bg_color", "neg_bg_color", "bg_tuple", "hex", "r", "g", "b", "a", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "style_cell_flash", "fg_tuple", "gradhex", "cell_style_string", "model", "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", "rgbToHsl", "parseColor", "rotated", "hslToRgb", "r2", "g2", "b2", "hex2", "rgbToHex", "cell_style_datetime", "model", "plugin", "td", "metadata", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "cell_style_boolean", "model", "_plugin", "td", "metadata", "hex", "cell_style_row_header", "model", "regularTable", "td", "metadata", "is_not_empty", "is_leaf", "next", "is_collapse", "applyBodyCellStyles", "model", "cells", "plugins", "isSettingsOpen", "isSelectable", "isEditable", "regularTable", "selectedId", "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", "isExact", "isSub", "col_name_str", "createConsolidatedStyleListener", "datagrid", "model", "regularTable", "viewer", "selectedPositionMap", "plugins", "PRIVATE_PLUGIN_SYMBOL", "isSettingsOpen", "isSelectable", "isEditable", "isEditableMode", "isEditableAllowed", "bodyCells", "groupHeaderRows", "tbody", "tr", "cell", "metadata", "isHeader", "thead", "rowData", "applyBodyCellStyles", "applyGroupHeaderStyles", "applyColumnHeaderStyles", "applyFocusStyle", "activate", "view", "viewer", "table", "createModel", "model", "regularTable", "onSelect", "area", "isDeselect", "idx", "row", "column_names", "config", "getCellConfig", "detail", "PerspectiveSelectDetail", "addAreaMouseSelection", "selected_position_map", "createConsolidatedStyleListener", "createClickListener", "createDispatchClickListener", "createMousedownListener", "createDblclickListener", "createEditClickListener", "createFocusinListener", "createFocusoutListener", "createKeydownListener", "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", "_view", "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"]
3
+ "sources": ["../../src/ts/index.ts", "../../src/ts/types.ts", "../../src/ts/model/meta_columns.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/create.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/event_handlers/focus.ts", "../../src/ts/style_handlers/focus.ts", "../../src/ts/event_handlers/keydown/edit_keydown.ts", "../../src/ts/event_handlers/click.ts", "../../src/ts/get_cell_config.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_config_schema.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 ViewConfigUpdate,\n} from \"@perspective-dev/client\";\nimport type {\n HTMLPerspectiveViewerElement,\n ViewerConfig,\n} from \"@perspective-dev/viewer\";\nimport type { RegularTableElement } from \"regular-table\";\nimport type { 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 | \"SELECT_ROW_TREE\";\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: ViewerConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _theme: string;\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 _tree_selection_id?: unknown[];\n _last_insert_configs?: ViewConfigUpdate[];\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// 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/src/ts/extensions.js\";\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 positions\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n\n// Centralized editable mode check - used by style handlers and event handlers\nexport function isEditableMode(\n model: DatagridModel,\n viewer: HTMLPerspectiveViewerElement,\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 plugin = viewer.children[0] as DatagridPluginElement | undefined;\n const editable = allowed || plugin?._edit_mode === \"EDIT\";\n return has_pivots && editable;\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\n/**\n * Single-source-of-truth predicate for \"this column is metadata, hide\n * it from the user-visible grid.\" Five distinct names show up across\n * the perspective protocol; older datagrid code filtered them by\n * exact-match in three places, which only worked when the wire shape\n * was the JSON-sidecar form (`__ROW_PATH__` array-of-arrays).\n *\n * The DuckDB virtual-server backend additionally surfaces per-level\n * `__ROW_PATH_<n>__` columns directly in `to_columns_string` /\n * `to_json` output (a side effect of keeping them in the frozen Arrow\n * batch so that `to_arrow` consumers \u2014 viewer-charts via\n * `with_typed_arrays` \u2014 see them inline, matching native\n * `perspective-server`'s `to_arrow` behavior). Without this helper,\n * those per-level columns slip through the legacy exact-match filters\n * and render as user columns to the right of the grid.\n *\n * Match list:\n * - `__ROW_PATH__` \u2014 JSON sidecar; used by the tree header.\n * - `__ROW_PATH_<n>__` \u2014 per-level columns from the virtual server's\n * inline-arrow shape.\n * - `__ID__` \u2014 per-row identity column.\n * - `__GROUPING_ID__` \u2014 internal SQL-rollup discriminator. The\n * virtual server strips it server-side, but\n * we cover it defensively in case a future\n * backend leaks it.\n *\n * User columns named with leading/trailing double-underscores (e.g.\n * `__user_col__`) are *not* matched \u2014 the regex requires the exact\n * stems above.\n */\nconst META_COLUMN_RE = /^__(?:ROW_PATH(?:_\\d+)?|ID|GROUPING_ID)__$/;\n\nexport function isMetaColumn(name: string): boolean {\n return META_COLUMN_RE.test(name);\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 { ColumnType } from \"@perspective-dev/client\";\nimport {\n createDateFormatter,\n createDatetimeFormatter,\n createNumberFormatter,\n} from \"@perspective-dev/viewer/src/ts/column-format.js\";\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\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 return createDatetimeFormatter(plugin.date_format);\n }\n\n private create_date_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n return createDateFormatter(plugin.date_format);\n }\n\n private create_number_formatter(\n type: ColumnType,\n plugin: PluginConfig,\n ): Intl.NumberFormat {\n return createNumberFormatter(type, plugin.number_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 type { 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 (\n is_numeric &&\n (plugin?.number_fg_mode === \"bar\" ||\n plugin?.number_fg_mode === \"label-bar\")\n ) {\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 anchor = (val as number) >= 0 ? \"\" : \"justify-self:flex-end;\";\n const pct = (a * 100).toFixed(2);\n\n if (plugin.number_fg_mode === \"bar\") {\n const div = this._div_factory.get();\n div.className = \"psp-bar\";\n div.setAttribute(\n \"style\",\n `${anchor}width:${pct}%;height:80%;top:10%;pointer-events:none;background:var(--psp-label-bar-color)`,\n );\n\n return div;\n } else {\n const formatter = FORMAT_CACHE.get(type, plugin);\n const label = formatter ? formatter.format(val) : (val as string);\n\n const div = this._div_factory.get();\n div.className = \"psp-bar\";\n div.setAttribute(\n \"style\",\n `--label:\"${label}\";${anchor}width:${pct}%;height:80%;top:10%;pointer-events:none;background:var(--psp-label-bar-color)`,\n );\n return div;\n }\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 (const 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 (const 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 { isMetaColumn } from \"../model/meta_columns.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 { DatagridModel, RegularTable, Schema } from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport type { ViewConfig, ViewWindow } from \"@perspective-dev/client\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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: HTMLPerspectiveViewerElement,\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 // `isMetaColumn` covers `__ROW_PATH__`, `__ID__`,\n // `__GROUPING_ID__`, and the per-level `__ROW_PATH_<n>__`\n // columns the DuckDB virtual server emits inline alongside\n // the JSON sidecar. Exact-match against `__ROW_PATH__` /\n // `__ID__` (the previous filter) misses the per-level\n // form and the virtual server's columns leak into the\n // visible grid.\n const new_col_paths = y.filter((x) => !isMetaColumn(x));\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 type { ColorRecord } from \"./types.js\";\n\n/** 8-bit sRGB color as `[r, g, b]` with each channel in `[0, 255]`. */\nexport type RGB = [number, number, number];\n\n/** HSL color as `[h, s, l]` with `h` in degrees `[0, 360)` and `s`, `l` in `[0, 1]`. */\nexport type HSL = [number, number, number];\n\nconst parse_cache = new Map<string, RGB>();\nlet parse_ctx: CanvasRenderingContext2D | null = null;\n\n/** Parse a CSS hex color (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`). Returns `null` if `input` is not a hex literal. Alpha is ignored. */\nfunction parse_hex(input: string): RGB | null {\n const s = input.startsWith(\"#\") ? input.slice(1) : input;\n if (s.length === 3 || s.length === 4) {\n const r = parseInt(s[0] + s[0], 16);\n const g = parseInt(s[1] + s[1], 16);\n const b = parseInt(s[2] + s[2], 16);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n return [r, g, b];\n }\n } else if (s.length === 6 || s.length === 8) {\n const r = parseInt(s.slice(0, 2), 16);\n const g = parseInt(s.slice(2, 4), 16);\n const b = parseInt(s.slice(4, 6), 16);\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n return [r, g, b];\n }\n }\n\n return null;\n}\n\n/** Parse a CSS `rgb()` or `rgba()` functional color. Returns `null` if `input` does not match. Alpha is ignored. */\nfunction parse_rgb_fn(input: string): RGB | null {\n const m = input.match(\n /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)/i,\n );\n if (!m) {\n return null;\n }\n\n return [\n Math.round(parseFloat(m[1])),\n Math.round(parseFloat(m[2])),\n Math.round(parseFloat(m[3])),\n ];\n}\n\n/** Fallback parser that defers to the browser by assigning `input` to a 2D canvas `fillStyle` and re-reading the normalized value. Handles named colors, `hsl()`, etc. Returns `[0, 0, 0]` if the value is invalid or no canvas context is available. */\nfunction parse_via_canvas(input: string): RGB {\n if (!parse_ctx) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n parse_ctx = canvas.getContext(\"2d\");\n }\n\n if (!parse_ctx) {\n return [0, 0, 0];\n }\n\n parse_ctx.fillStyle = \"#000\";\n parse_ctx.fillStyle = input;\n const normalized = parse_ctx.fillStyle as string;\n return parse_hex(normalized) ?? parse_rgb_fn(normalized) ?? [0, 0, 0];\n}\n\n/** Parse any CSS color string into an `RGB` triple. Tries hex and `rgb()` fast paths, then falls back to a canvas-based parser for named colors, `hsl()`, etc. Results are memoized per input. */\nexport function parseColor(input: string): RGB {\n const key = input.trim();\n const cached = parse_cache.get(key);\n if (cached) {\n return cached;\n }\n\n const rgb = parse_hex(key) ?? parse_rgb_fn(key) ?? parse_via_canvas(key);\n parse_cache.set(key, rgb);\n return rgb;\n}\n\n/** Format a single channel as a clamped, zero-padded two-digit hex byte. */\nfunction toHex(c: number): string {\n const v = Math.max(0, Math.min(255, Math.round(c)));\n return v.toString(16).padStart(2, \"0\");\n}\n\n/** Format an `RGB` triple as a `#rrggbb` hex string. Channels are clamped to `[0, 255]`. */\nexport function rgbToHex([r, g, b]: RGB): string {\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/** Convert sRGB to HSL. Output `h` is in degrees `[0, 360)`; `s` and `l` are in `[0, 1]`. */\nexport function rgbToHsl([r, g, b]: RGB): HSL {\n const rn = r / 255,\n gn = g / 255,\n bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n const d = max - min;\n let h = 0;\n let s = 0;\n if (d !== 0) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === rn) {\n h = ((gn - bn) / d + (gn < bn ? 6 : 0)) * 60;\n } else if (max === gn) {\n h = ((bn - rn) / d + 2) * 60;\n } else {\n h = ((rn - gn) / d + 4) * 60;\n }\n }\n\n return [h, s, l];\n}\n\n/** Convert HSL to sRGB. `h` is wrapped into `[0, 360)`; `s` and `l` are expected in `[0, 1]`. Output channels are rounded to integers in `[0, 255]`. */\nexport function hslToRgb([h, s, l]: HSL): RGB {\n const hn = (((h % 360) + 360) % 360) / 360;\n if (s === 0) {\n const v = Math.round(l * 255);\n return [v, v, v];\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const f = (t: number): number => {\n if (t < 0) {\n t += 1;\n }\n\n if (t > 1) {\n t -= 1;\n }\n\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n\n if (t < 1 / 2) {\n return q;\n }\n\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n\n return p;\n };\n\n return [\n Math.round(f(hn + 1 / 3) * 255),\n Math.round(f(hn) * 255),\n Math.round(f(hn - 1 / 3) * 255),\n ];\n}\n\n/**\n * Blend two `RGB` colors using LRGB (gamma-naive linear) interpolation,\n * matching chroma-js's default `mix` mode. `f` is the weight of `b` in `[0, 1]`\n * (0 returns `a`, 1 returns `b`).\n */\nexport function mixRgb(a: RGB, b: RGB, f = 0.5): RGB {\n return [\n Math.round(Math.sqrt(a[0] * a[0] * (1 - f) + b[0] * b[0] * f)),\n Math.round(Math.sqrt(a[1] * a[1] * (1 - f) + b[1] * b[1] * f)),\n Math.round(Math.sqrt(a[2] * a[2] * (1 - f) + b[2] * b[2] * f)),\n ];\n}\n\n/** 50/50 LRGB blend of CSS color `a` with `RGB`-ish triple `b`, returned as `#rrggbb`. */\nexport function blend(a: string, b: number[]): string {\n return rgbToHex(mixRgb(parseColor(a), [b[0], b[1], b[2]], 0.5));\n}\n\n/** Composite a premultiplied-style `RGBA` cell color over `source` (default white) and return the resulting opaque `RGB`. Used to flatten heatmap cells against 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/** Pick a readable foreground (`#161616` or `#ffffff`) for the given background using a perceptual luminance threshold. */\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\n/** Build a CSS `linear-gradient` that fans `rgb` \u00B115\u00B0 in hue, used as the negative-value swatch in column color pickers. */\nfunction make_gradient(rgb: RGB): string {\n const [h, s, l] = rgbToHsl(rgb);\n const [r, g, b] = rgb;\n const [r1, g1, b1] = hslToRgb([h - 15, s, l]);\n const [r2, g2, b2] = hslToRgb([h + 15, s, l]);\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\n/** Precompute the tuple of derived color strings (RGB channels, gradient, opaque/transparent rgba) cached on the model for a configured plugin color. */\nexport function make_color_record(color: string): ColorRecord {\n const rgb = parseColor(color);\n const _neg_grad = make_gradient(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 { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record, parseColor } 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} from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nfunction arraysChanged<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) {\n return true;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction nestedArraysChanged<T>(a: T[][], b: T[][]): boolean {\n if (a.length !== b.length) {\n return true;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i].length !== b[i].length) {\n return true;\n }\n\n for (let j = 0; j < a[i].length; j++) {\n if (a[i][j] !== b[i][j]) {\n return true;\n }\n }\n }\n\n return false;\n}\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\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 theme: string,\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 const group_by_changed = arraysChanged(old.group_by, config.group_by);\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n const split_by_changed = arraysChanged(old.split_by, config.split_by);\n const columns_changed = arraysChanged(old.columns, config.columns);\n const filter_changed = nestedArraysChanged(\n old.filter as unknown[][],\n config.filter as unknown[][],\n );\n\n const sort_changed = nestedArraysChanged(\n old.sort as unknown[][],\n config.sort as unknown[][],\n );\n\n const group_rollup_mode_changed =\n old.group_rollup_mode !== config.group_rollup_mode;\n\n const theme_changed = this.model._theme !== theme;\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 theme_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 HTMLPerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = parseColor(\n get_rule(regular, \"--psp--background-color\", \"#FFFFFF\"),\n );\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--psp-datagrid--pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--psp-datagrid--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, \"--psp-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 let _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n\n if (\n _edit_mode === \"SELECT_ROW_TREE\" &&\n (config.group_by.length === 0 || config.group_rollup_mode === \"flat\")\n ) {\n _edit_mode = \"READ_ONLY\";\n this._edit_mode = _edit_mode;\n }\n\n this._edit_button!.dataset.editMode = _edit_mode;\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 _theme: theme,\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\n // get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(\n this.parentElement as HTMLPerspectiveViewerElement,\n ).bind(model, regular) 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 { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridPluginElement,\n EditMode,\n} 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 \"SELECT_ROW_TREE\",\n] as const;\n\nfunction isSelectRowTreeAvailable(model?: DatagridModel): boolean {\n if (!model) {\n return false;\n }\n\n return (\n model._config.group_by.length > 0 &&\n model._config.group_rollup_mode !== \"flat\"\n );\n}\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n let idx = EDIT_MODES.indexOf(this._edit_mode);\n do {\n idx = (idx + 1) % EDIT_MODES.length;\n } while (\n EDIT_MODES[idx] === \"SELECT_ROW_TREE\" &&\n !isSelectRowTreeAvailable(this.model)\n );\n\n mode = EDIT_MODES[idx];\n }\n\n (this.parentElement as HTMLPerspectiveViewerElement)?.setSelection?.();\n this._edit_mode = mode;\n if (this.model) {\n this.model._edit_mode = mode;\n this.model._tree_selection_id = undefined;\n this.model._selection_state = {\n selected_areas: [],\n dirty: true,\n };\n }\n\n (this.parentElement as HTMLPerspectiveViewerElement)?.restore?.({\n plugin_config: { edit_mode: mode },\n });\n\n if (this._edit_button !== undefined) {\n this._edit_button.dataset.editMode = mode;\n }\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 { ColumnOverrides, DatagridPluginElement } 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 regular_table = this.regular_table as RegularTableWithOverrides;\n const overrides: Record<number, number | undefined> = {\n ...regular_table.saveColumnSizes(),\n };\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\n // Skip keys that don't resolve to a known column \u2014 e.g. on the\n // first draw after `activate`, `_column_paths` has not yet been\n // populated by the data listener, so we leave any existing\n // `regular-table` widths untouched rather than clobbering them\n // with garbage indices.\n if (index === -1) {\n continue;\n }\n\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n regular_table.restoreColumnSizes(overrides);\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 { get_psp_type, type DatagridModel } from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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 model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\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 (model._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) {\n continue;\n }\n\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 model: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth =\n model._config.group_by.length -\n (model._config.group_rollup_mode === \"flat\" ? 1 : 0);\n\n const selectedColumn = model._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\n const column_name =\n metadata.column_header?.[model._config.split_by.length];\n\n const sort = model._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) % model._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(model, 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 === model._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 === model._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 (model._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 type { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SortRotationOrder, SortTerm } from \"../types.js\";\nimport type { SortDir } from \"@perspective-dev/client\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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};\n\nexport async function sortHandler(\n model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) {\n return;\n }\n\n const column_name = meta.column_header[model._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(model, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n model: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of model._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort(model, 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 model: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of model._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort(model, 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 model: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = model._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 model: 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\") {\n return;\n }\n\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\n );\n\n if (event.shiftKey && is_collapse) {\n model._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n model._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n model._view.collapse(meta.y);\n } else {\n model._view.expand(meta.y);\n }\n\n model._num_rows = await model._view.num_rows();\n model._num_columns = await model._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 { RegularTable, DatagridModel } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createMousedownListener(\n model: DatagridModel,\n regularTable: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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) {\n return;\n }\n\n if (target.classList.contains(\"psp-tree-label\")) {\n if (model._edit_mode !== \"SELECT_ROW_TREE\") {\n expandCollapseHandler(model, regularTable, mouseEvent);\n }\n\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name =\n meta?.column_header?.[model._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler(model, regularTable, viewer, mouseEvent, target);\n }\n };\n}\n\nexport function createDblclickListener(\n model: DatagridModel,\n regularTable: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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) {\n return;\n }\n\n if (target.classList.contains(\"psp-tree-label\")) {\n if (model._edit_mode === \"SELECT_ROW_TREE\") {\n expandCollapseHandler(model, regularTable, mouseEvent);\n }\n }\n };\n}\n\nexport function createClickListener(regularTable: RegularTable): EventListener {\n return (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.which !== 1) {\n return;\n }\n\n let target = mouseEvent.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) {\n return;\n }\n\n if (\n target.classList.contains(\"psp-tree-label\") &&\n mouseEvent.offsetX < 26\n ) {\n mouseEvent.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n mouseEvent.stopImmediatePropagation();\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 { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n get_psp_type,\n} from \"../../types.js\";\n\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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\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\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\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 model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\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 = model._is_editable[meta.x];\n const is_bool = get_psp_type(model, 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, model, 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 { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n SelectedPosition,\n SelectedPositionMap,\n} from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createFocusoutListener(\n model: DatagridModel,\n table: RegularTable,\n viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const focusEvent = event as FocusEvent;\n if (isEditableMode(model, viewer) && selected_position_map.has(table)) {\n const target = focusEvent.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, model, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n };\n}\n\nexport function createFocusinListener(\n _model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const focusEvent = event as FocusEvent;\n const target = focusEvent.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}\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, SelectedPositionMap } from \"../types.js\";\nimport { CollectedCell } 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 _model: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: SelectedPositionMap,\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\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: SelectedPositionMap,\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\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 SelectedPositionMap,\n} from \"../../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\ntype AsyncMoveFunction = (\n model: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n) => Promise<void | undefined>;\n\nfunction lock(body: AsyncMoveFunction): AsyncMoveFunction {\n let lockPromise: Promise<void> | undefined;\n return async function (\n model: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n ): Promise<void | 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(\n model,\n table,\n selected_position_map,\n active_cell,\n dx,\n dy,\n );\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(elem: ContentEditableElement): number {\n if (elem.isContentEditable) {\n const _range = (elem.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) {\n return 0;\n }\n\n const range = _range.cloneRange();\n range.selectNodeContents(elem);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return elem.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n model: 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\") {\n return;\n }\n\n const num_columns = model._column_paths.length;\n const num_rows = model._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 model: DatagridModel,\n table: RegularTable,\n _viewer: HTMLPerspectiveViewerElement,\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(model, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n\n break;\n case \"ArrowLeft\":\n if (getPos(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(model, table, selected_position_map, target, 0, -1);\n break;\n case \"ArrowRight\":\n if (\n getPos(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection(\n model,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(model, table, selected_position_map, target, 0, 1);\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 { DatagridModel, SelectedPositionMap } from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createKeydownListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n): EventListener {\n return (event: Event): void => {\n const keyEvent = event as KeyboardEvent;\n if (model._edit_mode === \"EDIT\") {\n if (!isEditableMode(model, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener(\n model,\n table,\n viewer,\n selected_position_map,\n keyEvent,\n );\n } else {\n console.debug(\n `Mode ${model._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n };\n}\n\nexport function createEditClickListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (model._edit_mode === \"EDIT\") {\n if (!isEditableMode(model, viewer)) {\n return;\n }\n\n edit_click.clickListener(model, table, viewer, mouseEvent);\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 type { View, ViewConfig, Filter, Scalar } from \"@perspective-dev/client\";\nimport type { CellConfigResult } from \"./types.js\";\nimport { isMetaColumn } from \"./model/meta_columns.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 // Filter out *all* meta columns before indexing into the row's\n // keys \u2014 the DuckDB virtual server's JSON output now includes\n // per-level `__ROW_PATH_<n>__` columns alongside the\n // `__ROW_PATH__` sidecar, so the previous `+1` skip (which\n // assumed exactly one leading meta column) lands on a meta key\n // when group_by has multiple levels.\n const user_keys = Object.keys(r[0]).filter((k) => !isMetaColumn(k));\n const column_paths = user_keys[col_idx];\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]) => !isMetaColumn(value as string));\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 { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type { DatagridModel, PerspectiveClickDetail } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nexport function createDispatchClickListener(\n model: DatagridModel,\n table: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): EventListener {\n return async (event: Event): Promise<void> => {\n const mouseEvent = event as MouseEvent;\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta || meta.type !== \"body\") {\n return;\n }\n\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(model, 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}\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 EditMode,\n SelectionArea,\n} from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport type { ViewWindow } from \"@perspective-dev/client\";\nimport type { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\nexport type OnSelectCallback = (\n area: SelectionArea,\n isDeselect: boolean,\n) => void;\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n onSelect?: OnSelectCallback;\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n onSelect,\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, onSelect),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nfunction isSingleClickMode(mode: EditMode): boolean {\n return mode === \"SELECT_ROW_TREE\";\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 isSelectionMode(datagrid.model!._edit_mode)\n ) {\n if (isSingleClickMode(datagrid.model!._edit_mode)) {\n return;\n }\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 const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode) && !isSingleClickMode(mode)) {\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 onSelect?: OnSelectCallback,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode)) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) {\n return;\n }\n\n // For single-click modes (SELECT_ROW_TREE), handle toggle\n if (isSingleClickMode(mode)) {\n if (\n (meta.type === \"body\" || meta.type === \"row_header\") &&\n meta.y !== undefined &&\n meta.y >= 0\n ) {\n const existing =\n datagrid.model!._selection_state.selected_areas;\n const isSameRow =\n existing.length > 0 && existing[0].y0 === meta.y;\n\n if (isSameRow) {\n // Deselect\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.dirty = true;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n [],\n );\n onSelect?.(existing[0], true);\n } else {\n // Select new row\n const area: SelectionArea = {\n x0: 0,\n x1: 0,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.selected_areas = [\n area,\n ];\n datagrid.model!._selection_state.dirty = true;\n applyMouseAreaSelections(datagrid, table, className);\n onSelect?.(area, false);\n }\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n return;\n }\n\n // Drag-based modes (SELECT_ROW, SELECT_COLUMN, SELECT_REGION)\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 modeIncludesColumns(mode: EditMode): boolean {\n return mode === \"SELECT_COLUMN\" || mode === \"SELECT_REGION\";\n}\n\nfunction modeIncludesRows(mode: EditMode): boolean {\n return (\n mode === \"SELECT_ROW\" ||\n mode === \"SELECT_REGION\" ||\n mode === \"SELECT_ROW_TREE\"\n );\n}\n\nfunction set_psp_selection(\n viewer: HTMLPerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (x0 !== undefined && modeIncludesColumns(mode)) {\n viewport.start_col = x0;\n }\n\n if (x1 !== undefined && modeIncludesColumns(mode)) {\n viewport.end_col = x1 + 1;\n }\n\n if (y0 !== undefined && modeIncludesRows(mode)) {\n viewport.start_row = y0;\n }\n\n if (y1 !== undefined && modeIncludesRows(mode)) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\ntype CellPredicate = (meta: CellMetadataBody, area: SelectionArea) => boolean;\n\nconst SELECTION_PREDICATES: Record<string, CellPredicate> = {\n SELECT_REGION: (m, a) =>\n a.x0 <= m.x && m.x <= a.x1 && a.y0 <= m.y && m.y <= a.y1,\n SELECT_ROW: (m, a) => a.y0 <= m.y && m.y <= a.y1,\n SELECT_ROW_TREE: (m, a) => a.y0 <= m.y && m.y <= a.y1,\n SELECT_COLUMN: (m, a) => a.x0 <= m.x && m.x <= a.x1,\n};\n\nfunction isSelectionMode(mode: EditMode): boolean {\n return (\n mode === \"SELECT_REGION\" ||\n mode === \"SELECT_ROW\" ||\n mode === \"SELECT_COLUMN\" ||\n mode === \"SELECT_ROW_TREE\"\n );\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n const mode = datagrid.model!._edit_mode;\n if (isSelectionMode(mode)) {\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 if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as HTMLPerspectiveViewerElement,\n datagrid,\n selected[0],\n );\n\n // SELECT_ROW_TREE styling is handled entirely by the\n // identity-based system in body.ts, which styles both td\n // and th uniformly in a single draw pass.\n if (!isSingleClickMode(mode)) {\n applyMouseAreaSelection(datagrid, table, selected, className);\n }\n } else {\n (\n datagrid.parentElement as HTMLPerspectiveViewerElement\n ).setSelection();\n const tds = table.querySelectorAll(\"tbody td\");\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 cells = table.querySelectorAll(\"tbody td, tbody th\");\n for (const cell of cells) {\n cell.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n const predicate = SELECTION_PREDICATES[datagrid.model!._edit_mode];\n if (!predicate || selected.length === 0) {\n return;\n }\n\n const tds = table.querySelectorAll(\"tbody td\");\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta || meta.type !== \"body\") {\n continue;\n }\n\n let rendered = false;\n for (const area of selected) {\n if (\n area.x0 !== undefined &&\n area.y0 !== undefined &&\n area.x1 !== undefined &&\n area.y1 !== undefined &&\n predicate(meta, area)\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\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 } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n model: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) {\n return;\n }\n\n // Style selected column for settings panel\n const selectedColumn = model._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) {\n continue;\n }\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 = model._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n styleColumnHeaderRow(model, colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = model._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n styleColumnHeaderRow(model, 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 model: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = model._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 { 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) {\n continue;\n }\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-color-mode-label-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\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]) {\n m[ty] = [];\n }\n\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 model: 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 = model._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 model.last_reverse_columns?.has(metadata_path) &&\n model.last_reverse_ids?.has(id)\n ) {\n const row_idx = model.last_reverse_ids?.get(id);\n const col_idx = model.last_reverse_columns.get(metadata_path);\n if (!model._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (model.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 (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (model.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 model: 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 = model._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 = model._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 model._plugin_background[0],\n model._plugin_background[1],\n model._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 = model._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(\n model,\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 model._plugin_background[0],\n model._plugin_background[1],\n model._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? model._pos_fg_color\n : is_negative\n ? model._neg_fg_color\n : [\n \"\",\n model._plugin_background[0],\n model._plugin_background[1],\n model._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 = model._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 td.style.setProperty(\"--psp-label-bar-color\", gradhex);\n td.style.setProperty(\"--psp-label-bar-bg\", hex);\n } else if (plugin?.number_fg_mode === \"label-bar\") {\n td.style.color = \"\";\n td.style.setProperty(\"--psp-label-bar-color\", gradhex);\n td.style.setProperty(\"--psp-label-bar-bg\", hex);\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 {\n hslToRgb,\n infer_foreground_from_background,\n parseColor,\n rgbaToRgb,\n rgbToHex,\n rgbToHsl,\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 model: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[model._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return model._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 = model._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 (!model._series_color_map.has(column_name)) {\n model._series_color_map.set(column_name, new Map());\n model._series_color_seed.set(column_name, 0);\n }\n\n const series_map = model._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = model._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n model._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n const [h, s, l] = rgbToHsl(parseColor(hex));\n const rotated = hslToRgb([h + ((color_seed * 150) % 360), s, l]);\n const [r2, g2, b2] = rotated;\n const hex2 = rgbToHex(rotated);\n const source = model._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\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_datetime(\n model: DatagridModel,\n plugin: PluginWithColor,\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 model._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 = model._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 model: 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 ? model._pos_fg_color\n : metadata.user === false\n ? model._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 model: 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) >= model._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 ColumnsConfig,\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 { CollectedCell } from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n model: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n): void {\n const selectedId = isSelectable ? model._tree_selection_id : undefined;\n\n regularTable.classList.toggle(\n \"flat-group-rollup-mode\",\n model._config.group_rollup_mode === \"flat\",\n );\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[model._config.split_by.length];\n const type = get_psp_type(model, 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 =\n model._config.group_rollup_mode === \"rollup\" &&\n ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n model._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(\n model,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean(model, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string(model, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime(model, plugin as any, td, metadata);\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 (model._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === model._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 td.classList.toggle(\n \"psp-color-mode-label-bar\",\n plugin?.number_fg_mode === \"label-bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header(model, 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 tree selection styling (SELECT_ROW_TREE).\n // psp-select-region-inactive is exclusively a tree-selection class,\n // so always clean it up. psp-select-region is shared with the\n // coordinate-based selection modes, so only touch it when in\n // SELECT_ROW_TREE mode (isSelectable).\n td.classList.toggle(\"psp-select-region-inactive\", false);\n if (isSelectable) {\n if (!selectedId) {\n td.classList.toggle(\"psp-select-region\", false);\n } else {\n const id = model._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = selectedId.reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const isExact = id.length === selectedId.length && key_match;\n const isSub = id.length !== selectedId.length && key_match;\n\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-select-region\", false);\n } else {\n td.classList.toggle(\"psp-select-region\", isExact);\n td.classList.toggle(\n \"psp-select-region-inactive\",\n isSub,\n );\n }\n } else {\n td.classList.toggle(\"psp-select-region\", isExact);\n td.classList.toggle(\"psp-select-region-inactive\", isSub);\n }\n }\n // } else if (\n // model._edit_mode === \"READ_ONLY\" ||\n // model._edit_mode === \"EDIT\"\n // ) {\n // td.classList.toggle(\"psp-select-region\", false);\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && model._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[model._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\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 ColumnsConfig,\n DatagridPluginElement,\n SelectedPositionMap,\n} from \"../types.js\";\nimport { isEditableMode } from \"../types.js\";\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\n\nimport { applyFocusStyle } from \"./focus.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\";\nimport { CollectedCell, CollectedHeaderRow } from \"./types.js\";\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 model: DatagridModel,\n regularTable: RegularTableElement,\n viewer: HTMLPerspectiveViewerElement,\n selectedPositionMap: SelectedPositionMap,\n): () => void {\n return function consolidatedStyleListener(): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = model._edit_mode === \"SELECT_ROW_TREE\";\n const isEditable = isEditableMode(model, viewer);\n const isEditableAllowed = isEditableMode(model, 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 (\n metadata &&\n (metadata.type === \"body\" ||\n metadata.type === \"row_header\")\n ) {\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\n groupHeaderRows.push(rowData);\n }\n }\n\n applyBodyCellStyles(\n model,\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n );\n\n applyGroupHeaderStyles(model, groupHeaderRows, regularTable);\n applyColumnHeaderStyles(model, groupHeaderRows, regularTable, viewer);\n applyFocusStyle(model, bodyCells, regularTable, selectedPositionMap);\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_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n createMousedownListener,\n createClickListener,\n createDblclickListener,\n} from \"../event_handlers/header_click.js\";\n\nimport {\n createFocusinListener,\n createFocusoutListener,\n} from \"../event_handlers/focus.js\";\nimport {\n createKeydownListener,\n createEditClickListener,\n} from \"../event_handlers/click.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { createDispatchClickListener } from \"../event_handlers/dispatch_click.js\";\n\nimport {\n addAreaMouseSelection,\n type OnSelectCallback,\n} from \"../event_handlers/select_region.js\";\n\nimport { createConsolidatedStyleListener } from \"../style_handlers/consolidated.js\";\n\nimport getCellConfig from \"../get_cell_config.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport {\n type DatagridPluginElement,\n type SelectedPositionMap,\n type SelectionArea,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\nimport type { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\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 HTMLPerspectiveViewerElement;\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 viewer.getAttribute(\"theme\")!,\n );\n\n if (!this.model) {\n return;\n }\n\n const model = this.model;\n const regularTable = this.regular_table;\n const onSelect: OnSelectCallback = async (\n area: SelectionArea,\n isDeselect: boolean,\n ) => {\n if (model._edit_mode !== \"SELECT_ROW_TREE\") {\n return;\n }\n\n // Store the selected row identity on the model so it persists\n // even when the selected row scrolls out of the viewport.\n if (isDeselect) {\n model._tree_selection_id = undefined;\n } else {\n const idx = area.y0 - (model._last_window?.start_row ?? 0);\n if (idx >= 0 && idx < model._ids.length) {\n model._tree_selection_id = model._ids[idx];\n }\n }\n\n const { row, column_names, config } = await getCellConfig(\n model,\n area.y0,\n 0,\n );\n\n let detail: PerspectiveSelectDetail;\n if (isDeselect) {\n if ((model._last_insert_configs?.length || 0) > 0) {\n detail = new PerspectiveSelectDetail(\n false,\n row,\n [],\n model._last_insert_configs ?? [],\n [],\n );\n } else {\n throw new Error(\"Suprious deselect\");\n }\n\n model._last_insert_configs = undefined;\n } else {\n detail = new PerspectiveSelectDetail(\n true,\n row,\n column_names,\n model._last_insert_configs ?? [],\n [config],\n );\n model._last_insert_configs = [config];\n }\n\n await regularTable.draw({ preserve_width: true });\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\n \"perspective-global-filter\",\n {\n bubbles: true,\n composed: true,\n detail,\n },\n ),\n );\n };\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n onSelect,\n });\n\n // Create shared state map for focus tracking\n const selected_position_map: SelectedPositionMap = new WeakMap();\n\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"click\",\n createClickListener(this.regular_table),\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n createDispatchClickListener(this.model, this.regular_table, viewer),\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n createMousedownListener(this.model, this.regular_table, viewer),\n );\n\n this.regular_table.addEventListener(\n \"dblclick\",\n createDblclickListener(this.model, this.regular_table, viewer),\n );\n\n // Editing event handlers\n this.regular_table.addEventListener(\n \"click\",\n createEditClickListener(this.model, this.regular_table, viewer),\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n createFocusinListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n createFocusoutListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n createKeydownListener(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map,\n ),\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(\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 viewer.getAttribute(\"theme\")!,\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) {\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 } else {\n toggle_edit_mode.call(this, \"READ_ONLY\");\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n } else {\n toggle_scroll_lock.call(this, false);\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 { DatagridPluginElement, DatagridPluginConfig } 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\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\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 type { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface ViewerConfigLike {\n group_by?: string[];\n group_rollup_mode?: string;\n}\n\ntype ControlSpec = Record<string, unknown> & { kind: string };\n\nexport interface ColumnConfigSchema {\n fields: ControlSpec[];\n}\n\n/**\n * Plugin schema for the Datagrid column-settings sidebar. Returns the\n * controls the viewer should render in the Style tab for a given column.\n *\n * Each entry in `fields` is a `ControlSpec` discriminated by `kind`.\n * Composite kinds (`NumberStyle`, `DatetimeFormat`, `StringFormat`,\n * `NumberFormat`, `AggregateDepth`) own a fixed key namespace and\n * carry only their `default`. Primitive kinds (`Enum`, `Bool`, `Color`,\n * etc.) carry their own `key` (storage) and `label` (UI) inline.\n *\n * Aggregate Depth is plugin-owned \u2014 surfaced only inside the Datagrid\n * because rollup-mode pivots are a Datagrid concern. Emitted only when\n * the active view has a non-empty `group_by` and rollup mode is `Rollup`.\n */\ninterface ColumnStats {\n abs_max?: number;\n}\n\nexport default function column_config_schema(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string | undefined,\n _column_name: string,\n current_value: Record<string, unknown> | null,\n viewer_config?: ViewerConfigLike,\n column_stats?: ColumnStats,\n): ColumnConfigSchema {\n const fields: ControlSpec[] = [];\n\n if (type === \"integer\" || type === \"float\") {\n const pos_fg = this.model!._pos_fg_color[0];\n const neg_fg = this.model!._neg_fg_color[0];\n const pos_bg = this.model!._pos_bg_color[0];\n const neg_bg = this.model!._neg_bg_color[0];\n\n fields.push({\n kind: \"Enum\",\n key: \"number_fg_mode\",\n default: \"color\",\n variants: [\n { value: \"disabled\", label: \"Disabled\" },\n { value: \"color\", label: \"Color\" },\n { value: \"bar\", label: \"Bar\" },\n { value: \"label-bar\", label: \"Gradient\" },\n ],\n });\n\n const fg_mode = (current_value?.number_fg_mode as string) ?? \"color\";\n if (fg_mode !== \"disabled\") {\n fields.push({\n kind: \"ColorRange\",\n key_pos: \"pos_fg_color\",\n key_neg: \"neg_fg_color\",\n default_pos: pos_fg,\n default_neg: neg_fg,\n is_gradient: false,\n });\n }\n\n if (fg_mode === \"bar\" || fg_mode === \"label-bar\") {\n fields.push({\n kind: \"Number\",\n key: \"fg_gradient\",\n default: column_stats?.abs_max ?? 0,\n include: true,\n });\n }\n\n fields.push({\n kind: \"Enum\",\n key: \"number_bg_mode\",\n default: \"disabled\",\n variants: [\n { value: \"disabled\", label: \"Disabled\" },\n { value: \"color\", label: \"Color\" },\n { value: \"gradient\", label: \"Gradient\" },\n { value: \"pulse\", label: \"Pulse\" },\n ],\n });\n\n const bg_mode = (current_value?.number_bg_mode as string) ?? \"disabled\";\n if (bg_mode !== \"disabled\") {\n fields.push({\n kind: \"ColorRange\",\n key_pos: \"pos_bg_color\",\n key_neg: \"neg_bg_color\",\n default_pos: pos_bg,\n default_neg: neg_bg,\n is_gradient: bg_mode === \"gradient\" || bg_mode === \"pulse\",\n });\n }\n\n if (bg_mode === \"gradient\") {\n fields.push({\n kind: \"Number\",\n key: \"bg_gradient\",\n include: true,\n default: column_stats?.abs_max ?? 0,\n });\n }\n\n fields.push({ kind: \"NumberFormat\" });\n } else if (type === \"date\" || type === \"datetime\") {\n fields.push({ kind: \"DatetimeFormat\" });\n\n fields.push({\n kind: \"Enum\",\n key: \"datetime_color_mode\",\n default: \"none\",\n variants: [\n { value: \"none\", label: \"None\" },\n { value: \"foreground\", label: \"Foreground\" },\n { value: \"background\", label: \"Background\" },\n ],\n });\n\n const dt_mode =\n (current_value?.datetime_color_mode as string) ?? \"none\";\n\n if (dt_mode !== \"none\") {\n fields.push({\n kind: \"Color\",\n key: \"color\",\n default: this.model!._color[0],\n });\n }\n } else if (type === \"string\") {\n fields.push({ kind: \"StringFormat\" });\n\n fields.push({\n kind: \"Enum\",\n key: \"string_color_mode\",\n default: \"none\",\n variants: [\n { value: \"none\", label: \"None\" },\n { value: \"foreground\", label: \"Foreground\" },\n { value: \"background\", label: \"Background\" },\n { value: \"series\", label: \"Series\" },\n ],\n });\n\n const str_mode = (current_value?.string_color_mode as string) ?? \"none\";\n if (str_mode !== \"none\") {\n fields.push({\n kind: \"Color\",\n key: \"color\",\n default: this.model!._color[0],\n });\n }\n }\n\n const group_by = viewer_config?.group_by ?? [];\n const is_rollup =\n (viewer_config?.group_rollup_mode ?? \"rollup\") === \"rollup\";\n\n if (group_by.length > 0 && is_rollup) {\n fields.push({ kind: \"AggregateDepth\" });\n }\n\n return { fields };\n}\n", "regular-table{--psp-datagrid--hover--border-color:var(--psp-inactive--color,#c5c9d080);margin:12px 0 0 12px;padding:0;font-family:inherit;& div[tabindex]{outline:none}&>div{position:absolute;inset:0;overflow:hidden}& th{text-align:center}& thead tr:not(.rt-autosize) th{max-width:0;overflow:hidden}& thead tr:last-child .rt-float,& tbody .rt-float,& thead .rt-integer,& tbody .rt-integer{text-align:right}& tbody th{text-align:left}& span.rt-tree-container{align-items:center;height:100%;display:flex}& thead .rt-string,& tbody .rt-string,& thead .rt-date,& tbody .rt-date,& thead .rt-datetime,& tbody .rt-datetime{text-align:left}& thead tr:last-child th{border-bottom:1px solid #8b868045}& tbody tr:first-child td,& tbody tr:first-child th{border-top:1px solid #0000!important}& th{position:relative}& tr th span.rt-tree-group{border-left:1px solid #eee;height:100%;margin-left:5px;margin-right:15px}& td,& th{white-space:nowrap;height:var(--psp-datagrid--row--height,19px);padding:0 5px}& table *{box-sizing:border-box}& table{color:#666;outline:none;position:absolute}& span.rt-row-header-icon{color:#aaa;font-family:var(--psp-button--font-family);padding-right:4px}& span.rt-column-header-icon{width:10px;font-size:10px;font-family:var(--psp-button--font-family);padding-left:3px;display:inline-block}& span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0 0 3px #1a7da1}& .rt-selected td{background-color:#eee}& .rt-cell-clip{text-overflow:ellipsis;overflow:hidden}& td span.rt-group-name,& th span.rt-group-name{flex:1;height:100%;margin-right:-5px;padding-left:8px;padding-right:5px}& th span.rt-group-name{text-align:left}& td th span.rt-group-leaf,& th span.rt-group-leaf{height:100%;margin-left:16px}& .rt-column-resize{cursor:col-resize;width:10px;height:100%;position:absolute;top:0;right:0}& a{color:var(--psp-datagrid--pos-cell--color)}& a:visited{color:var(--psp-active--color)}& td.psp-null:after,& th.psp-null:after{content:var(--psp-label--null--content,\"-\");color:var(--psp-label--null--color,inherit);font-size:var(--psp-label--null--font-size,inherit);vertical-align:middle}}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--psp-inactive--border-color,#8b868045)}.psp-header-group{box-shadow:0px 10px 0 -9px var(--psp-inactive--border-color,#8b868045)}.psp-is-top{box-shadow:5px 4px 0px -4px var(--psp-inactive--border-color,#8b868045)}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--psp-inactive--border-color,#8b868045), 0px 10px 0 -9px var(--psp-inactive--border-color,#8b868045)}.psp-header-border.psp-header-group{&:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--psp-inactive--border-color,#8b868045), 0px 10px 0 -9px var(--psp-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(--psp-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(--psp-inactive--border-color,#8b868045)}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--psp-inactive--border-color,#8b868045)}tr:only-child th{box-shadow:none!important}regular-table{& tbody{& tr:hover th.psp-tree-leaf:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover th.psp-tree-label:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover td:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover:after{box-shadow:0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080);border-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important;&.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), 0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080)}}& tr:last-child:hover td:not(.psp-select-region):not(.psp-select-region-inactive).psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), inset 0px -2px 0px var(--psp--color), 0px 1px 0px var(--psp-datagrid--hover--border-color,#c5c9d080)}& tr:hover+tr th.psp-tree-leaf:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover+tr th.psp-tree-label:not(.psp-select-region):not(.psp-select-region-inactive),& tr:hover+tr td:not(.psp-select-region):not(.psp-select-region-inactive){border-top-color:#0000}& tr{& th:first-child:not(:empty),& th:first-child:empty+th:not(:empty),& th:first-child:empty~th:empty+th:not(:empty),& td:first-child{border-left-width:1px;border-left-color:#0000}& th:last-child,& td:last-child{border-right-width:0;border-right-color:#0000}}& tr:hover{color:inherit;& th:first-child:not(:empty),& th:first-child:empty+th:not(:empty),& th:first-child:empty~th:empty+th:not(:empty),& td:first-child{border-left-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important}& th:last-child,& td:last-child{border-right-color:var(--psp-datagrid--hover--border-color,#c5c9d080)!important}}}}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table,:host(:not(.sub-cell-scroll-disabled)) regular-table table{& tbody td,& thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px))}& tbody{transform:translate(0, var(--regular-table--transform-y,0px))}& tbody tr:first-child{& td,& th,&:after{clip-path:polygon(0 var(--regular-table--clip-y,0), 0 200%, 200% 200%, 200% var(--regular-table--clip-y,0))}}& 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)}& 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))}& thead tr:last-child:after,& tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px))}& 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))}& 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;&::-webkit-scrollbar,&::-webkit-scrollbar-corner{background-color:#0000;width:12px;height:12px}&::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--psp--color);border:5.5px solid var(--psp--background-color);min-width:10%;max-width:50%;min-height:10%;max-height:50%}}perspective-viewer,:host{& .psp-menu-enabled{border-radius:3px 3px 0 0;padding:0 6px;font-size:8px}& .psp-menu-enabled:hover,& tr:not(.rt-autosize) th.psp-menu-open{color:var(--psp--background-color);background-color:var(--psp--color);border-bottom-color:var(--psp--color);cursor:pointer}& tr:not(.rt-autosize) th.psp-menu-open{&:before{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:10px;height:8px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--column-settings--mask-image);mask-image:var(--psp-icon--column-settings--mask-image);background-color:var(--psp--background-color);margin-right:4px;display:inline-block}}& td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color)}& tr:first-child td.psp-menu-open{border-top-color:var(--psp--color)!important}& tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--color), inset 2px 0px 0px var(--psp--color), inset 0px -2px 0px var(--psp--color)}}perspective-viewer,:host-context(perspective-viewer){& regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--psp-inactive--border-color,#8b868045)}}.psp-sort-enabled:hover{cursor:pointer}regular-table.flat-group-rollup-mode.vertical-row-headers th.psp-tree-label:not(:last-of-type){writing-mode:vertical-lr}.psp-select-region-inactive,:hover .psp-select-region-inactive,:hover th.psp-tree-leaf.psp-select-region-inactive,:hover th.psp-tree-label.psp-select-region-inactive{background-color:var(--psp-inactive--color)!important;color:var(--psp--background-color)!important;border-color:var(--psp--background-color)!important}.psp-error{color:red}td:focus{outline:1px dotted #666}perspective-viewer.dragging,:host-context(perspective-viewer.dragging){& regular-table{pointer-events:none}}.psp-header-border:last-child{border-right-width:0}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-desc--mask-image);mask-image:var(--psp-icon--sort-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-asc--mask-image);mask-image:var(--psp-icon--sort-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-col-desc--mask-image);mask-image:var(--psp-icon--sort-col-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-col-asc--mask-image);mask-image:var(--psp-icon--sort-col-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-desc--mask-image);mask-image:var(--psp-icon--sort-abs-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-asc--mask-image);mask-image:var(--psp-icon--sort-abs-asc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-col-desc--mask-image);mask-image:var(--psp-icon--sort-abs-col-desc--mask-image);margin-left:4px;display:inline-block}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--psp--color);content:\"\";width:14px;height:11px;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-image:var(--psp-icon--sort-abs-col-asc--mask-image);mask-image:var(--psp-icon--sort-abs-col-asc--mask-image);margin-left:4px;display:inline-block}tbody th:last-of-type{border-right:1px solid var(--psp-inactive--border-color,#8b868045);text-overflow:ellipsis;overflow:hidden}tbody th:empty{background-image:linear-gradient(to right, transparent 9px, var(--psp-inactive--border-color,#eee) 10px, transparent 11px);pointer-events:none;background-repeat:no-repeat;min-width:20px;max-width:20px}regular-table:not(.flat-group-rollup-mode){& .psp-tree-label{min-width:0;max-width:0}& .psp-tree-label:before{color:var(--psp--color);font-family:var(--psp-button--font-family,inherit);padding-right:11px}& .psp-tree-label-expand:before{content:var(--psp-label--tree-expand--content,\"+\")}& .psp-tree-label-collapse:before{content:var(--psp-label--tree-collapse--content,\"-\")}& .psp-tree-label-expand,& .psp-tree-label-collapse{cursor:pointer}& .psp-tree-label:hover:before{color:var(--psp-active--color);text-shadow:0px 0px 5px var(--psp-active--color)}}.psp-tree-leaf{padding-left:24px}.psp-align-right{text-align:right}.psp-color-mode-bar{padding:0 2px}.psp-color-mode-label-bar{padding:0 2px;position:relative;& .psp-bar{isolation:isolate;position:unset}& .psp-bar:before{color:#0000;pointer-events:none;content:var(--label);justify-content:flex-end;align-items:center;padding:0 3px;display:inline-flex}& .psp-bar:after{color:var(--psp-label-bar-bg);content:var(--label);mix-blend-mode:difference;justify-content:flex-end;align-items:center;padding:0 5px;display:inline-flex;position:absolute;inset:0}}.psp-label-bar{pointer-events:none;justify-content:flex-end;align-items:center;padding:0;display:flex;inset:0}.psp-label-bar-fill{background:var(--psp-label-bar-color);pointer-events:none;height:80%;position:absolute;top:10%}.psp-label-bar-text{color:var(--psp-label-bar-bg);mix-blend-mode:difference;pointer-events:none;position:relative}.psp-align-left{text-align:left}.psp-positive:not(:focus){color:var(--psp-datagrid--pos-cell--color)}.psp-negative:not(:focus){color:var(--psp-datagrid--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-width:1px 1px 0 0}.boolean-editable{cursor:pointer}regular-table table{user-select:none;color:inherit;border-collapse:separate;font-size:1em;& th{font-weight:400}& td,& th{border-color:var(--psp-inactive--border-color,#8b868045);height:var(--psp-datagrid--row--height,23px)}& .psp-header-group{text-overflow:ellipsis}& th.psp-header-leaf{border-bottom-width:0;& span{height:var(--psp-datagrid--row--height,23px);min-height:var(--psp-datagrid--row--height,23px)}}& td,& th.psp-tree-label,& th.psp-tree-label,& th.psp-tree-leaf,& tbody tr:first-child th{border-style:solid;border-width:1px 0 0}& tbody th:empty{background-position:0 -10px}& td.psp-select-region,& th.psp-select-region{background-color:var(--psp--color)!important;color:var(--psp--background-color)!important;border-color:var(--psp--background-color)!important}}regular-table tbody tr:hover td.psp-select-region:not(.psp-select-region-inactive),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-select-region-inactive){border-color:var(--psp--background-color)!important}regular-table tbody tr:hover{& td.psp-select-region.psp-menu-open{&:not(.psp-select-region-inactive){box-shadow:inset -2px 0px 0px var(--psp--background-color), inset 2px 0px 0px var(--psp--background-color)}}}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--psp--background-color), inset 2px 0px 0px var(--psp--background-color)}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--psp-datagrid--column-edit-button--content,\"Edit\")}perspective-viewer:not([settings]),:host-context(perspective-viewer:not([settings])){& regular-table #psp-column-edit-buttons:after{content:none}}regular-table table thead tr:last-child:after{box-sizing:border-box;width:10000px;height:var(--psp-datagrid--row--height,23px);content:\" \";border-bottom:1px solid var(--psp-inactive--border-color);display:block}regular-table table tbody tr:after{box-sizing:border-box;width:10000px;height:var(--psp-datagrid--row--height,23px);content:\" \";border-top:1px solid #0000;display:block}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--psp-inactive--border-color)}regular-table table tbody tr:hover:not(:first-child):after,regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--psp-datagrid--hover--border-color)}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,#0080ff80)}to{background-color:var(--pulse--background-color-end,#0080ff00)}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,#0080ff80)}to{background-color:var(--pulse--background-color-end,#0080ff00)}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,#ff190080)}to{background-color:var(--pulse--background-color-end,#ff190000)}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,#ff190080)}to{background-color:var(--pulse--background-color-end,#ff190000)}}", "// \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_config_schema, {\n ColumnConfigSchema,\n} from \"../plugin/column_config_schema.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\nimport { sourceColumn } from \"@perspective-dev/viewer/src/ts/column-format.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type {\n IPerspectiveViewerPlugin,\n PluginStaticConfig,\n} from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\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_static_config(): PluginStaticConfig {\n return {\n name: \"Datagrid\",\n category: \"Basic\",\n select_mode: \"toggle\",\n config_column_names: [\"Columns\"],\n group_rollup_modes: [\"rollup\", \"flat\", \"total\"],\n // Higher priority than the chart plugins so the Datagrid is\n // loaded by default.\n priority: 1,\n can_render_column_styles: true,\n };\n }\n\n plugin_config_schema(): ColumnConfigSchema {\n const fields = [];\n fields.push({\n kind: \"Enum\",\n key: \"edit_mode\",\n default: \"READ_ONLY\",\n variants: [\n { value: \"EDIT\", label: \"Edit\" },\n { value: \"READ_ONLY\", label: \"Read-only\" },\n { value: \"SELECT_ROW\", label: \"Row Select\" },\n { value: \"SELECT_COLUMN\", label: \"Column Select\" },\n { value: \"SELECT_REGION\", label: \"Region Select\" },\n { value: \"SELECT_ROW_TREE\", label: \"Tree Select\" },\n ],\n });\n\n fields.push({\n kind: \"Bool\",\n key: \"scroll_lock\",\n default: false,\n });\n\n return {\n fields,\n };\n }\n\n column_config_schema(\n type: string,\n group: string | undefined,\n column_name: string,\n current_value: Record<string, unknown> | null,\n viewer_config?: { group_by?: string[]; group_rollup_mode?: string },\n column_stats?: { abs_max: number },\n ): ColumnConfigSchema {\n return column_config_schema.call(\n this,\n type as any,\n group,\n column_name,\n current_value,\n viewer_config,\n column_stats,\n );\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(view: View, viewport?: ViewWindow): Promise<string> {\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 = sourceColumn(col_name);\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\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(_view: View): 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 save(): any {\n return save.call(this);\n }\n\n restore(token: DatagridPluginConfig, columns_config?: ColumnsConfig): void {\n return restore.call(this, token, columns_config ?? {});\n }\n\n restyle() {}\n\n delete(): 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{height:100%;display:block;position:relative}:host #container{flex-direction:column;justify-content:stretch;align-items:stretch;display:flex;position:absolute;inset:0}:host #toolbar{align-items:stretch;height:100%;display:flex}:host #toolbar .hover-target{cursor:pointer;align-items:center;margin:0;display:inline-flex;&:hover{box-shadow:-4px 0 0 var(--psp--color), 4px 0 0 var(--psp--color);background-color:var(--psp--color)}}:host #slot-container{flex:1;position:relative}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--psp-toolbar-scroll-lock-active--content)}#scroll_lock:before{-webkit-mask-image:var(--psp-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(--psp-toolbar-edit-mode-read-only--content)}#edit_mode[data-edit-mode=EDIT]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-edit--content)}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=EDIT]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-read-only--content)}#edit_mode[data-edit-mode=SELECT_ROW]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-row--content)}#edit_mode[data-edit-mode=SELECT_COLUMN]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-column--content)}#edit_mode[data-edit-mode=SELECT_REGION]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-region--content)}#edit_mode[data-edit-mode=SELECT_ROW_TREE]:before{-webkit-mask-image:var(--psp-toolbar-edit-mode-select-row-tree--content)}#edit_mode[data-edit-mode=READ_ONLY] span:before{content:var(--psp-label--edit-mode-read-only--content,\"Read Only\")}#edit_mode[data-edit-mode=EDIT] span:before{content:var(--psp-label--edit-mode-edit--content,\"Editable\")}#edit_mode[data-edit-mode=SELECT_ROW] span:before{content:var(--psp-label--edit-mode-select-row--content,\"Row Select\")}#edit_mode[data-edit-mode=SELECT_COLUMN] span:before{content:var(--psp-label--edit-mode-select-column--content,\"Column Select\")}#edit_mode[data-edit-mode=SELECT_REGION] span:before{content:var(--psp-label--edit-mode-select-region--content,\"Region Select\")}#edit_mode[data-edit-mode=SELECT_ROW_TREE] span:before{content:var(--psp-label--edit-mode-select-row-tree--content,\"Tree Select\")}#scroll_lock span:before{content:var(--psp-label--scroll-lock-toggle--content,\"Free Scroll\")}#scroll_lock.lock-scroll span:before{content:var(--psp-label--scroll-lock-alt-toggle--content,\"Align Scroll\")}.button:before{content:\"\";background-color:var(--psp--color);width:21px;height:21px;-webkit-mask-size:cover;mask-size:cover}.button.editable:before,.button.lock-scroll:before{color:inherit}.button{user-select:none;box-sizing:border-box;font-size:var(--label--font-size,.75em);white-space:nowrap;border:1px solid #0000;border-radius:3px;justify-content:center;align-items:center;width:37px;height:22px;padding:0 5px;display:inline-flex}.button>span{margin:0;padding:0;display:none}.hover-target:focus-within .button,.hover-target:hover .button{background-color:var(--psp--color);color:var(--psp--background-color);opacity:1;cursor:pointer;align-items:center;display:flex;position:relative}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--psp--background-color)}.hover-target:focus-within .button>span,.hover-target:hover .button>span{white-space:pre-wrap;background-color:var(--psp--color);text-align:center;border-radius:0 0 3px 3px;width:35px;height:auto;margin:0;padding:5px;font-size:9px;line-height:1;display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%}", "// \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 { HTMLPerspectiveViewerElement } from \"@perspective-dev/viewer\";\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type { DatagridPluginElement } 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 HTMLPerspectiveViewerElement;\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\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,gBCgPP,OAAS,2BAAAA,OAA+B,+CA7NjC,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,CAkKO,IAAMC,EAAuC,OAChD,2BACJ,EA6EO,SAASC,EACZH,EACAI,EACAC,EAAmB,GACZ,CACP,IAAMC,EACFN,EAAM,QAAQ,SAAS,SAAW,GAClCA,EAAM,QAAQ,SAAS,SAAW,EAChCO,EAASH,EAAO,SAAS,CAAC,EAC1BI,EAAWH,GAAWE,GAAQ,aAAe,OACnD,OAAOD,GAAcE,CACzB,CC9PA,IAAMC,GAAiB,6CAEhB,SAASC,EAAaC,EAAuB,CAChD,OAAOF,GAAe,KAAKE,CAAI,CACnC,CCjCA,OACI,uBAAAC,GACA,2BAAAC,GACA,yBAAAC,OACG,kDAOP,IAAMC,GAAN,KAA4C,CACxC,OAAOC,EAAsB,CACzB,OAAOA,EAAM,OAAS,OAC1B,CACJ,EAKaC,EAAN,KAAqB,CAChB,YAER,aAAc,CACV,KAAK,YAAc,IAAI,GAC3B,CAEQ,0BACJC,EACAC,EACmB,CACnB,OAAON,GAAwBM,EAAO,WAAW,CACrD,CAEQ,sBACJD,EACAC,EACmB,CACnB,OAAOP,GAAoBO,EAAO,WAAW,CACjD,CAEQ,wBACJC,EACAD,EACiB,CACjB,OAAOL,GAAsBM,EAAMD,EAAO,aAAa,CAC3D,CAEQ,yBACJD,EACAG,EACS,CACT,OAAO,IAAIN,EACf,CAEA,IAAIK,EAAkBD,EAAqD,CACvE,IAAMG,EAAgB,CAClBF,EACA,GAAG,OAAO,OAAOD,EAAO,aAAe,CAAC,CAAC,EACzC,GAAG,OAAO,OAAOA,EAAO,eAAiB,CAAC,CAAC,CAC/C,EAAE,KAAK,GAAG,EAEV,OAAK,KAAK,YAAY,IAAIG,CAAa,IAC/BF,IAAS,OACT,KAAK,YAAY,IACbE,EACA,KAAK,sBAAsBF,EAAMD,CAAM,CAC3C,EACOC,IAAS,WAChB,KAAK,YAAY,IACbE,EACA,KAAK,0BAA0BF,EAAMD,CAAM,CAC/C,EACOC,IAAS,WAAaA,IAAS,QACtC,KAAK,YAAY,IACbE,EACA,KAAK,wBAAwBF,EAAMD,CAAM,CAC7C,EACOC,IAAS,UAChB,KAAK,YAAY,IACbE,EACA,KAAK,yBAAyBF,EAAMD,CAAM,CAC9C,EAEA,KAAK,YAAY,IAAIG,EAAe,EAAK,GAI1C,KAAK,YAAY,IAAIA,CAAa,CAC7C,CACJ,ECvFA,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,WAI7CO,GAAQ,iBAAmB,OACxBA,GAAQ,iBAAmB,aACjC,CACE,IAAMC,EAAI,KAAK,IACX,EACA,KAAK,IACDV,GACA,KAAK,IAAKM,EAAiBG,EAAO,WAAY,EAC1CT,EACR,CACJ,EAEMW,EAAUL,GAAkB,EAAI,GAAK,yBACrCM,GAAOF,EAAI,KAAK,QAAQ,CAAC,EAE/B,GAAID,EAAO,iBAAmB,MAAO,CACjC,IAAMI,EAAM,KAAK,aAAa,IAAI,EAClC,OAAAA,EAAI,UAAY,UAChBA,EAAI,aACA,QACA,GAAGF,CAAM,SAASC,CAAG,gFACzB,EAEOC,CACX,KAAO,CACH,IAAMC,EAAYhB,GAAa,IAAII,EAAMO,CAAM,EACzCM,EAAQD,EAAYA,EAAU,OAAOR,CAAG,EAAKA,EAE7CO,EAAM,KAAK,aAAa,IAAI,EAClC,OAAAA,EAAI,UAAY,UAChBA,EAAI,aACA,QACA,YAAYE,CAAK,KAAKJ,CAAM,SAASC,CAAG,gFAC5C,EACOC,CACX,CACJ,SAAWJ,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,IAAMc,EAAO,SAAS,cAAc,GAAG,EACvC,OAAAA,EAAK,YAAcV,EACZU,CACX,SAAWP,GAAQ,SAAW,WAAaP,IAAS,SAAU,CAC1D,IAAMe,EAAS,SAAS,cAAc,GAAG,EACzC,OAAAA,EAAO,YAAcX,EACdW,CACX,KAAO,CACH,IAAMH,EAAYhB,GAAa,IAAII,EAAMO,CAAM,EAC/C,OAAOK,EAAYA,EAAU,OAAOR,CAAG,EAAKA,CAChD,CACJ,CCjFO,SAAUY,GAEbC,EAAqB,CAAC,EACtBC,EACAC,EAC0B,CAC1B,IAAMC,EACDD,EAAqBE,CAAqB,GAAK,CAAC,EACrD,QAAWC,KAAQL,EAAO,CACtB,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,QAAWC,KAAQL,EACf,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,CC3DO,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,EAShC,IAAME,EARI,OAAO,KAAKL,CAAO,EAQL,OAAQG,GAAM,CAACG,EAAaH,CAAC,CAAC,EAElDI,EAAe,GACnB,QAASC,EAAI,EAAGA,EAAIH,EAAc,OAAQG,IAElC,KAAK,cAAcP,EAAW,UAAaO,CAAC,IAC5CH,EAAcG,CAAC,IAEfD,EAAe,GACf,KAAK,cAAcN,EAAW,UAAaO,CAAC,EACxCH,EAAcG,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,EAAIH,EAAc,OAAQG,IAAK,CAE3C,IAAMG,GADoBN,EAAcG,CAAC,EAAE,MAAM,GAAG,EAE9B,KAAK,QAAQ,SAAS,MAAM,EAElD,KAAK,aAAaA,EAAIP,EAAW,SAAU,EACvC,CAAC,CAAC,KAAK,cAAcU,EAAM,EAE/B,KAAK,cAAcH,EAAIP,EAAW,SAAU,EACxC,KAAK,QAAQU,EAAM,CAC3B,CACJ,CAEA,KAAK,aAAeV,EACpB,KAAK,KACDD,EAAQ,QACR,MAAMD,EAAKF,CAAE,EACR,KAAK,IAAI,EACT,IAAI,CAACe,EAAGC,IAAU,CAACA,EAAQhB,CAAE,CAAC,EAEvC,KAAK,iBAAmB,KAAK,cACxB,MAAMD,EAAIE,CAAE,EACZ,OAAO,CAACgB,EAAKX,EAAGK,KACbM,EAAI,IAAIX,EAAGK,CAAC,EACLM,GACR,IAAI,GAAqB,EAEhC,KAAK,aAAe,KAAK,MAAM,OAAO,CAACA,EAAKX,EAAGK,KAC3CM,EAAI,IAAIX,GAAG,KAAK,GAAG,EAAGK,CAAC,EAChBM,GACR,IAAI,GAAqB,CAChC,MACI,KAAK,aAAa,MAAM,EACxBZ,EAAc,MAAM,KAAK,MAAM,YAAY,EAG/C,IAAMa,EAAmC,CAAC,EACpCC,EAAwB,CAAC,EACzBC,EAA6B,CAAC,EAC9BC,EAAyB,CAAC,EAE1BC,EAAmB9B,EAAO,aAAa,UAAU,EACvD,QACQ+B,EAAQxB,EACZwB,EAAQ,KAAK,IAAItB,EAAI,KAAK,cAAc,MAAM,EAC9C,EAAEsB,EACJ,CACE,IAAMC,EAAO,KAAK,cAAcD,CAAK,EAC/BE,EAAaD,EAAK,MAAM,GAAG,EAC3BV,EAASX,EAAQqB,CAAI,GAAK,IAAI,MAAMtB,EAAKF,CAAE,EAAE,KAAK,IAAI,EACtD0B,EAAY,KAAK,IAClB5B,EAAqB6B,CAAqB,IACvCF,EAAW,KAAK,QAAQ,SAAS,MAAM,CAC3C,GAAG,iBAAmB,EACtB,KAAK,QAAQ,SAAS,MAC1B,EAEAP,EAAK,KACDJ,EAAO,IAAI,CAACR,EAAGK,KACNR,GAAS,eAAeQ,CAAC,GAAG,QAAU,GAAKe,EACrC,GAEAE,EAAY,KACf,KACAH,EAAW,KAAK,QAAQ,SAAS,MAAM,EACvCnB,EACCR,EAAqB6B,CAAqB,GAAK,CAAC,CACrD,CAEP,CACL,EAEAR,EAAS,KAAKL,CAAmB,EAC7BQ,GACAG,EAAW,KAAK,EAAE,EAGtBL,EAAe,KAAKK,CAAU,EAC9BJ,EAAa,KAAKG,CAAI,CAC1B,CAEA,IAAMK,EAAc5B,EAAKF,EAAK,GAAKG,EAAKF,EAAK,EAGzC6B,IACA,KAAK,kBAAoBnC,EACzB,KAAK,UAAYD,EACjB,KAAK,SAAWE,EAChB,KAAK,iBAAmBC,EACxB,KAAK,qBAAuBC,EAE5BH,EAAoB2B,EACpB5B,EAAY0B,EACZxB,EAAW,KAAK,KAChBC,EAAmB,KAAK,aACxBC,EAAuB,KAAK,kBAGhC,IAAMiC,EAAc3B,EAAQ,eAAiB,OACvC4B,EAAU,KAAK,QAAQ,oBAAsB,OAC7CC,EAAc,MAAM,MACrBF,EACKC,EACIE,GACAC,GACJC,IACJ,KACE,KACAhC,EAAQ,aACR,KAAK,QAAQ,SACbL,CACJ,CACJ,EAEMsC,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,YAAA/B,EACA,YAAa2B,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,CCnPA,IAAMC,GAAc,IAAI,IACpBC,EAA6C,KAGjD,SAASC,GAAUC,EAA2B,CAC1C,IAAMC,EAAID,EAAM,WAAW,GAAG,EAAIA,EAAM,MAAM,CAAC,EAAIA,EACnD,GAAIC,EAAE,SAAW,GAAKA,EAAE,SAAW,EAAG,CAClC,IAAMC,EAAI,SAASD,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAG,EAAE,EAC5BE,EAAI,SAASF,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAG,EAAE,EAC5BG,EAAI,SAASH,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAG,EAAE,EAClC,GAAI,CAAC,MAAMC,CAAC,GAAK,CAAC,MAAMC,CAAC,GAAK,CAAC,MAAMC,CAAC,EAClC,MAAO,CAACF,EAAGC,EAAGC,CAAC,CAEvB,SAAWH,EAAE,SAAW,GAAKA,EAAE,SAAW,EAAG,CACzC,IAAMC,EAAI,SAASD,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC9BE,EAAI,SAASF,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAC9BG,EAAI,SAASH,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EACpC,GAAI,CAAC,MAAMC,CAAC,GAAK,CAAC,MAAMC,CAAC,GAAK,CAAC,MAAMC,CAAC,EAClC,MAAO,CAACF,EAAGC,EAAGC,CAAC,CAEvB,CAEA,OAAO,IACX,CAGA,SAASC,GAAaL,EAA2B,CAC7C,IAAMM,EAAIN,EAAM,MACZ,0DACJ,EACA,OAAKM,EAIE,CACH,KAAK,MAAM,WAAWA,EAAE,CAAC,CAAC,CAAC,EAC3B,KAAK,MAAM,WAAWA,EAAE,CAAC,CAAC,CAAC,EAC3B,KAAK,MAAM,WAAWA,EAAE,CAAC,CAAC,CAAC,CAC/B,EAPW,IAQf,CAGA,SAASC,GAAiBP,EAAoB,CAC1C,GAAI,CAACF,EAAW,CACZ,IAAMU,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQA,EAAO,OAAS,EAC/BV,EAAYU,EAAO,WAAW,IAAI,CACtC,CAEA,GAAI,CAACV,EACD,MAAO,CAAC,EAAG,EAAG,CAAC,EAGnBA,EAAU,UAAY,OACtBA,EAAU,UAAYE,EACtB,IAAMS,EAAaX,EAAU,UAC7B,OAAOC,GAAUU,CAAU,GAAKJ,GAAaI,CAAU,GAAK,CAAC,EAAG,EAAG,CAAC,CACxE,CAGO,SAASC,EAAWV,EAAoB,CAC3C,IAAMW,EAAMX,EAAM,KAAK,EACjBY,EAASf,GAAY,IAAIc,CAAG,EAClC,GAAIC,EACA,OAAOA,EAGX,IAAMC,EAAMd,GAAUY,CAAG,GAAKN,GAAaM,CAAG,GAAKJ,GAAiBI,CAAG,EACvE,OAAAd,GAAY,IAAIc,EAAKE,CAAG,EACjBA,CACX,CAGA,SAASC,GAAMC,EAAmB,CAE9B,OADU,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAMA,CAAC,CAAC,CAAC,EACzC,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CACzC,CAGO,SAASC,GAAS,CAACd,EAAGC,EAAGC,CAAC,EAAgB,CAC7C,MAAO,IAAIU,GAAMZ,CAAC,CAAC,GAAGY,GAAMX,CAAC,CAAC,GAAGW,GAAMV,CAAC,CAAC,EAC7C,CAGO,SAASa,GAAS,CAACf,EAAGC,EAAGC,CAAC,EAAa,CAC1C,IAAMc,EAAKhB,EAAI,IACXiB,EAAKhB,EAAI,IACTiB,EAAKhB,EAAI,IACPiB,EAAM,KAAK,IAAIH,EAAIC,EAAIC,CAAE,EACzBE,EAAM,KAAK,IAAIJ,EAAIC,EAAIC,CAAE,EACzBG,GAAKF,EAAMC,GAAO,EAClBE,EAAIH,EAAMC,EACZG,EAAI,EACJxB,EAAI,EACR,OAAIuB,IAAM,IACNvB,EAAIsB,EAAI,GAAMC,GAAK,EAAIH,EAAMC,GAAOE,GAAKH,EAAMC,GAC3CD,IAAQH,EACRO,IAAMN,EAAKC,GAAMI,GAAKL,EAAKC,EAAK,EAAI,IAAM,GACnCC,IAAQF,EACfM,IAAML,EAAKF,GAAMM,EAAI,GAAK,GAE1BC,IAAMP,EAAKC,GAAMK,EAAI,GAAK,IAI3B,CAACC,EAAGxB,EAAGsB,CAAC,CACnB,CAGO,SAASG,EAAS,CAACD,EAAGxB,EAAGsB,CAAC,EAAa,CAC1C,IAAMI,GAAQF,EAAI,IAAO,KAAO,IAAO,IACvC,GAAIxB,IAAM,EAAG,CACT,IAAM2B,EAAI,KAAK,MAAML,EAAI,GAAG,EAC5B,MAAO,CAACK,EAAGA,EAAGA,CAAC,CACnB,CAEA,IAAMC,EAAIN,EAAI,GAAMA,GAAK,EAAItB,GAAKsB,EAAItB,EAAIsB,EAAItB,EACxC6B,EAAI,EAAIP,EAAIM,EACZE,EAAKC,IACHA,EAAI,IACJA,GAAK,GAGLA,EAAI,IACJA,GAAK,GAGLA,EAAI,EAAI,EACDF,GAAKD,EAAIC,GAAK,EAAIE,EAGzBA,EAAI,EAAI,EACDH,EAGPG,EAAI,EAAI,EACDF,GAAKD,EAAIC,IAAM,EAAI,EAAIE,GAAK,EAGhCF,GAGX,MAAO,CACH,KAAK,MAAMC,EAAEJ,EAAK,EAAI,CAAC,EAAI,GAAG,EAC9B,KAAK,MAAMI,EAAEJ,CAAE,EAAI,GAAG,EACtB,KAAK,MAAMI,EAAEJ,EAAK,EAAI,CAAC,EAAI,GAAG,CAClC,CACJ,CAOO,SAASM,GAAOC,EAAQ9B,EAAQ2B,EAAI,GAAU,CACjD,MAAO,CACH,KAAK,MAAM,KAAK,KAAKG,EAAE,CAAC,EAAIA,EAAE,CAAC,GAAK,EAAIH,GAAK3B,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAI2B,CAAC,CAAC,EAC7D,KAAK,MAAM,KAAK,KAAKG,EAAE,CAAC,EAAIA,EAAE,CAAC,GAAK,EAAIH,GAAK3B,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAI2B,CAAC,CAAC,EAC7D,KAAK,MAAM,KAAK,KAAKG,EAAE,CAAC,EAAIA,EAAE,CAAC,GAAK,EAAIH,GAAK3B,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAI2B,CAAC,CAAC,CACjE,CACJ,CAGO,SAASI,GAAMD,EAAW9B,EAAqB,CAClD,OAAOY,GAASiB,GAAOvB,EAAWwB,CAAC,EAAG,CAAC9B,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAG,EAAG,CAAC,CAClE,CAGO,SAASgC,EACZ,CAAClC,EAAGC,EAAGC,EAAG8B,CAAC,EACXG,EAAmC,CAAC,IAAK,IAAK,GAAG,EACzB,CACxB,SAASN,EAAEO,EAAWvB,EAAmB,CACrC,QAAS,EAAImB,IAAMG,EAAOC,CAAC,EAAI,KAAOJ,GAAKnB,EAAI,MAAQ,GAC3D,CAEA,MAAO,CAACgB,EAAE,EAAG7B,CAAC,EAAG6B,EAAE,EAAG5B,CAAC,EAAG4B,EAAE,EAAG3B,CAAC,CAAC,CACrC,CAGO,SAASmC,EAAiC,CAACrC,EAAGC,EAAGC,CAAC,EAI9C,CAEP,OAAO,KAAK,KAAKF,EAAIA,EAAI,KAAQC,EAAIA,EAAI,KAAQC,EAAIA,EAAI,IAAK,EAAI,IAC5D,UACA,SACV,CAGA,SAASoC,GAAc3B,EAAkB,CACrC,GAAM,CAACY,EAAGxB,EAAGsB,CAAC,EAAIN,GAASJ,CAAG,EACxB,CAACX,EAAGC,EAAGC,CAAC,EAAIS,EACZ,CAAC4B,EAAIC,EAAIC,CAAE,EAAIjB,EAAS,CAACD,EAAI,GAAIxB,EAAGsB,CAAC,CAAC,EACtC,CAACqB,EAAIC,EAAIC,CAAE,EAAIpB,EAAS,CAACD,EAAI,GAAIxB,EAAGsB,CAAC,CAAC,EAC5C,MAAO,oCAAoCkB,CAAE,IAAIC,CAAE,IAAIC,CAAE,SAASzC,CAAC,IAAIC,CAAC,IAAIC,CAAC,aAAawC,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAC5G,CAGO,SAASC,EAAkBC,EAA4B,CAC1D,IAAMnC,EAAMH,EAAWsC,CAAK,EACtBC,EAAYT,GAAc3B,CAAG,EACnC,MAAO,CACHmC,EACAnC,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLoC,EACA,QAAQpC,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,CC3MA,SAASqC,GAAiBC,EAAQC,EAAiB,CAC/C,GAAID,EAAE,SAAWC,EAAE,OACf,MAAO,GAGX,QAASC,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAC1B,GAAIF,EAAEE,CAAC,IAAMD,EAAEC,CAAC,EACZ,MAAO,GAIf,MAAO,EACX,CAEA,SAASC,GAAuBH,EAAUC,EAAmB,CACzD,GAAID,EAAE,SAAWC,EAAE,OACf,MAAO,GAGX,QAASC,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAK,CAC/B,GAAIF,EAAEE,CAAC,EAAE,SAAWD,EAAEC,CAAC,EAAE,OACrB,MAAO,GAGX,QAASE,EAAI,EAAGA,EAAIJ,EAAEE,CAAC,EAAE,OAAQE,IAC7B,GAAIJ,EAAEE,CAAC,EAAEE,CAAC,IAAMH,EAAEC,CAAC,EAAEE,CAAC,EAClB,MAAO,EAGnB,CAEA,MAAO,EACX,CAEA,SAASC,GAASC,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,GAGnE,IAAMC,EAAO,KAAK,UAAU,KAAK,MAAM,EACvC,YAAK,QAAU,EACRA,CACX,CACJ,EAEA,eAAsBC,GAElBP,EACAQ,EACAC,EACAC,EACAC,EAAiC,CAAC,EACZ,CACtB,IAAMC,EAAU,MAAMH,EAAK,WAAW,EACtC,GAAI,MAAM,OAAO,QAAS,CACtB,IAAMI,EAAM,KAAK,MAAM,QACjBC,EAAmBrB,GAAcoB,EAAI,SAAUD,EAAO,QAAQ,EAC9DG,GACDF,EAAI,SAAS,SAAW,GAAKD,EAAO,SAAS,SAAW,IACzDE,EAEEE,EAAmBvB,GAAcoB,EAAI,SAAUD,EAAO,QAAQ,EAC9DK,EAAkBxB,GAAcoB,EAAI,QAASD,EAAO,OAAO,EAC3DM,EAAiBrB,GACnBgB,EAAI,OACJD,EAAO,MACX,EAEMO,EAAetB,GACjBgB,EAAI,KACJD,EAAO,IACX,EAEMQ,EACFP,EAAI,oBAAsBD,EAAO,kBAE/BS,EAAgB,KAAK,MAAM,SAAWX,EAC5C,KAAK,kBAAoBI,EACzB,KAAK,mBAAqBE,EAC1B,KAAK,cACDF,GACAE,GACAE,GACAC,GACAF,EAEJ,KAAK,mBACDG,GACAJ,GACAF,GACAG,GACAI,GACAN,CACR,CAEA,GAAM,CAACO,EAAcC,EAAUC,EAAQC,EAAmBC,CAAU,EAChE,MAAM,QAAQ,IAAI,CACdlB,EAAM,OAAO,EACbC,EAAK,SAAS,EACdA,EAAK,OAAO,EACZA,EAAK,kBAAkB,EACtB,KAAK,cAA+C,YAAY,CACrE,CAAC,EAECkB,EAAqBC,EACvB7B,GAASC,EAAS,0BAA2B,SAAS,CAC1D,EAEM6B,EAAgBC,EAClB/B,GAASC,EAAS,kCAAmC,SAAS,CAClE,EAEM+B,EAAgBD,EAClB/B,GAASC,EAAS,kCAAmC,SAAS,CAClE,EAEMgC,EAAgBF,EAClBG,GAAMJ,EAAc,CAAC,EAAGF,CAAkB,CAC9C,EAEMO,EAAgBJ,EAClBG,GAAMF,EAAc,CAAC,EAAGJ,CAAkB,CAC9C,EAEMQ,EAASL,EACX/B,GAASC,EAAS,sBAAuB,SAAS,CACtD,EAEMoC,EAAkB,CACpB,GAAIZ,EACJ,GAAIC,CACR,EACMY,EAAwB,CAC1B,GAAIf,EACJ,GAAIG,CACR,EAEMa,EAA0B,CAAC,EAC3BC,EAA0B,CAAC,EAC3BC,EAA8B,CAAC,EACjCC,EAAuB,KAAK,YAAc,YAG1CA,IAAe,oBACd7B,EAAO,SAAS,SAAW,GAAKA,EAAO,oBAAsB,UAE9D6B,EAAa,YACb,KAAK,WAAaA,GAGtB,KAAK,aAAc,QAAQ,SAAWA,EACtC,IAAMC,EAAuB,OAAO,OAAO/B,EAAQ,CAC/C,WAAAe,EACA,MAAOjB,EACP,OAAQD,EACR,cAAA6B,EACA,QAASzB,EACT,UAAWW,EACX,QAAAa,EACA,KAAM,CAAC,EACP,mBAAAT,EACA,OAAAQ,EACA,cAAAN,EACA,cAAAE,EACA,cAAAC,EACA,cAAAE,EACA,cAAAI,EACA,cAAAE,EACA,OAAQ9B,EACR,aAAA6B,EACA,WAAAE,EACA,iBAAkB,CACd,eAAgB,CAAC,EACjB,MAAO,EACX,EACA,kBAAmB7B,EAAO,SAAS,IAAK+B,GAC7BN,EAAcM,CAAW,CACnC,EACD,kBAAmB,IAAI,IACvB,mBAAoB,IAAI,IAGxB,aAAchC,EAAO,cAAgB,IAAIP,GAAgB,KAAK,CAClE,CAAC,EAED,OAAAJ,EAAQ,gBACJ4C,GACI,KAAK,aACT,EAAE,KAAKF,EAAO1C,CAAO,EACrB,CACI,aAAe,OACV,iBAAiBA,CAAO,EACxB,iBAAiB,yBAAyB,GACzC,KAAK,GAAK,MAKpB,CACJ,EAEO0C,CACX,CC7OO,IAAMG,EAAkC,CAC3C,YACA,OACA,aACA,gBACA,gBACA,iBACJ,EAEA,SAASC,GAAyBC,EAAgC,CAC9D,OAAKA,EAKDA,EAAM,QAAQ,SAAS,OAAS,GAChCA,EAAM,QAAQ,oBAAsB,OAL7B,EAOf,CAEO,SAASC,EAEZC,EACI,CACJ,GAAI,OAAOA,EAAS,IAAa,CAC7B,IAAIC,EAAML,EAAW,QAAQ,KAAK,UAAU,EAC5C,GACIK,GAAOA,EAAM,GAAKL,EAAW,aAE7BA,EAAWK,CAAG,IAAM,mBACpB,CAACJ,GAAyB,KAAK,KAAK,GAGxCG,EAAOJ,EAAWK,CAAG,CACzB,CAEC,KAAK,eAAgD,eAAe,EACrE,KAAK,WAAaD,EACd,KAAK,QACL,KAAK,MAAM,WAAaA,EACxB,KAAK,MAAM,mBAAqB,OAChC,KAAK,MAAM,iBAAmB,CAC1B,eAAgB,CAAC,EACjB,MAAO,EACX,GAGH,KAAK,eAAgD,UAAU,CAC5D,cAAe,CAAE,UAAWA,CAAK,CACrC,CAAC,EAEG,KAAK,eAAiB,SACtB,KAAK,aAAa,QAAQ,SAAWA,EAE7C,CAEO,SAASE,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,CCzDO,SAASC,EAEZC,EACAC,EAAQ,GACJ,CACJ,GAAI,CAAC,KAAK,aACN,OAGAA,IACA,KAAK,qBAAuBD,GAGhC,IAAME,EAAgB,KAAK,cACrBC,EAAgD,CAClD,GAAGD,EAAc,gBAAgB,CACrC,EACM,CAAE,SAAAE,CAAS,EAAI,KAAK,MAAO,QAC3BC,EAAqBD,GAAU,OAAS,EAAIA,EAAS,OAAS,EAAI,EAExE,QAAWE,KAAO,OAAO,KAAKN,CAAS,EACnC,GAAIM,IAAQ,eACRH,EAAUE,EAAqB,CAAC,EAAIL,EAAUM,CAAG,MAG9C,CACH,IAAMC,EAAQ,KAAK,MAAO,cAAc,QAAQD,CAAG,EAOnD,GAAIC,IAAU,GACV,SAGJJ,EAAUI,EAAQF,CAAkB,EAAIL,EAAUM,CAAG,CAGzD,CAGJJ,EAAc,mBAAmBC,CAAS,CAC9C,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,EAElEJ,EAA6B,CAAC,EACpC,QAAWM,KAAO,OAAO,KAAKH,CAAS,EAAG,CACtC,IAAMO,EAAS,OAAOJ,CAAG,EACzB,GAAIH,EAAUO,CAAM,IAAM,OAAW,CACjC,IAAMH,EAAQG,EAASL,EACnBE,EAAQ,GACRP,EAAU,KAAK,MAAO,cAAcO,CAAK,CAAC,EAAIJ,EAAUO,CAAM,EACvDH,IAAU,KACjBP,EAAU,aAAkBG,EAAUO,CAAM,EAEpD,CACJ,CAEA,OAAOV,CACX,CChGO,SAASW,GACZC,EACAC,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,QAASL,EAAI,EAAGA,EAAIG,EAAO,OAAQH,IAAK,CACpC,IAAMM,EAAQH,EAAOH,CAAC,EAChBO,EAAUH,EAASJ,CAAC,EAEpBQ,EAAOF,EAAM,cAAgBX,EAGnC,GAFAW,EAAM,UAAU,OAAO,gBAAiBE,CAAI,EAC5CD,EAAQ,UAAU,OAAO,gBAAiBC,CAAI,EAC1ChB,EAAM,QAAQ,QAAQ,OAAS,EAC/B,QAAWiB,KAAKhB,EAAa,iBAAiB,IAAI,EAAG,CACjD,IAAMiB,EAAOjB,EAAa,QAAQgB,CAAC,EACnC,GAAI,CAACC,GAAM,cACP,SAGJ,IAAMC,EACFD,EAAK,cACDA,EAAK,cAAc,OAAS,CAChC,IAAMf,EACVc,EAAE,UAAU,OAAO,gBAAiBE,CAAM,CAC9C,CAER,CACJ,CACJ,CACJ,CAKO,SAASC,GACZpB,EACAqB,EACApB,EACAqB,EACI,CACJ,IAAMC,EACFvB,EAAM,QAAQ,SAAS,QACtBA,EAAM,QAAQ,oBAAsB,OAAS,EAAI,GAEhDG,EAAiBH,EAAM,iCAC7B,OAAW,CAAE,QAASwB,EAAI,SAAAC,CAAS,IAAKJ,EAAU,MAAO,CACrD,GACI,CAACI,GACDA,EAAS,OAAS,QAClBA,EAAS,OAAS,aAElB,SAGJ,IAAMC,EACFD,EAAS,gBAAgBzB,EAAM,QAAQ,SAAS,MAAM,EAEpD2B,EAAO3B,EAAM,QAAQ,KAAK,KAAM4B,GAAMA,EAAE,CAAC,IAAMF,CAAW,EAC1DG,EAAY,OAAOJ,EAAS,EAAM,IAClCK,EACDL,EAAS,OAAS,UACfA,EAAS,eAAiBF,GAC7B,CAACM,IACGJ,EAAS,EAAI,GAAKzB,EAAM,QAAQ,QAAQ,SAAW,EAE5DwB,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,EAAahC,EAAOyB,CAAQ,EACnCQ,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,kBAAoBzB,EAAM,QAAQ,SAAS,OAAS,CACrE,EACAwB,EAAG,UAAU,OACT,oBACCU,GAAaD,GAAcE,GAAWC,IACnC,CAACP,GACDJ,EAAS,kBAAoBzB,EAAM,QAAQ,SAAS,MAC5D,EACAwB,EAAG,UAAU,OACT,wBACAvB,EAAa,gBAAgB,EAAEwB,EAAS,QAAS,IAAM,MAC3D,EAGIzB,EAAM,QAAQ,QAAQ,OAAS,GAAKG,EAAgB,CACpD,IAAMgB,EACFM,EAAS,gBAAgBA,EAAS,cAAc,OAAS,CAAC,IAC1DtB,EACJqB,EAAG,UAAU,OAAO,gBAAiBL,CAAM,CAC/C,CACJ,CACJ,CClLA,IAAMkB,GAAoC,CACtC,KAAM,MACN,IAAK,OACL,WAAY,UACZ,UAAW,MACf,EAEMC,GAAwC,CAC1C,KAAM,MACN,IAAK,OACL,WAAY,UACZ,UAAW,MACf,EAEA,eAAsBC,GAClBC,EACAC,EACAC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOJ,EAAa,QAAQG,CAAM,EACxC,GAAI,CAACC,GAAM,cACP,OAGJ,IAAMC,EAAcD,EAAK,cAAcL,EAAM,QAAQ,SAAS,MAAM,EAC9DO,EACFJ,EAAM,SACLA,EAA6C,SAC9CA,EAAM,OACAK,GACAC,GAEJC,EAAMP,EAAM,SACZQ,EAAOJ,EAAYP,EAAO,GAAGM,CAAW,GAAII,CAAG,EACrD,MAAMR,EAAO,QAAQ,CAAE,KAAAS,CAAK,CAAC,CACjC,CAEO,SAASH,GACZR,EACAM,EACAI,EACU,CACV,IAAMC,EAAmB,CAAC,EACtBC,EAAQ,GACZ,QAAWC,KAAab,EAAM,QAAQ,KAAM,CACxC,GAAM,CAACc,EAAcC,CAAS,EAAIF,EAClC,GAAIC,IAAiBR,EAAa,CAC9BM,EAAQ,GACR,IAAMI,EAAOC,GAAYjB,EAAOM,EAAaS,EAAWL,CAAG,EACvDM,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,GACZT,EACAM,EACAI,EACU,CACV,OAAW,CAACI,EAAcC,CAAS,IAAKf,EAAM,QAAQ,KAClD,GAAIc,IAAiBR,EAAa,CAC9B,IAAMK,EAAOM,GAAYjB,EAAOM,EAAaS,EAAWL,CAAG,EAC3D,OAAOC,EAAO,CAACA,CAAI,EAAI,CAAC,CAC5B,CAGJ,MAAO,CAAC,CAACL,EAAaI,EAAM,WAAa,MAAM,CAAC,CACpD,CAEO,SAASO,GACZjB,EACAM,EACAY,EACAC,EACoB,CAEpB,IAAMC,EADkBpB,EAAM,QAAQ,SAAS,OAAS,EACxBF,GAAqBD,GAC/CwB,EAAoCH,EACpCE,EAAMF,CAAQ,EACd,OAEN,GAAIG,EACA,MAAO,CAACf,EAAae,CAAY,CAIzC,CCrGA,eAAsBC,GAClBC,EACAC,EACAC,EACa,CACb,IAAMC,EAAOF,EAAa,QAAQC,EAAM,MAAqB,EAC7D,GAAI,CAACC,GAAQA,EAAK,OAAS,aACvB,OAGJ,IAAMC,EAAeF,EAAM,OAAmB,UAAU,SACpD,yBACJ,EAEIA,EAAM,UAAYE,EAClBJ,EAAM,MAAM,UACPG,EAAK,WAAyB,OAAQE,GAAMA,IAAM,MAAS,EACvD,OAAS,CAClB,EACOH,EAAM,SACbF,EAAM,MAAM,UACPG,EAAK,WAAyB,OAAQE,GAAMA,IAAM,MAAS,EACvD,OAAS,CAClB,EACOD,EACPJ,EAAM,MAAM,SAASG,EAAK,CAAC,EAE3BH,EAAM,MAAM,OAAOG,EAAK,CAAC,EAG7BH,EAAM,UAAY,MAAMA,EAAM,MAAM,SAAS,EAC7CA,EAAM,aAAe,MAAMA,EAAM,MAAM,YAAY,EACnDC,EAAa,KAAK,CACtB,CC9BO,SAASK,GACZC,EACAC,EACAC,EACa,CACb,MAAO,OAAOC,GAAgC,CAC1C,IAAMC,EAAaD,EACnB,GAAIC,EAAW,QAAU,EACrB,OAGJ,IAAIC,EAASD,EAAW,OACxB,GAAIC,GAAQ,UAAY,IAIxB,MAAOA,GAAUA,EAAO,UAAY,MAAQA,EAAO,UAAY,MAE3D,GADAA,EAASA,EAAO,cACZ,CAACA,GAAU,CAACJ,EAAa,SAASI,CAAM,EACxC,OAIR,GAAKA,EAIL,IAAIA,EAAO,UAAU,SAAS,gBAAgB,EAAG,CACzCL,EAAM,aAAe,mBACrBM,GAAsBN,EAAOC,EAAcG,CAAU,EAGzD,MACJ,CAEA,GAAIC,EAAO,UAAU,SAAS,kBAAkB,EAAG,CAE/C,IAAME,EADON,EAAa,QAAQI,CAAM,GAE9B,gBAAgBL,EAAM,QAAQ,SAAS,MAAM,EACvD,MAAME,EAAO,qBAAqB,GAAGK,CAAW,EAAE,CACtD,MAAWF,EAAO,UAAU,SAAS,kBAAkB,GACnDG,GAAYR,EAAOC,EAAcC,EAAQE,EAAYC,CAAM,GAEnE,CACJ,CAEO,SAASI,GACZT,EACAC,EACAC,EACa,CACb,MAAO,OAAOC,GAAgC,CAC1C,IAAMC,EAAaD,EACnB,GAAIC,EAAW,QAAU,EACrB,OAGJ,IAAIC,EAASD,EAAW,OACxB,GAAIC,GAAQ,UAAY,IAIxB,MAAOA,GAAUA,EAAO,UAAY,MAAQA,EAAO,UAAY,MAE3D,GADAA,EAASA,EAAO,cACZ,CAACA,GAAU,CAACJ,EAAa,SAASI,CAAM,EACxC,OAIHA,GAIDA,EAAO,UAAU,SAAS,gBAAgB,GACtCL,EAAM,aAAe,mBACrBM,GAAsBN,EAAOC,EAAcG,CAAU,EAGjE,CACJ,CAEO,SAASM,GAAoBT,EAA2C,CAC3E,OAAQE,GAAuB,CAC3B,IAAMC,EAAaD,EACnB,GAAIC,EAAW,QAAU,EACrB,OAGJ,IAAIC,EAASD,EAAW,OACxB,KAAOC,GAAUA,EAAO,UAAY,MAAQA,EAAO,UAAY,MAE3D,GADAA,EAASA,EAAO,cACZ,CAACA,GAAU,CAACJ,EAAa,SAASI,CAAM,EACxC,OAIHA,IAKDA,EAAO,UAAU,SAAS,gBAAgB,GAC1CD,EAAW,QAAU,IAIrBC,EAAO,UAAU,SAAS,iBAAiB,GAC3C,CAACA,EAAO,UAAU,SAAS,mBAAmB,IAE9CD,EAAW,yBAAyB,CAE5C,CACJ,CC5GO,SAASO,GACZC,EACAC,EACAC,EACO,CACP,IAAMC,EAAOH,EAAM,QAAQE,CAAW,EACtC,GAAI,CAACC,EACD,MAAO,GAGX,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,GAGXF,EAAOE,CACX,SAAWH,IAAS,QAAUA,IAAS,WAAY,CAC/C,IAAMG,EAAS,KAAK,MAAMF,CAAI,EAC9B,GAAI,MAAME,CAAM,EACZ,MAAO,GAGXF,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,GACZR,EACAD,EACAU,EACAC,EACI,CACJ,IAAMR,EAAOH,EAAM,QAAQW,EAAM,MAAqB,EACtD,GAAIR,GAAM,OAAS,QAAUA,GAAM,OAAS,gBAAiB,CACzD,IAAMS,EAAeX,EAAM,aAAaE,EAAK,CAAC,EACxCU,EAAUC,EAAab,EAAOE,CAAI,IAAM,UACxCY,EAAWJ,EAAM,OAAmB,UAAU,SAChD,UACJ,EAEIC,GAAgBC,GAAW,CAACE,GAC5BhB,GAAWC,EAAOC,EAAOU,EAAM,MAAqB,CAE5D,CACJ,CCzDO,SAASK,GACZC,EACAC,EACAC,EACAC,EACa,CACb,OAAQC,GAAuB,CAC3B,IAAMC,EAAaD,EACnB,GAAIE,EAAeN,EAAOE,CAAM,GAAKC,EAAsB,IAAIF,CAAK,EAAG,CACnE,IAAMM,EAASF,EAAW,OAC1BE,EAAO,UAAU,OAAO,WAAW,EACnC,IAAMC,EAAmBL,EAAsB,IAAIF,CAAK,EACxDE,EAAsB,OAAOF,CAAK,EAC9BO,EAAiB,UAAYD,EAAO,cAC/BE,GAAWR,EAAOD,EAAOO,CAAM,IAChCA,EAAO,YAAcC,EAAiB,SAAW,GACjDD,EAAO,UAAU,IAAI,WAAW,EAChCA,EAAO,MAAM,GAGzB,CACJ,CACJ,CAEO,SAASG,GACZC,EACAV,EACAW,EACAT,EACa,CACb,OAAQC,GAAuB,CAE3B,IAAMG,EADaH,EACO,OACpBS,EAAOZ,EAAM,QAAQM,CAAM,EACjC,GAAIM,GAAM,OAAS,OAAQ,CACvB,IAAMC,EAA8B,CAChC,EAAGD,EAAK,EACR,EAAGA,EAAK,EACR,QAASN,EAAO,aAAe,MACnC,EACAJ,EAAsB,IAAIF,EAAOa,CAAS,CAC9C,CACJ,CACJ,CC7CO,SAASC,GACZC,EACAC,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,EAGpC,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,EAGhD,EAEf,CAKR,OACI,SAAS,gBAAkB,SAAS,MACpCT,EAAa,SAASG,EAAK,aAAa,GAEvCA,EAAK,cAA8B,KAAK,EAGtC,EACX,CCxEA,SAASO,GAAKC,EAA4C,CACtD,IAAIC,EACJ,OAAO,eACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACyB,CACzB,GAAIN,EAAa,CACb,MAAMA,EACN,MACJ,CAEA,IAAIO,EACJP,EAAc,IAAI,QAASQ,GAAOD,EAAUC,CAAE,EAC9C,IAAMC,EAAS,MAAMV,EACjBE,EACAC,EACAC,EACAC,EACAC,EACAC,CACJ,EACA,OAAAN,EAAc,OACdO,EAAS,EACFE,CACX,CACJ,CAOA,SAASC,GAAOC,EAAsC,CAClD,GAAIA,EAAK,kBAAmB,CACxB,IAAMC,EAAUD,EAAK,YAAY,EAC5B,aAAa,GACZ,WAAW,CAAC,EAClB,GAAI,CAACC,EACD,MAAO,GAGX,IAAMC,EAAQD,EAAO,WAAW,EAChC,OAAAC,EAAM,mBAAmBF,CAAI,EAC7BE,EAAM,OAAOD,EAAO,aAAcA,EAAO,SAAS,EAC3CC,EAAM,SAAS,EAAE,MAC5B,KACI,QAAOF,EAAK,gBAAkB,CAEtC,CAEA,IAAMG,EAAgBhB,GAAK,eACvBG,EACAC,EACAC,EACAC,EACAC,EACAC,EACa,CACb,IAAMS,EAAOb,EAAM,QAAQE,CAAW,EACtC,GAAI,CAACW,GAAQA,EAAK,OAAS,OACvB,OAGJ,IAAMC,EAAcf,EAAM,cAAc,OAClCgB,EAAWhB,EAAM,UACjBiB,EAAoBf,EAAsB,IAAID,CAAK,EACzD,GAAI,CAACgB,EACD,OAGAH,EAAK,EAAIV,EAAKW,GAAe,GAAKD,EAAK,EAAIV,IAC3Ca,EAAkB,EAAIH,EAAK,EAAIV,GAG/BU,EAAK,EAAIT,EAAKW,GAAY,GAAKF,EAAK,EAAIT,IACxCY,EAAkB,EAAIH,EAAK,EAAIT,GAGnC,IAAMa,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,EACxCT,EAAIO,EAAK,GAAKV,EACdkB,EAAIR,EAAK,GAAKT,EAClB,KACI,CAACkB,GAAkBtB,EAAOC,CAAqB,GAC/CK,GAAKW,GACLX,EAAIY,GACJG,GAAKF,GACLE,EAAID,GAEJ,MAAMpB,EAAM,aAAaM,EAAGe,CAAC,EAC7BpB,EAAsB,IAAID,EAAOgB,CAAiB,EAClDV,GAAKH,EACLkB,GAAKjB,CAEb,CAAC,EAED,SAASmB,GACLxB,EACAC,EACAwB,EACO,CACP,IAAMX,EAAOb,EAAM,QAAQwB,CAAM,EACjC,OAAOX,GAAM,OAAS,QAAUA,EAAK,IAAMd,EAAM,UAAY,CACjE,CAEO,SAAS0B,GACZ1B,EACAC,EACA0B,EACAzB,EACA0B,EACI,CACJ,IAAMH,EAAUxB,EAAM,YAAY,EAC7B,cAEL,OADC2B,EAAM,OAAuB,UAAU,OAAO,WAAW,EAClDA,EAAM,IAAK,CACf,IAAK,QACDA,EAAM,eAAe,EACjBJ,GAAWxB,EAAOC,EAAOwB,CAAM,GAC/BA,EAAO,KAAK,EACZvB,EAAsB,OAAOD,CAAK,GAC3B2B,EAAM,SACbf,EACIb,EACAC,EACAC,EACAuB,EACA,EACA,EACJ,EAEAZ,EACIb,EACAC,EACAC,EACAuB,EACA,EACA,CACJ,EAGJ,MACJ,IAAK,YACGhB,GAAOgB,CAAgC,IAAM,IAC7CG,EAAM,eAAe,EACrBf,EACIb,EACAC,EACAC,EACAuB,EACA,GACA,CACJ,GAGJ,MACJ,IAAK,UACDG,EAAM,eAAe,EACrBf,EAAcb,EAAOC,EAAOC,EAAuBuB,EAAQ,EAAG,EAAE,EAChE,MACJ,IAAK,aAEGhB,GAAOgB,CAAgC,KACtCA,EAAO,aAAa,QAAU,KAE/BG,EAAM,eAAe,EACrBf,EACIb,EACAC,EACAC,EACAuB,EACA,EACA,CACJ,GAGJ,MACJ,IAAK,YACDG,EAAM,eAAe,EACrBf,EAAcb,EAAOC,EAAOC,EAAuBuB,EAAQ,EAAG,CAAC,EAC/D,MACJ,QACJ,CACJ,CCvMO,SAASI,GACZC,EACAC,EACAC,EACAC,EACa,CACb,OAAQC,GAAuB,CAC3B,IAAMC,EAAWD,EACjB,GAAIJ,EAAM,aAAe,OAAQ,CAC7B,GAAI,CAACM,EAAeN,EAAOE,CAAM,EAC7B,OAGSK,GACTP,EACAC,EACAC,EACAC,EACAE,CACJ,CACJ,MACI,QAAQ,MACJ,QAAQL,EAAM,UAAU,0CAC5B,CAER,CACJ,CAEO,SAASQ,GACZR,EACAC,EACAC,EACa,CACb,OAAQE,GAAuB,CAC3B,IAAMK,EAAaL,EACnB,GAAIJ,EAAM,aAAe,OAAQ,CAC7B,GAAI,CAACM,EAAeN,EAAOE,CAAM,EAC7B,OAGOQ,GAAcV,EAAOC,EAAOC,EAAQO,CAAU,CAC7D,CACJ,CACJ,CCpCA,eAAOE,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,EASzCK,EADY,OAAO,KAAKP,EAAE,CAAC,CAAC,EAAE,OAAQQ,GAAM,CAACC,EAAaD,CAAC,CAAC,EACnCb,CAAO,EAChCe,EAA2B,CAC7B,IAAKV,EAAE,CAAC,EACR,aAAc,CAAC,EACf,OAAQ,CAAE,OAAQ,CAAC,CAAE,CACzB,EAEIW,EAA2B,CAAC,EAChC,GAAIJ,EAAc,CACd,IAAMK,EAAkBL,EAAa,MAAM,GAAG,EAC9CG,EAAO,aAAe,CAACE,EAAgBf,EAAS,MAAM,CAAC,EACvDc,EAAiBd,EACZ,IAAI,CAACO,EAAOC,IAA8B,CACvC,IAAMC,EAAcM,EAAgBP,CAAK,EACzC,OAAOC,EAAc,CAACF,EAAO,KAAME,CAAW,EAAI,MACtD,CAAC,EACA,OAAQJ,GAAmBA,IAAM,MAAS,EAC1C,OAAO,CAAC,CAAC,CAAE,CAAEW,CAAK,IAAM,CAACJ,EAAaI,CAAe,CAAC,CAC/D,CAEA,IAAMC,EAASrB,EAAQ,OAAO,OAAOU,CAAW,EAAE,OAAOQ,CAAc,EACvE,OAAAD,EAAO,OAAS,CAAE,OAAAI,CAAO,EAClBJ,CACX,CC1DO,SAASK,GACZC,EACAC,EACAC,EACa,CACb,MAAO,OAAOC,GAAgC,CAC1C,IAAMC,EAAaD,EACbE,EAAOJ,EAAM,QAAQG,EAAW,MAAqB,EAC3D,GAAI,CAACC,GAAQA,EAAK,OAAS,OACvB,OAGJ,GAAM,CAAE,EAAAC,EAAG,EAAAC,CAAE,EAAIF,EACX,CAAE,IAAAG,EAAK,aAAAC,EAAc,OAAAC,CAAO,EAAI,MAAMC,EAAcX,EAAOO,EAAGD,CAAC,EACrEJ,EAAO,cACH,IAAI,YAAoC,oBAAqB,CACzD,QAAS,GACT,SAAU,GACV,OAAQ,CACJ,IAAAM,EACA,aAAAC,EACA,OAAAC,CACJ,CACJ,CAAC,CACL,CACJ,CACJ,CCrBA,IAAME,GAA4B,sBAarBC,GAAwB,CACjCC,EACAC,EACA,CACI,UAAAC,EAAYJ,GACZ,SAAAK,EAAW,CAAC,EACZ,SAAAC,CACJ,EAAkC,CAAC,KAEnCJ,EAAS,MAAO,iBAAmB,CAC/B,eAAgBG,EAChB,MAAO,EACX,EAEAF,EAAM,iBACF,YACAI,GAAqBL,EAAUC,EAAOC,CAAS,CACnD,EAEAD,EAAM,iBACF,YACAK,GAAqBN,EAAUC,EAAOC,CAAS,CACnD,EAEAD,EAAM,iBACF,UACAM,GAAmBP,EAAUC,EAAOC,EAAWE,CAAQ,CAC3D,EAEAH,EAAM,iBAAiB,IACnBO,EAAyBR,EAAUC,EAAOC,CAAS,CACvD,EAEOD,GAGX,SAASQ,GAAkBC,EAAyB,CAChD,OAAOA,IAAS,iBACpB,CAEA,IAAML,GACF,CACIL,EACAC,EACAC,IAEHS,GAAuB,CACpB,IAAMC,EAAaD,EACnB,GACIC,EAAW,SAAW,GACtBC,GAAgBb,EAAS,MAAO,UAAU,EAC5C,CACE,GAAIS,GAAkBT,EAAS,MAAO,UAAU,EAC5C,OAGJA,EAAS,MAAO,iBAAiB,8BAAgC,CAAC,EAClE,IAAMc,EAAOb,EAAM,QAAQW,EAAW,MAAqB,EAC3D,GACIE,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACEd,EAAS,MAAO,iBAAiB,8BAC7B,CACI,EAAGc,EAAK,EACR,EAAGA,EAAK,CACZ,EAEJd,EAAS,MAAO,iBAAiB,mBAC7BA,EAAS,MAAO,iBAAiB,eACrCA,EAAS,MAAO,iBAAiB,eAAiB,CAAC,EAEnD,IAAMe,EAAuB,CACzB,GAAID,EAAK,EACT,GAAIA,EAAK,EACT,GAAIA,EAAK,EACT,GAAIA,EAAK,CACb,EACAd,EAAS,MAAO,iBAAiB,oBAAsBe,EACvDP,EACIR,EACAC,EACAC,EACAF,EAAS,MAAO,iBAAiB,eAAe,OAAO,CACnDe,CACJ,CAAC,CACL,EAEA,MACJ,CACJ,CAEAf,EAAS,MAAO,iBAAiB,eAAiB,CAAC,CACvD,EAEEM,GACF,CACIN,EACAC,EACAC,IAEHS,GAAuB,CACpB,IAAMC,EAAaD,EACbD,EAAOV,EAAS,MAAO,WAC7B,GAAIa,GAAgBH,CAAI,GAAK,CAACD,GAAkBC,CAAI,GAE5CV,EAAS,MAAO,iBACX,+BACLA,EAAS,MAAO,iBAAiB,8BAC5B,IAAM,OACb,CACE,IAAMc,EAAOb,EAAM,QAAQW,EAAW,MAAqB,EAC3D,GACIE,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACE,IAAME,EAAoC,CACtC,GAAI,KAAK,IACLF,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,CACJ,EAEAA,EAAS,MAAO,iBAAiB,oBAC7BgB,EAEJR,EACIR,EACAC,EACAC,EACAF,EAAS,MAAO,iBAAiB,eAAe,OAAO,CACnDgB,CACJ,CAAC,CACL,CACJ,CACJ,CAER,EAEET,GACF,CACIP,EACAC,EACAC,EACAE,IAEHO,GAAuB,CACpB,IAAMC,EAAaD,EACbD,EAAOV,EAAS,MAAO,WAC7B,GAAIa,GAAgBH,CAAI,EAAG,CACvB,IAAMI,EAAOb,EAAM,QAAQW,EAAW,MAAqB,EAC3D,GAAI,CAACE,EACD,OAIJ,GAAIL,GAAkBC,CAAI,EAAG,CACzB,IACKI,EAAK,OAAS,QAAUA,EAAK,OAAS,eACvCA,EAAK,IAAM,QACXA,EAAK,GAAK,EACZ,CACE,IAAMG,EACFjB,EAAS,MAAO,iBAAiB,eAIrC,GAFIiB,EAAS,OAAS,GAAKA,EAAS,CAAC,EAAE,KAAOH,EAAK,EAI/Cd,EAAS,MAAO,iBAAiB,eAAiB,CAAC,EACnDA,EAAS,MAAO,iBAAiB,MAAQ,GACzCQ,EACIR,EACAC,EACAC,EACA,CAAC,CACL,EACAE,IAAWa,EAAS,CAAC,EAAG,EAAI,MACzB,CAEH,IAAMC,EAAsB,CACxB,GAAI,EACJ,GAAI,EACJ,GAAIJ,EAAK,EACT,GAAIA,EAAK,CACb,EACAd,EAAS,MAAO,iBAAiB,eAAiB,CAC9CkB,CACJ,EACAlB,EAAS,MAAO,iBAAiB,MAAQ,GACzCQ,EAAyBR,EAAUC,EAAOC,CAAS,EACnDE,IAAWc,EAAM,EAAK,CAC1B,CACJ,CAEAlB,EAAS,MAAO,iBAAiB,8BAC7B,CAAC,EACLA,EAAS,MAAO,iBAAiB,oBAC7B,OACJ,MACJ,CAGA,IACKA,EAAS,MAAO,iBAAiB,oBAAoB,QAClD,GAAK,EACX,CACE,IAAMG,EACFH,EAAS,MAAO,iBAAiB,mBAAoB,CAAC,EAC1D,GACIG,EAAS,KAAOA,EAAS,IACzBA,EAAS,KAAOA,EAAS,IACzBW,GAAM,OAAS,QACfX,EAAS,KAAOW,EAAK,GACrBX,EAAS,KAAOW,EAAK,EACvB,CACEd,EAAS,MAAO,iBAAiB,eAAiB,CAAC,EACnDA,EAAS,MAAO,iBAAiB,mBAAqB,CAAC,EACvDA,EAAS,MAAO,iBAAiB,8BAC7B,CAAC,EACLA,EAAS,MAAO,iBAAiB,oBAC7B,OACJQ,EAAyBR,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,QACXc,GAAM,OAAS,QACfA,EAAK,IAAM,QACXA,EAAK,IAAM,OACb,CACE,IAAMK,EAA2B,CAC7B,GAAI,KAAK,IACLL,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,EACA,GAAI,KAAK,IACLc,EAAK,EACLd,EAAS,MAAO,iBACX,8BAA8B,CACvC,CACJ,EACAA,EAAS,MAAO,iBAAiB,eAAe,KAAKmB,CAAS,EAC9DX,EAAyBR,EAAUC,EAAOC,CAAS,CACvD,CAEAF,EAAS,MAAO,iBAAiB,8BAAgC,CAAC,EAClEA,EAAS,MAAO,iBAAiB,oBAAsB,MAC3D,CACJ,EAEJ,SAASoB,GAAoBV,EAAyB,CAClD,OAAOA,IAAS,iBAAmBA,IAAS,eAChD,CAEA,SAASW,GAAiBX,EAAyB,CAC/C,OACIA,IAAS,cACTA,IAAS,iBACTA,IAAS,iBAEjB,CAEA,SAASY,GACLC,EACAvB,EACA,CAAE,GAAAwB,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,EACb,CACJ,IAAMC,EAAuB,CAAC,EACxBlB,EAAOV,EAAS,MAAO,WACzBwB,IAAO,QAAaJ,GAAoBV,CAAI,IAC5CkB,EAAS,UAAYJ,GAGrBC,IAAO,QAAaL,GAAoBV,CAAI,IAC5CkB,EAAS,QAAUH,EAAK,GAGxBC,IAAO,QAAaL,GAAiBX,CAAI,IACzCkB,EAAS,UAAYF,GAGrBC,IAAO,QAAaN,GAAiBX,CAAI,IACzCkB,EAAS,QAAUD,EAAK,GAG5BJ,EAAO,aAAaK,CAAQ,CAChC,CAIA,IAAMC,GAAsD,CACxD,cAAe,CAACC,EAAGC,IACfA,EAAE,IAAMD,EAAE,GAAKA,EAAE,GAAKC,EAAE,IAAMA,EAAE,IAAMD,EAAE,GAAKA,EAAE,GAAKC,EAAE,GAC1D,WAAY,CAACD,EAAGC,IAAMA,EAAE,IAAMD,EAAE,GAAKA,EAAE,GAAKC,EAAE,GAC9C,gBAAiB,CAACD,EAAGC,IAAMA,EAAE,IAAMD,EAAE,GAAKA,EAAE,GAAKC,EAAE,GACnD,cAAe,CAACD,EAAGC,IAAMA,EAAE,IAAMD,EAAE,GAAKA,EAAE,GAAKC,EAAE,EACrD,EAEA,SAASlB,GAAgBH,EAAyB,CAC9C,OACIA,IAAS,iBACTA,IAAS,cACTA,IAAS,iBACTA,IAAS,iBAEjB,CAEO,IAAMF,EAA2B,CACpCR,EACAC,EACAC,EACAC,IACO,CACP,IAAMO,EAAOV,EAAS,MAAO,WAC7B,GAAIa,GAAgBH,CAAI,EAMpB,GALAP,EAAWH,EAAS,MAAO,iBAAiB,eAAe,MAAM,CAAC,EAC9DA,EAAS,MAAO,iBAAiB,qBACjCG,EAAS,KAAKH,EAAS,MAAO,iBAAiB,mBAAmB,EAGlEG,EAAS,OAAS,EAClBmB,GACItB,EAAS,cACTA,EACAG,EAAS,CAAC,CACd,EAKKM,GAAkBC,CAAI,GACvBsB,GAAwBhC,EAAUC,EAAOE,EAAUD,CAAS,MAE7D,CAECF,EAAS,cACX,aAAa,EACf,IAAMiC,EAAMhC,EAAM,iBAAiB,UAAU,EAC7C,QAAWiC,KAAMD,EACbC,EAAG,UAAU,OAAOhC,CAAS,CAErC,SACOF,EAAS,MAAO,iBAAiB,MAAO,CAC/CA,EAAS,MAAO,iBAAiB,MAAQ,GACzC,IAAMmC,EAAQlC,EAAM,iBAAiB,oBAAoB,EACzD,QAAWmC,KAAQD,EACfC,EAAK,UAAU,OAAOlC,CAAS,CAEvC,CACJ,EAEM8B,GAA0B,CAC5BhC,EACAC,EACAE,EACAD,IACO,CACP,IAAMmC,EAAYR,GAAqB7B,EAAS,MAAO,UAAU,EACjE,GAAI,CAACqC,GAAalC,EAAS,SAAW,EAClC,OAGJ,IAAM8B,EAAMhC,EAAM,iBAAiB,UAAU,EAC7C,QAAWiC,KAAMD,EAAK,CAClB,IAAMnB,EAAOb,EAAM,QAAQiC,CAAiB,EAC5C,GAAI,CAACpB,GAAQA,EAAK,OAAS,OACvB,SAGJ,IAAIwB,EAAW,GACf,QAAWpB,KAAQf,EAEXe,EAAK,KAAO,QACZA,EAAK,KAAO,QACZA,EAAK,KAAO,QACZA,EAAK,KAAO,QACZmB,EAAUvB,EAAMI,CAAI,IAEpBoB,EAAW,GACXtC,EAAS,MAAO,iBAAiB,MAAQ,GACzCkC,EAAG,UAAU,IAAIhC,CAAS,GAI7BoC,GACDJ,EAAG,UAAU,OAAOhC,CAAS,CAErC,CACJ,ECrbO,SAASqC,GACZC,EACAC,EACAC,EACAC,EACI,CACJ,GAAIF,EAAW,SAAW,EACtB,OAIJ,IAAMG,EAAiBJ,EAAM,iCACvBK,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,EACX,SAGJ,IAAMC,EAAOF,EAAM,cAAgBX,EACnCW,EAAM,UAAU,OAAO,gBAAiBE,CAAI,EAC5CD,EAAQ,UAAU,OAAO,gBAAiBC,CAAI,CAClD,CACJ,CACJ,CAGA,IAAMC,EAAkBlB,EAAM,QAAQ,SAAS,OAC/C,GAAIkB,EAAkBjB,EAAW,OAAQ,CACrC,IAAMkB,EAAalB,EAAWiB,CAAe,EACzCC,GACAC,GAAqBpB,EAAOmB,EAAYjB,EAAc,EAAK,CAEnE,CAEA,IAAMmB,EAAmBrB,EAAM,QAAQ,SAAS,OAAS,EACzD,GAAIqB,EAAmBpB,EAAW,OAAQ,CACtC,IAAMqB,EAAcrB,EAAWoB,CAAgB,EAC3CC,GACAF,GAAqBpB,EAAOsB,EAAapB,EAAc,EAAI,CAEnE,CACJ,CC/EO,SAASqB,GACZC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAeH,EAAM,QAAQ,SAAS,OACtCI,EAAiB,CAAC,EACpBC,EAAS,IAAI,IAEjB,QAASC,EAAI,EAAGA,EAAIL,EAAW,OAAQK,IAAK,CACxC,GAAM,CAAE,MAAAC,CAAM,EAAIN,EAAWK,CAAC,EACxBE,EAAO,IAAI,IAEjB,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACnC,GAAM,CAAE,QAASC,EAAI,SAAAC,CAAS,EAAIJ,EAAME,CAAC,EACzC,GAAI,CAACE,EACD,SAGJD,EAAG,MAAM,gBAAkB,GAE3B,IAAME,EACDD,EAAS,OAAS,UACfR,EAAe,GACfQ,EAAS,eAAiBR,GAC7BQ,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,2BAA4B,EAAK,EACrDA,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,KAAOL,EAAEE,CAAC,GAAKF,EAAEE,CAAC,EAAEO,CAAE,EAAG,EAAEA,EAAI,CAE/BL,EAAK,IAAIK,CAAE,EAEX,IAAMC,EAAOJ,EACb,QAASK,EAAKF,EAAIE,EAAKF,EAAKC,EAAK,QAAS,EAAEC,EACxC,QAASC,EAAKV,EAAGU,EAAKV,EAAIQ,EAAK,QAAS,EAAEE,EACjCZ,EAAEY,CAAE,IACLZ,EAAEY,CAAE,EAAI,CAAC,GAGbZ,EAAEY,CAAE,EAAED,CAAE,EAAI,GAIpBD,EAAK,UAAU,OAAO,aAAcR,IAAM,GAAK,CAACD,EAAO,IAAIQ,CAAE,CAAC,CAClE,CAEAR,EAASG,CACb,CACJ,CCxEO,SAASS,GACZC,EACAC,EACAC,EACA,CAAC,CAAE,CAAE,CAAE,CAAE,CAAEC,EAAOC,CAAK,EACvB,CAAC,CAAE,CAAE,CAAE,CAAE,CAAEC,EAAOC,CAAK,EACvBC,EACI,CACJ,IAAMC,EAAKR,EAAM,OAAOC,EAAS,IAAM,CAAC,GAAG,KAAK,GAAG,EAC7CQ,GACFF,GACON,EAAS,eAAiB,CAAC,GAAG,MAAM,EAAG,EAAE,EACzCA,EAAS,eAAiB,CAAC,GACpC,KAAK,GAAG,EAEV,GACID,EAAM,sBAAsB,IAAIS,CAAa,GAC7CT,EAAM,kBAAkB,IAAIQ,CAAE,EAChC,CACE,IAAME,EAAUV,EAAM,kBAAkB,IAAIQ,CAAE,EACxCG,EAAUX,EAAM,qBAAqB,IAAIS,CAAa,EACvDT,EAAM,iBAGPW,IAAY,QACZD,IAAY,QACXV,EAAM,YAAYW,CAAO,IAAID,CAAO,IACjC,QACHV,EAAM,UAAWW,CAAO,EAAGD,CAAO,GAC7BT,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,QACXV,EAAM,YAAYW,CAAO,IAAID,CAAO,IACjC,QACHV,EAAM,UAAWW,CAAO,EAAGD,CAAO,GAC7BT,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,GACZC,EACAC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,GAAeF,EAAS,MAAQ,GAAK,EACrCG,GAAeH,EAAS,MAAQ,GAAK,EAEvCI,EACAN,GAAQ,eAAiB,OACzBM,EAAeN,EAAO,aAEtBM,EAAeP,EAAM,cAGzB,IAAIQ,EACAP,GAAQ,eAAiB,OACzBO,EAAeP,EAAO,aAEtBO,EAAeR,EAAM,cAGzB,IAAMS,EAAwBJ,EACxBE,EACAD,EACEE,EACA,CACI,GACAR,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1B,GACA,GACA,EACJ,EAER,CACI,GAAM,CAACU,EAAKC,EAAGC,EAAGC,CAAC,EAAIJ,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,IAAMa,EAAI,KAAK,IACX,EACA,KAAK,IACD,EACA,KAAK,KAAKX,EAAS,MAAQ,IAAMF,EAAO,aAAe,EAAE,CAC7D,CACJ,EACMc,EAASf,EAAM,mBACfgB,EAAaC,EACfC,EAAU,CAACP,EAAGC,EAAGC,EAAGC,CAAC,EAAGC,CAAM,CAClC,EAEAb,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,MAAQc,EACjBd,EAAG,MAAM,gBAAkB,QAAQS,CAAC,IAAIC,CAAC,IAAIC,CAAC,IAAIC,CAAC,GACvD,MAAWb,GAAQ,iBAAmB,SAClCkB,GACInB,EACAG,EACAD,EACAK,EACAC,EACAJ,CACJ,EACAF,EAAG,MAAM,gBAAkB,KAE3BD,GAAQ,iBAAmB,YAC1BA,GAAQ,eAETC,EAAG,MAAM,UAAY,GACrBA,EAAG,MAAM,gBAAkB,GAKnC,CAEA,IAAMkB,EACEnB,GAAQ,eAAiB,OAClBI,EACDJ,EAAO,aACPK,EACEL,EAAO,aACP,CACI,GACAD,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1B,GACA,GACA,EACJ,EAEDK,EACDL,EAAM,cACNM,EACEN,EAAM,cACN,CACI,GACAA,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1BA,EAAM,mBAAmB,CAAC,EAC1B,GACA,GACA,EACJ,EAIV,CAACU,EAAK,CAAE,CAAE,CAAEW,CAAO,EAAID,EAE7B,GAAIjB,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,WACVD,GAAQ,iBAAmB,WAClC,GAAIA,GAAQ,iBAAmB,QAAS,CACpC,IAAMc,EAASf,EAAM,mBACfgB,EAAaC,EACfC,EAAU,CAACT,EAAS,CAAC,EAAGA,EAAS,CAAC,EAAGA,EAAS,CAAC,EAAG,CAAC,EAAGM,CAAM,CAChE,EACAb,EAAG,MAAM,MAAQc,CACrB,MAAWf,GAAQ,iBAAmB,aAGlCC,EAAG,MAAM,MAAQ,SAEdD,GAAQ,iBAAmB,OAClCC,EAAG,MAAM,MAAQ,GACjBA,EAAG,MAAM,SAAW,WACpBA,EAAG,MAAM,YAAY,wBAAyBmB,CAAO,EACrDnB,EAAG,MAAM,YAAY,qBAAsBQ,CAAG,GACvCT,GAAQ,iBAAmB,aAClCC,EAAG,MAAM,MAAQ,GACjBA,EAAG,MAAM,YAAY,wBAAyBmB,CAAO,EACrDnB,EAAG,MAAM,YAAY,qBAAsBQ,CAAG,IACvCT,GAAQ,iBAAmB,SAAW,CAACA,GAAQ,kBACtDC,EAAG,MAAM,MAAQQ,EAEzB,CCxJO,SAASY,GACZC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAcD,EAAS,gBAAgBH,EAAM,QAAQ,SAAS,MAAM,EACpEK,EACEJ,GAAQ,QAAU,OACXA,EAAO,MAEPD,EAAM,OAIf,CAACM,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,EAASV,EAAM,mBACfW,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,CACOJ,EAAM,kBAAkB,IAAII,CAAW,IACxCJ,EAAM,kBAAkB,IAAII,EAAa,IAAI,GAAK,EAClDJ,EAAM,mBAAmB,IAAII,EAAa,CAAC,GAG/C,IAAMU,EAAad,EAAM,kBAAkB,IAAII,CAAW,EAC1D,GAAID,EAAS,MAAQ,CAACW,EAAW,IAAIX,EAAS,IAAI,EAAG,CACjD,IAAMY,EAAOf,EAAM,mBAAmB,IAAII,CAAW,GAAK,EAC1DU,EAAW,IAAIX,EAAS,KAAMY,CAAI,EAClCf,EAAM,mBAAmB,IAAII,EAAaW,EAAO,CAAC,CACtD,CAEA,IAAMC,EAAaF,EAAW,IAAIX,EAAS,IAAK,GAAK,EAC/C,CAACc,EAAGC,EAAGC,CAAC,EAAIC,GAASC,EAAWf,CAAG,CAAC,EACpCgB,EAAUC,EAAS,CAACN,EAAMD,EAAa,IAAO,IAAME,EAAGC,CAAC,CAAC,EACzD,CAACK,EAAIC,EAAIC,CAAE,EAAIJ,EACfK,EAAOC,GAASN,CAAO,EACvBZ,EAASV,EAAM,mBACfW,EAAaC,EACfC,EAAU,CAACW,EAAIC,EAAIC,EAAI,CAAC,EAAGhB,CAAM,CACrC,EACAR,EAAG,MAAM,MAAQS,EACjBT,EAAG,MAAM,gBAAkByB,CAC/B,MACIzB,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,EAEzB,CChFO,SAAS2B,GACZC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,EACEH,GAAQ,QAAU,OACXA,EAAO,MAEPD,EAAM,OAIf,CAACK,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,EAAST,EAAM,mBACfU,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,CChDO,SAASW,GACZC,EACAC,EACAC,EACAC,EACI,CAEJ,GAAIA,EAAS,8BACTD,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQ,OACd,CACH,GAAM,CAACE,CAAG,EACND,EAAS,OAAS,GACZH,EAAM,cACNG,EAAS,OAAS,GAChBH,EAAM,cACN,CAAC,GAAI,EAAG,EAAG,EAAG,EAAE,EAC5BE,EAAG,MAAM,gBAAkB,GAC3BA,EAAG,MAAM,MAAQE,CACrB,CACJ,CChBO,SAASC,GACZC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,EACFD,EAAS,QAAU,QACnBA,EAAS,QAAU,MACnBA,EAAS,OAAO,SAAS,GAAG,KAAK,EAAE,OAAS,EAC1CE,GACDF,EAAS,cAAgB,IAAMH,EAAM,QAAQ,SAAS,OACrDM,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,CCvBO,SAASG,GACZC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACI,CACJ,IAAMC,EAAaH,EAAeJ,EAAM,mBAAqB,OAE7DM,EAAa,UAAU,OACnB,yBACAN,EAAM,QAAQ,oBAAsB,MACxC,EAEA,OAAW,CAAE,QAASQ,EAAI,SAAAC,EAAU,SAAAC,CAAS,IAAKT,EAAO,CACrD,IAAMU,EACFF,EAAS,gBAAgBT,EAAM,QAAQ,SAAS,MAAM,EACpDY,EAAOC,EAAab,EAAOS,CAAQ,EACnCK,EAASH,EACTT,EAAQS,EAAY,SAAS,CAAC,EAC9B,OACAI,EAAaH,IAAS,WAAaA,IAAS,QAIlDH,EAAS,8BACLT,EAAM,QAAQ,oBAAsB,WAClCgB,GACEA,IAAM,GAAKA,IAAM,OACX,GACAA,EAAI,EACJ,KAAK,IACDhB,EAAM,QAAQ,SAAS,OACvBc,GAAQ,iBAAmB,CAC/B,GACLL,EAAS,YAAsC,OAC3CO,GAAMA,IAAM,MACjB,GAAG,MACP,EAGAD,EACAE,GACIjB,EACAc,EACAN,EACAC,EACAN,CACJ,EACOS,IAAS,UAChBM,GAAmBlB,EAAOc,EAAQN,EAAIC,CAAe,EAC9CG,IAAS,SAChBO,GAAkBnB,EAAOc,EAAeN,EAAIC,CAAe,EACpDG,IAAS,QAAUA,IAAS,WACnCQ,GAAoBpB,EAAOc,EAAeN,EAAIC,CAAQ,GAEtDD,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,EACzDf,EAAM,iCACNQ,EAAG,UAAU,OACT,gBACAG,IAAgBX,EAAM,gCAC1B,EAEAQ,EAAG,UAAU,OAAO,gBAAiB,EAAK,EAG9CA,EAAG,UAAU,OACT,qBACAM,GAAQ,iBAAmB,OAASC,CACxC,EAEAP,EAAG,UAAU,OACT,2BACAM,GAAQ,iBAAmB,aAAeC,CAC9C,EAGIL,GACAW,GAAsBrB,EAAOM,EAAcE,EAAIC,CAAe,EAIlE,IAAMa,EAAKd,EAAG,cA6Bd,GA5BIc,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,GAQtBA,EAAG,UAAU,OAAO,6BAA8B,EAAK,EACnDJ,EACA,GAAI,CAACG,EACDC,EAAG,UAAU,OAAO,oBAAqB,EAAK,MAC3C,CACH,IAAMe,EAAKvB,EAAM,MAAMS,EAAS,GAAK,IAAMA,EAAS,IAAM,EAAE,EACtDe,EAAYjB,EAAW,OACzB,CAACkB,EAAKT,EAAGU,IAAMD,GAAOT,IAAMO,EAAGG,CAAC,EAChC,EACJ,EAEMC,EAAUJ,EAAG,SAAWhB,EAAW,QAAUiB,EAC7CI,EAAQL,EAAG,SAAWhB,EAAW,QAAUiB,EAE7Cd,GAEID,EAAS,OAAS,cAClBA,EAAS,eAAiB,QACxBc,EAAGd,EAAS,YAAY,EAE1BD,EAAG,UAAU,OAAO,oBAAqB,EAAK,GASlDA,EAAG,UAAU,OAAO,oBAAqBmB,CAAO,EAChDnB,EAAG,UAAU,OAAO,6BAA8BoB,CAAK,EAE/D,CASJ,GAAI,CAAClB,GAAYD,EAAS,OAAS,OAC/B,GAAIJ,GAAcL,EAAM,aAAaS,EAAS,CAAC,EAAG,CAG9C,IAAMoB,EADFpB,EAAS,gBAAgBT,EAAM,QAAQ,SAAS,MAAM,GAC3B,SAAS,EAEpC6B,GACAjB,IAAS,UACTV,EAAQ2B,CAAY,GAAG,SAAW,QAElCrB,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,IAEIJ,IAAeG,EAAG,aAAa,iBAAiB,GAChDA,EAAG,gBAAgB,kBAAmBH,CAAU,EAGpDG,EAAG,UAAU,OAAO,mBAAoB,EAAK,EAErD,MACIA,EAAG,gBAAgB,kBAAmB,EAAK,EAC3CA,EAAG,UAAU,OAAO,mBAAoB,EAAK,CAGzD,CACJ,CC9LO,SAASsB,GACZC,EACAC,EACAC,EACAC,EACAC,EACU,CACV,OAAO,UAA2C,CAC9C,IAAMC,EACDH,EAAqBI,CAAqB,GAAK,CAAC,EAC/CC,EAAiBJ,EAAO,aAAa,UAAU,EAC/CK,EAAeP,EAAM,aAAe,kBACpCQ,EAAaC,EAAeT,EAAOE,CAAM,EACzCQ,EAAoBD,EAAeT,EAAOE,EAAQ,EAAI,EAG5DH,EAAS,UAAU,OAAO,oBAAqBW,CAAiB,EAChE,IAAMC,EAA6B,CAAC,EAC9BC,EAAwC,CAAC,EACzCC,EAAQZ,EAAa,SAAS,CAAC,GAAG,SAAS,CAAC,EAClD,GAAIY,EACA,QAAWC,KAAMD,EAAM,SACnB,QAAWE,KAAQD,EAAG,SAAU,CAC5B,IAAME,EAAWf,EAAa,QAC1Bc,CACJ,EAEA,GACIC,IACCA,EAAS,OAAS,QACfA,EAAS,OAAS,cACxB,CACE,IAAMC,EAAWF,EAAK,UAAY,KAClCJ,EAAU,KAAK,CACX,QAASI,EACT,SAAAC,EACA,SAAAC,CACJ,CAAC,CACL,CACJ,CAKR,IAAMC,EAAQjB,EAAa,SAAS,CAAC,GAAG,SAAS,CAAC,EAClD,GAAIiB,EACA,QAAWJ,KAAMI,EAAM,SAAU,CAC7B,IAAMC,EAA8B,CAChC,IAAKL,EACL,MAAO,CAAC,CACZ,EAEA,QAAWC,KAAQD,EAAG,SAAU,CAC5B,IAAME,EAAWf,EAAa,QAC1Bc,CACJ,EAEAI,EAAQ,MAAM,KAAK,CACf,QAASJ,EACT,SAAAC,CACJ,CAAC,CACL,CAEAJ,EAAgB,KAAKO,CAAO,CAChC,CAGJC,GACIpB,EACAW,EACAP,EACAE,EACAC,EACAC,EACAP,CACJ,EAEAoB,GAAuBrB,EAAOY,EAAiBX,CAAY,EAC3DqB,GAAwBtB,EAAOY,EAAiBX,EAAcC,CAAM,EACpEqB,GAAgBvB,EAAOW,EAAWV,EAAcE,CAAmB,CACvE,CACJ,CCzDA,eAAsBqB,GAElBC,EACa,CACb,IAAMC,EAAS,KAAK,cACdC,EAAQ,MAAMD,EAAO,SAAS,EAEpC,GAAK,KAAK,aA4LN,MAAME,GAAY,KACd,KACA,KAAK,cACLD,EACAF,EACAC,EAAO,aAAa,OAAO,EAC3B,KAAK,KACT,MAnMoB,CAgBpB,GAfA,KAAK,UAAY,GACb,KAAK,WACL,KAAK,WAAW,YAAY,KAAK,aAAa,EAE9C,KAAK,YAAY,KAAK,aAAa,EAGvC,KAAK,MAAQ,MAAME,GAAY,KAC3B,KACA,KAAK,cACLD,EACAF,EACAC,EAAO,aAAa,OAAO,CAC/B,EAEI,CAAC,KAAK,MACN,OAGJ,IAAMG,EAAQ,KAAK,MACbC,EAAe,KAAK,cACpBC,EAA6B,MAC/BC,EACAC,IACC,CACD,GAAIJ,EAAM,aAAe,kBACrB,OAKJ,GAAII,EACAJ,EAAM,mBAAqB,WACxB,CACH,IAAMK,EAAMF,EAAK,IAAMH,EAAM,cAAc,WAAa,GACpDK,GAAO,GAAKA,EAAML,EAAM,KAAK,SAC7BA,EAAM,mBAAqBA,EAAM,KAAKK,CAAG,EAEjD,CAEA,GAAM,CAAE,IAAAC,EAAK,aAAAC,EAAc,OAAAC,CAAO,EAAI,MAAMC,EACxCT,EACAG,EAAK,GACL,CACJ,EAEIO,EACJ,GAAIN,EAAY,CACZ,IAAKJ,EAAM,sBAAsB,QAAU,GAAK,EAC5CU,EAAS,IAAIC,GACT,GACAL,EACA,CAAC,EACDN,EAAM,sBAAwB,CAAC,EAC/B,CAAC,CACL,MAEA,OAAM,IAAI,MAAM,mBAAmB,EAGvCA,EAAM,qBAAuB,MACjC,MACIU,EAAS,IAAIC,GACT,GACAL,EACAC,EACAP,EAAM,sBAAwB,CAAC,EAC/B,CAACQ,CAAM,CACX,EACAR,EAAM,qBAAuB,CAACQ,CAAM,EAGxC,MAAMP,EAAa,KAAK,CAAE,eAAgB,EAAK,CAAC,EAChDJ,EAAO,cACH,IAAI,YACA,4BACA,CACI,QAAS,GACT,SAAU,GACV,OAAAa,CACJ,CACJ,CACJ,CACJ,EAEAE,GAAsB,KAAM,KAAK,cAAe,CAC5C,UAAW,oBACX,SAAAV,CACJ,CAAC,EAGD,IAAMW,EAA6C,IAAI,QAEvD,KAAK,cAAc,iBACfC,GACI,KACA,KAAK,MACL,KAAK,cACLjB,EACAgB,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,QACAE,GAAoB,KAAK,aAAa,CAC1C,EAGA,KAAK,cAAc,iBACf,QACAC,GAA4B,KAAK,MAAO,KAAK,cAAenB,CAAM,CACtE,EAGA,KAAK,cAAc,iBACf,YACAoB,GAAwB,KAAK,MAAO,KAAK,cAAepB,CAAM,CAClE,EAEA,KAAK,cAAc,iBACf,WACAqB,GAAuB,KAAK,MAAO,KAAK,cAAerB,CAAM,CACjE,EAGA,KAAK,cAAc,iBACf,QACAsB,GAAwB,KAAK,MAAO,KAAK,cAAetB,CAAM,CAClE,EAEA,KAAK,cAAc,iBACf,UACAuB,GACI,KAAK,MACL,KAAK,cACLvB,EACAgB,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,WACAQ,GACI,KAAK,MACL,KAAK,cACLxB,EACAgB,CACJ,CACJ,EAEA,KAAK,cAAc,iBACf,UACAS,GACI,KAAK,MACL,KAAK,cACLzB,EACAgB,CACJ,CACJ,EAGAhB,EAAO,iBACH,qCACC0B,GAAiB,CACd,IAAMC,EAAcD,EACpB,GAAI,KAAK,YAAa,CAOlB,GANAE,GACI,KAAK,MACL,KAAK,cACL5B,EACA2B,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,CAUJ,CCpNO,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,EACXS,EAAW,QAAQT,EAAM,SAAU,IAAM,GACzCU,EAAiB,KAAK,KAAMV,EAAM,SAAS,EAE3C,QAAQ,MAAM,qBAAuBA,EAAM,SAAS,EAGxDU,EAAiB,KAAK,KAAM,WAAW,EAGvC,gBAAiBV,EACjBW,EAAmB,KAAK,KAAMX,EAAM,WAAW,EAE/CW,EAAmB,KAAK,KAAM,EAAK,EAGvC,IAAMC,EAAW,KAAK,cACtBC,EAA8B,KAAK,KAAMX,EAAW,EAAI,EACvDU,EAAiBE,CAAqB,EAAIT,CAC/C,CClGO,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,CAEA,MAAO,CAAC,CACZ,CClBA,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,IAG1B,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,CC1Be,SAARE,GAEHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,IAAMC,EAAwB,CAAC,EAE/B,GAAIN,IAAS,WAAaA,IAAS,QAAS,CACxC,IAAMO,EAAS,KAAK,MAAO,cAAc,CAAC,EACpCC,EAAS,KAAK,MAAO,cAAc,CAAC,EACpCC,EAAS,KAAK,MAAO,cAAc,CAAC,EACpCC,EAAS,KAAK,MAAO,cAAc,CAAC,EAE1CJ,EAAO,KAAK,CACR,KAAM,OACN,IAAK,iBACL,QAAS,QACT,SAAU,CACN,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,MAAO,MAAO,KAAM,EAC7B,CAAE,MAAO,YAAa,MAAO,UAAW,CAC5C,CACJ,CAAC,EAED,IAAMK,EAAWR,GAAe,gBAA6B,QACzDQ,IAAY,YACZL,EAAO,KAAK,CACR,KAAM,aACN,QAAS,eACT,QAAS,eACT,YAAaC,EACb,YAAaC,EACb,YAAa,EACjB,CAAC,GAGDG,IAAY,OAASA,IAAY,cACjCL,EAAO,KAAK,CACR,KAAM,SACN,IAAK,cACL,QAASD,GAAc,SAAW,EAClC,QAAS,EACb,CAAC,EAGLC,EAAO,KAAK,CACR,KAAM,OACN,IAAK,iBACL,QAAS,WACT,SAAU,CACN,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,QAAS,MAAO,OAAQ,CACrC,CACJ,CAAC,EAED,IAAMM,EAAWT,GAAe,gBAA6B,WACzDS,IAAY,YACZN,EAAO,KAAK,CACR,KAAM,aACN,QAAS,eACT,QAAS,eACT,YAAaG,EACb,YAAaC,EACb,YAAaE,IAAY,YAAcA,IAAY,OACvD,CAAC,EAGDA,IAAY,YACZN,EAAO,KAAK,CACR,KAAM,SACN,IAAK,cACL,QAAS,GACT,QAASD,GAAc,SAAW,CACtC,CAAC,EAGLC,EAAO,KAAK,CAAE,KAAM,cAAe,CAAC,CACxC,MAAWN,IAAS,QAAUA,IAAS,YACnCM,EAAO,KAAK,CAAE,KAAM,gBAAiB,CAAC,EAEtCA,EAAO,KAAK,CACR,KAAM,OACN,IAAK,sBACL,QAAS,OACT,SAAU,CACN,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,aAAc,MAAO,YAAa,CAC/C,CACJ,CAAC,GAGIH,GAAe,qBAAkC,UAEtC,QACZG,EAAO,KAAK,CACR,KAAM,QACN,IAAK,QACL,QAAS,KAAK,MAAO,OAAO,CAAC,CACjC,CAAC,GAEEN,IAAS,WAChBM,EAAO,KAAK,CAAE,KAAM,cAAe,CAAC,EAEpCA,EAAO,KAAK,CACR,KAAM,OACN,IAAK,oBACL,QAAS,OACT,SAAU,CACN,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,SAAU,MAAO,QAAS,CACvC,CACJ,CAAC,GAEiBH,GAAe,mBAAgC,UAChD,QACbG,EAAO,KAAK,CACR,KAAM,QACN,IAAK,QACL,QAAS,KAAK,MAAO,OAAO,CAAC,CACjC,CAAC,GAIT,IAAMO,EAAWT,GAAe,UAAY,CAAC,EACvCU,GACDV,GAAe,mBAAqB,YAAc,SAEvD,OAAIS,EAAS,OAAS,GAAKC,GACvBR,EAAO,KAAK,CAAE,KAAM,gBAAiB,CAAC,EAGnC,CAAE,OAAAA,CAAO,CACpB,CC1LA,IAAAS,GAAA,+zfCsBA,OAAS,gBAAAC,OAAoB,kDAqBtB,IAAMC,GAAN,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,mBAAwC,CACpC,MAAO,CACH,KAAM,WACN,SAAU,QACV,YAAa,SACb,oBAAqB,CAAC,SAAS,EAC/B,mBAAoB,CAAC,SAAU,OAAQ,OAAO,EAG9C,SAAU,EACV,yBAA0B,EAC9B,CACJ,CAEA,sBAA2C,CACvC,IAAME,EAAS,CAAC,EAChB,OAAAA,EAAO,KAAK,CACR,KAAM,OACN,IAAK,YACL,QAAS,YACT,SAAU,CACN,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,YAAa,MAAO,WAAY,EACzC,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,gBAAiB,MAAO,eAAgB,EACjD,CAAE,MAAO,gBAAiB,MAAO,eAAgB,EACjD,CAAE,MAAO,kBAAmB,MAAO,aAAc,CACrD,CACJ,CAAC,EAEDA,EAAO,KAAK,CACR,KAAM,OACN,IAAK,cACL,QAAS,EACb,CAAC,EAEM,CACH,OAAAA,CACJ,CACJ,CAEA,qBACIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,OAAOC,GAAqB,KACxB,KACAN,EACAC,EACAC,EACAC,EACAC,EACAC,CACJ,CACJ,CAEA,MAAM,KAAKR,EAA2B,CAClC,OAAO,MAAMU,GAAK,KAAK,KAAMV,CAAI,CACrC,CAEA,MAAM,OAAOA,EAA2B,CACpC,GAAI,KAAK,QAAU,OACf,MAAM,KAAK,KAAKA,CAAI,UACb,KAAK,MAAM,QAAQ,UAAU,OAAS,EAAG,CAChD,IAAMW,EAAa,MAAMX,EAAK,WAAW,EACzC,KAAK,MAAM,UAAYW,EAAW,cAClC,MAAM,KAAK,cAAc,KAAK,CAClC,MACI,KAAK,MAAM,UAAY,MAAMX,EAAK,SAAS,EAC3C,MAAM,KAAK,cAAc,KAAK,CAEtC,CAEA,MAAM,OAAOA,EAAYY,EAAwC,CAC7D,IAAMC,EAAO,MAAMb,EAAK,WAAWY,CAAe,EAC5CE,EAAO,MAAMd,EAAK,aAAaY,CAAe,EAE9CG,EACFH,GAAU,UAAY,QACtBA,GAAU,UAAY,MACtBA,GAAU,YAAc,QACxBA,GAAU,YAAc,KAClBA,EAAS,QAAUA,EAAS,UAC5B,MAAMZ,EAAK,SAAS,EAE1BgB,EAAM,GACV,QAASC,EAAO,EAAGA,EAAOF,EAAOE,IAAQ,CACrC,QAAWC,KAAYJ,EAAM,CACzB,IAAMK,EAAON,EAAmCK,CAAQ,EAClDf,EAAO,KAAK,MAAO,QAAQe,CAAQ,EACnCE,EAAgB,KAAK,cACvBC,CACJ,EACMC,EAAa5B,GAAawB,CAAQ,EAClCK,EAAYC,GACdrB,EACAiB,IAAeE,CAAU,GAAK,CAAC,CACnC,EAEIC,EACAP,GAAOO,EAAU,OAAOJ,EAAIF,CAAI,CAAC,EAAI,IAErCD,GAAOG,EAAIF,CAAI,EAAI,GAE3B,CAEAD,GAAO;AAAA,CACX,CAEA,OAAOA,EAAI,KAAK,CACpB,CAEA,MAAM,OAAOS,EAA4B,CACjC,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,MAAY,CACR,OAAOC,GAAK,KAAK,IAAI,CACzB,CAEA,QAAQC,EAA6BC,EAAsC,CACvE,OAAOC,GAAQ,KAAK,KAAMF,EAAOC,GAAkB,CAAC,CAAC,CACzD,CAEA,SAAU,CAAC,CAEX,QAAe,CACX,KAAK,qBAAqB,EAC1B,KAAK,SAAW,OACX,KAAK,cAAsB,aAC5B,KAAK,cAAc,cAAc,EAGrC,KAAK,cAAc,MAAM,CAC7B,CACJ,EC5QA,IAAAE,GAAA,0iHCiBA,IAAMC,GAAa,IAAI,cACvBA,GAAW,YAAYC,EAAa,EAQ7B,IAAMC,GAAN,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,EAEAA,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,EzC/CA,eAAeI,IAAmC,CAC9C,eAAe,OACX,sCACAC,EACJ,EAEA,eAAe,OACX,8BACAC,EACJ,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", "isEditableMode", "viewer", "allowed", "has_pivots", "plugin", "editable", "META_COLUMN_RE", "isMetaColumn", "name", "createDateFormatter", "createDatetimeFormatter", "createNumberFormatter", "BooleanFormatter", "val", "FormatterCache", "_type", "plugin", "type", "_plugin", "formatter_key", "FORMAT_CACHE", "FormatterCache", "MAX_BAR_WIDTH_PCT", "format_raw", "type", "value", "format_cell", "title", "val", "plugins", "use_table_schema", "plugin", "a", "anchor", "pct", "div", "formatter", "label", "bold", "italic", "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", "isMetaColumn", "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", "parse_cache", "parse_ctx", "parse_hex", "input", "s", "r", "g", "b", "parse_rgb_fn", "m", "parse_via_canvas", "canvas", "normalized", "parseColor", "key", "cached", "rgb", "toHex", "c", "rgbToHex", "rgbToHsl", "rn", "gn", "bn", "max", "min", "l", "d", "h", "hslToRgb", "hn", "v", "q", "p", "f", "t", "mixRgb", "a", "blend", "rgbaToRgb", "source", "i", "infer_foreground_from_background", "make_gradient", "r1", "g1", "b1", "r2", "g2", "b2", "make_color_record", "color", "_neg_grad", "arraysChanged", "a", "b", "i", "nestedArraysChanged", "j", "get_rule", "regular", "tag", "def", "color", "ElemFactoryImpl", "name", "elem", "createModel", "table", "view", "theme", "extend", "config", "old", "group_by_changed", "type_changed", "split_by_changed", "columns_changed", "filter_changed", "sort_changed", "group_rollup_mode_changed", "theme_changed", "table_schema", "num_rows", "schema", "expression_schema", "_edit_port", "_plugin_background", "parseColor", "_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", "isSelectRowTreeAvailable", "model", "toggle_edit_mode", "mode", "idx", "toggle_scroll_lock", "force", "restore_column_size_overrides", "old_sizes", "cache", "regular_table", "overrides", "group_by", "tree_header_offset", "key", "index", "save_column_size_overrides", "x", "numKey", "style_selected_column", "model", "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", "model", "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", "model", "regularTable", "event", "meta", "is_collapse", "x", "createMousedownListener", "model", "regularTable", "viewer", "event", "mouseEvent", "target", "expandCollapseHandler", "column_name", "sortHandler", "createDblclickListener", "createClickListener", "write_cell", "table", "model", "active_cell", "meta", "type", "text", "id", "parsed", "msg", "clickListener", "_viewer", "event", "is_editable2", "is_bool", "get_psp_type", "is_null", "createFocusoutListener", "model", "table", "viewer", "selected_position_map", "event", "focusEvent", "isEditableMode", "target", "selectedPosition", "write_cell", "createFocusinListener", "_model", "_viewer", "meta", "new_state", "applyFocusStyle", "_model", "cells", "regularTable", "selectedPositionMap", "selected_position", "host", "td", "metadata", "focusSelectedCell", "tbody", "tr", "cell", "lock", "body", "lockPromise", "model", "table", "selected_position_map", "active_cell", "dx", "dy", "resolve", "x", "result", "getPos", "elem", "_range", "range", "moveSelection", "meta", "num_columns", "num_rows", "selected_position", "xmin", "xmax", "ymin", "ymax", "y", "focusSelectedCell", "isLastCell", "target", "keydownListener", "_viewer", "event", "createKeydownListener", "model", "table", "viewer", "selected_position_map", "event", "keyEvent", "isEditableMode", "keydownListener", "createEditClickListener", "mouseEvent", "clickListener", "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_paths", "k", "isMetaColumn", "result", "column_filters", "split_by_values", "value", "filter", "createDispatchClickListener", "model", "table", "viewer", "event", "mouseEvent", "meta", "x", "y", "row", "column_names", "config", "getCellConfig", "MOUSE_SELECTED_AREA_CLASS", "addAreaMouseSelection", "datagrid", "table", "className", "selected", "onSelect", "getMousedownListener", "getMouseoverListener", "getMouseupListener", "applyMouseAreaSelections", "isSingleClickMode", "mode", "event", "mouseEvent", "isSelectionMode", "meta", "start", "potentialSelection", "existing", "area", "selection", "modeIncludesColumns", "modeIncludesRows", "set_psp_selection", "viewer", "x0", "x1", "y0", "y1", "viewport", "SELECTION_PREDICATES", "m", "a", "applyMouseAreaSelection", "tds", "td", "cells", "cell", "predicate", "rendered", "applyColumnHeaderStyles", "model", "headerRows", "regularTable", "viewer", "selectedColumn", "len", "settings_open", "row", "i", "offset", "id", "titlesRow", "editBtnsRow", "cells", "element", "title", "editBtn", "open", "colHeadersIndex", "colHeaders", "styleColumnHeaderRow", "menuHeadersIndex", "menuHeaders", "applyGroupHeaderStyles", "model", "headerRows", "regularTable", "header_depth", "m", "marked", "y", "cells", "tops", "x", "td", "metadata", "needs_border", "xx", "cell", "tx", "ty", "style_cell_flash", "model", "metadata", "td", "pos_s", "pos_e", "neg_s", "neg_e", "is_settings_open", "id", "metadata_path", "row_idx", "col_idx", "cell_style_numeric", "model", "plugin", "td", "metadata", "is_settings_open", "is_positive", "is_negative", "pos_bg_color", "neg_bg_color", "bg_tuple", "hex", "r", "g", "b", "a", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "style_cell_flash", "fg_tuple", "gradhex", "cell_style_string", "model", "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", "rgbToHsl", "parseColor", "rotated", "hslToRgb", "r2", "g2", "b2", "hex2", "rgbToHex", "cell_style_datetime", "model", "plugin", "td", "metadata", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "cell_style_boolean", "model", "_plugin", "td", "metadata", "hex", "cell_style_row_header", "model", "regularTable", "td", "metadata", "is_not_empty", "is_leaf", "next", "is_collapse", "applyBodyCellStyles", "model", "cells", "plugins", "isSettingsOpen", "isSelectable", "isEditable", "regularTable", "selectedId", "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", "isExact", "isSub", "col_name_str", "createConsolidatedStyleListener", "datagrid", "model", "regularTable", "viewer", "selectedPositionMap", "plugins", "PRIVATE_PLUGIN_SYMBOL", "isSettingsOpen", "isSelectable", "isEditable", "isEditableMode", "isEditableAllowed", "bodyCells", "groupHeaderRows", "tbody", "tr", "cell", "metadata", "isHeader", "thead", "rowData", "applyBodyCellStyles", "applyGroupHeaderStyles", "applyColumnHeaderStyles", "applyFocusStyle", "activate", "view", "viewer", "table", "createModel", "model", "regularTable", "onSelect", "area", "isDeselect", "idx", "row", "column_names", "config", "getCellConfig", "detail", "PerspectiveSelectDetail", "addAreaMouseSelection", "selected_position_map", "createConsolidatedStyleListener", "createClickListener", "createDispatchClickListener", "createMousedownListener", "createDblclickListener", "createEditClickListener", "createFocusinListener", "createFocusoutListener", "createKeydownListener", "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_config_schema", "type", "_group", "_column_name", "current_value", "viewer_config", "column_stats", "fields", "pos_fg", "neg_fg", "pos_bg", "neg_bg", "fg_mode", "bg_mode", "group_by", "is_rollup", "perspective_viewer_datagrid_default", "sourceColumn", "HTMLPerspectiveViewerDatagridPluginElement", "_HTMLPerspectiveViewerDatagridPluginElement", "Elem", "perspective_viewer_datagrid_default", "parent", "view", "activate", "fields", "type", "group", "column_name", "current_value", "viewer_config", "column_stats", "column_config_schema", "draw", "dimensions", "viewport", "json", "cols", "nrows", "out", "ridx", "col_name", "col", "pluginConfig", "PRIVATE_PLUGIN_SYMBOL", "columnName", "formatter", "format_raw", "_view", "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
  }