@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.
- package/dist/cdn/perspective-viewer-datagrid.js +4 -4
- package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
- package/dist/esm/custom_elements/datagrid.d.ts +12 -17
- package/dist/esm/model/meta_columns.d.ts +1 -0
- package/dist/esm/perspective-viewer-datagrid.js +3 -3
- package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
- package/dist/esm/plugin/column_config_schema.d.ts +31 -0
- package/package.json +1 -1
- package/src/ts/color_utils.ts +50 -13
- package/src/ts/custom_elements/datagrid.ts +63 -48
- package/src/ts/data_listener/format_tree_header.ts +2 -2
- package/src/ts/data_listener/formatter_cache.ts +8 -95
- package/src/ts/data_listener/index.ts +9 -3
- package/src/ts/event_handlers/click/edit_click.ts +3 -0
- package/src/ts/event_handlers/dispatch_click.ts +4 -1
- package/src/ts/event_handlers/expand_collapse.ts +4 -1
- package/src/ts/event_handlers/header_click.ts +9 -3
- package/src/ts/event_handlers/keydown/edit_keydown.ts +11 -2
- package/src/ts/event_handlers/select_region.ts +15 -4
- package/src/ts/event_handlers/sort.ts +4 -1
- package/src/ts/get_cell_config.ts +10 -3
- package/src/ts/model/column_overrides.ts +3 -5
- package/src/ts/model/create.ts +22 -5
- package/src/ts/{plugin/column_style_controls.ts → model/meta_columns.ts} +33 -62
- package/src/ts/model/toolbar.ts +11 -2
- package/src/ts/plugin/activate.ts +3 -1
- package/src/ts/plugin/column_config_schema.ts +187 -0
- package/src/ts/plugin/draw.ts +1 -0
- package/src/ts/plugin/restore.ts +6 -2
- package/src/ts/plugin/save.ts +1 -5
- package/src/ts/style_handlers/body.ts +6 -2
- package/src/ts/style_handlers/column_header.ts +6 -2
- package/src/ts/style_handlers/consolidated.ts +1 -0
- package/src/ts/style_handlers/editable.ts +6 -2
- package/src/ts/style_handlers/focus.ts +2 -0
- package/src/ts/style_handlers/group_header.ts +10 -4
- package/dist/esm/plugin/column_style_controls.d.ts +0 -28
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/utils.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/constants.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/dist/css/container.css", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/dist/css/sub-cell-offsets.css", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/scroll_panel.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/view_model.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/events.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/thead.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/tbody.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/table.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/regular-table.ts", "../../../../rust/perspective-viewer/src/ts/extensions.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/
|
|
4
|
-
"sourcesContent": ["// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { FPSRecord } from \"./types\";\n\n/******************************************************************************\n *\n * Profling\n *\n */\n\nlet AVG = 0,\n TOTAL = 0,\n START = performance.now();\n\nexport function get_draw_fps(): FPSRecord {\n const now = performance.now();\n const elapsed = now - START;\n const avg = AVG;\n const real_fps = (TOTAL * 1000) / elapsed;\n const virtual_fps = 1000 / avg;\n const num_frames = TOTAL;\n AVG = 0;\n TOTAL = 0;\n START = now;\n return { avg, real_fps, virtual_fps, num_frames, elapsed };\n}\n\nexport function log_perf(x: number) {\n AVG = (AVG * TOTAL + x) / (TOTAL + 1);\n TOTAL += 1;\n}\n\n/******************************************************************************\n *\n * Utils\n *\n */\n\nconst TAGS: Map<any, PromiseWithResolvers<undefined>> = new Map();\n\nexport async function flush_tag(\n tag: any,\n): Promise<PromiseWithResolvers<undefined> | undefined> {\n await new Promise(requestAnimationFrame);\n return await TAGS.get(tag)?.promise;\n}\n\nexport async function throttle_tag<T>(\n tag: any,\n f: () => Promise<T>,\n): Promise<T | undefined> {\n if (TAGS.has(tag)) {\n await TAGS.get(tag)?.promise;\n if (TAGS.has(tag)) {\n await TAGS.get(tag)?.promise;\n return;\n }\n }\n\n TAGS.set(tag, Promise.withResolvers());\n try {\n return await f();\n } finally {\n const l = TAGS.get(tag);\n TAGS.delete(tag);\n l?.resolve(undefined);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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// Output runtime debug info like FPS.\nexport const DEBUG = true;\n\n// The largest size virtual <div> in (px) that Chrome can support without\n// glitching.\nconst isFirefox = navigator.userAgent.toLowerCase().indexOf(\"firefox\") > -1;\nexport const BROWSER_MAX_HEIGHT = isFirefox ? 5000000 : 10000000;\n", ":host{position:absolute;top:0px;left:0px;right:0px;bottom:0px;overflow:scroll;overflow-anchor:none;overscroll-behavior:none;-webkit-overflow-scrolling:touch;}div.rt-virtual-panel{position:absolute;top:0;left:0;right:0;pointer-events:none;}div.rt-scroll-table-clip{position:sticky;contain:strict;overflow-anchor:none;width:100%;height:100%;}slot{position:absolute;overflow:hidden;overflow-anchor:none;}", ":host ::slotted(table){--regular-table--transform-x:0px;--regular-table--transform-y:0px;--regular-table--clip-x:0px;--regular-table--clip-y:0px;}", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { log_perf, throttle_tag, flush_tag } from \"./utils\";\nimport { DEBUG, BROWSER_MAX_HEIGHT } from \"./constants\";\nimport type { RegularTableViewModel } from \"./table\";\nimport { RegularTableElement } from \"./regular-table\";\nimport {\n CellTuple,\n ColumnSizes,\n StyleCallback,\n ContainerSize,\n DrawOptions,\n ViewCache,\n Viewport,\n ViewportValidation,\n VirtualMode,\n} from \"./types\";\n\n// @ts-ignore - CSS imports handled by build system\nimport container_css from \"../../dist/css/container.css\";\n\n// @ts-ignore - CSS imports handled by build system\nimport sub_cell_offsets from \"../../dist/css/sub-cell-offsets.css\";\n\n// CSS custom property names for sub-cell offsets\nconst CLIP_X = \"--regular-table--clip-x\";\nconst CLIP_Y = \"--regular-table--clip-y\";\nconst TRANSFORM_X = \"--regular-table--transform-x\";\nconst TRANSFORM_Y = \"--regular-table--transform-y\";\n\nconst HTML_TEMPLATE = `<div class=\"rt-virtual-panel\"></div><div class=\"rt-scroll-table-clip\"><slot></slot></div>`;\n\n/**\n * Handles the virtual scroll pane, as well as the double buffering\n * of the underlying <table>. This DOM structure looks a little like\n * this:\n *\n * +------------------------+ <- regular-table\n * | +----------------------|------<- div.rt-virtual-panel\n * | | +------------------+ | <- div.rt-scroll-table-clip\n * | | | +----------------|-|--+ <- table |\n * | | | | 1 A Alabama | | | |\n * | | | | 2 B Arizona | | | |\n * | | | | 3 C Arkansas | | | |\n * | | | | 4 D Californi| | | |\n * | | | | 5 E Colorado | | | |\n * | | +------------------+ | | |\n * +------------------------+ | |\n * | | 8 H District of C | |\n * | +---------------------+ |\n * | |\n * | |\n * | |\n * | |\n * | |\n * +--------------------------------------------------+\n *\n * `overflow: auto` is applied to `.rt-scroll-container`, and `.rt-virtual-pane`\n * is sized to match the estimated \"virtual\" size of the `table`; estimated,\n * because it's true size can't be known until all columns dimensions are known,\n * which may be deferred in the case of auto-sized tables.\n *\n * Double buffering can be enabled on \"column scroll\", \"row scroll\" and/or\n * \"column schema change\". When enabled and a redraw is requested for the case,\n * the existing table is cloned with `cloneNode()` and swapped with the real\n * `table`, which is then updated offscreen and swapped back in. While this is\n * much slower to render, it prevents draw-in.\n *\n * @class RegularVirtualTableViewModel\n */\nexport class RegularVirtualTableViewModel extends HTMLElement {\n private _sub_cell_rule!: CSSStyleRule;\n protected _virtual_panel!: HTMLElement;\n protected _virtual_mode!: VirtualMode;\n protected _container_size!: ContainerSize;\n protected _start_row?: number;\n protected _end_row?: number;\n protected _start_col?: number;\n protected _end_col?: number;\n protected _invalid_schema?: boolean;\n protected _selected_id?: number;\n protected _table_clip!: HTMLElement;\n protected _column_sizes!: ColumnSizes;\n protected _view_cache!: ViewCache;\n protected _invalidated?: boolean;\n protected _is_styling?: boolean;\n protected table_model!: RegularTableViewModel;\n protected _style_callbacks!: Array<StyleCallback>;\n private _probe_element?: [HTMLElement, HTMLElement];\n\n /**\n * Draws this virtual panel, given an object of render options that allow\n * the implementor to fine tune the individual render frames based on the\n * interaction and previous render state.\n *\n * @param {DrawOptions} [options]\n * @param {boolean} [options.invalid_viewport=true]\n * @param {boolean} [options.preserve_width=false]\n * @param {boolean} [options.throttle=true]\n */\n async draw(options: DrawOptions = {}): Promise<void> {\n if (typeof options.throttle !== \"undefined\" && !options.throttle) {\n return await internal_draw.call(this, options);\n } else {\n return await throttle_tag(this, () =>\n internal_draw.call(this, options),\n );\n }\n }\n\n /**\n * Await any pending rendering operations.\n */\n async flush(): Promise<void> {\n await flush_tag(this);\n }\n\n /**\n * Probe the shadow DOM to measure the default row height from CSS.\n */\n protected _probe_row_height() {\n if (!this._probe_element) {\n this._probe_element = [\n document.createElement(\"table\"),\n document.createElement(\"td\"),\n ];\n this._probe_element[0].style.visibility = \"hidden\";\n this._probe_element[0].style.position = \"absolute\";\n const tbody = document.createElement(\"tbody\");\n const tr = document.createElement(\"tr\");\n this._probe_element[1].textContent = \"X\";\n tr.appendChild(this._probe_element[1]);\n tbody.appendChild(tr);\n this._probe_element[0].appendChild(tbody);\n }\n\n this.appendChild(this._probe_element[0]);\n this._column_sizes.row_height = this._probe_element[1].offsetHeight;\n this._probe_element[0].remove();\n }\n\n /**\n * Create the DOM for this `shadowRoot`.\n */\n protected _create_shadow_dom() {\n this.attachShadow({ mode: \"open\" });\n if (!this.shadowRoot) {\n return;\n }\n\n const containerStyleSheet = new CSSStyleSheet();\n containerStyleSheet.replaceSync(container_css);\n const sub_cell_style = new CSSStyleSheet();\n sub_cell_style.replaceSync(sub_cell_offsets);\n this._sub_cell_rule = sub_cell_style.cssRules[0] as CSSStyleRule;\n this.shadowRoot.adoptedStyleSheets = [\n containerStyleSheet,\n sub_cell_style,\n ];\n\n this.shadowRoot.innerHTML = HTML_TEMPLATE;\n const [virtual_panel, table_clip] = this.shadowRoot!.children;\n this._table_clip = table_clip as HTMLElement;\n this._virtual_panel = virtual_panel as HTMLElement;\n this._setup_virtual_scroll();\n }\n\n protected _setup_virtual_scroll() {\n if (this._table_clip) {\n if (\n this._virtual_mode === \"both\" ||\n this._virtual_mode === \"vertical\"\n ) {\n this._table_clip.style.top = \"0px\";\n } else {\n this._table_clip.style.removeProperty(\"top\");\n }\n\n if (\n this._virtual_mode === \"both\" ||\n this._virtual_mode === \"horizontal\"\n ) {\n this._table_clip.style.left = \"0px\";\n } else {\n this._table_clip.style.removeProperty(\"left\");\n }\n\n if (this._virtual_mode !== \"both\") {\n this._table_clip.style.contain = \"none\";\n } else {\n this._table_clip.style.removeProperty(\"contain\");\n }\n }\n }\n\n /**\n * Calculates the `viewport` argument for perspective's `to_columns` method.\n *\n * @param {*} nrows\n * @returns\n */\n protected _calculate_viewport(\n nrows: number,\n num_columns: number,\n ): Viewport {\n const { start_row, end_row } = this._calculate_row_range(nrows);\n const { start_col, end_col } =\n this._calculate_column_range(num_columns);\n\n return { start_col, end_col, start_row, end_row };\n }\n\n /**\n * Determines whether the viewport is identical in row and column axes to\n * the previous viewport rendered, for throttling identical render requests,\n * e.g. when the logical (row-wise) viewport does not change, but the pixel\n * viewport has moved a few px.\n *\n * @param {*} {start_col, end_col, start_row, end_row}\n * @returns\n */\n protected _validate_viewport({\n start_col,\n end_col,\n start_row,\n end_row,\n }: Viewport): ViewportValidation {\n start_row = Math.floor(start_row);\n end_row = Math.ceil(end_row);\n start_col = Math.floor(start_col);\n end_col = Math.ceil(end_col);\n const invalid_column = this._start_col !== start_col;\n const invalid_row =\n this._start_row !== start_row ||\n this._end_row !== end_row ||\n this._end_col !== end_col;\n this._start_col = start_col;\n this._end_col = end_col;\n this._start_row = start_row;\n this._end_row = end_row;\n return { invalid_column, invalid_row };\n }\n\n /**\n * Updates the `virtual_panel` width based on view state.\n *\n * @param {*} invalid\n */\n protected _update_virtual_panel_width(\n invalid: boolean,\n num_columns: number,\n ): void {\n if (invalid) {\n if (\n this._virtual_mode === \"vertical\" ||\n this._virtual_mode === \"none\"\n ) {\n let totalWidth = 0;\n for (const w of this._column_sizes.indices) {\n totalWidth += w || 0;\n }\n\n this._virtual_panel.style.width =\n totalWidth.toPrecision(10) + \"px\";\n } else {\n const virtual_width =\n this._calc_scrollable_column_width(num_columns);\n\n if (virtual_width !== 0) {\n const panel_width =\n this._container_size.width + virtual_width + 2;\n this._virtual_panel.style.width =\n panel_width.toPrecision(10) + \"px\";\n } else {\n this._virtual_panel.style.width = \"1px\";\n }\n }\n }\n }\n\n /**\n * Updates the `virtual_panel` height based on the view state.\n *\n * @param {*} nrows\n */\n protected _update_virtual_panel_height(nrows: number): void {\n const { row_height = 0 } = this._column_sizes;\n const header_height =\n this._view_cache.column_headers_length * row_height;\n let virtual_panel_px_size;\n virtual_panel_px_size = Math.min(\n BROWSER_MAX_HEIGHT,\n nrows * row_height + header_height,\n );\n this._virtual_panel.style.height = `${virtual_panel_px_size.toPrecision(10)}px`;\n }\n\n /**\n * Update sub-cell offset CSS.\n *\n * @param viewport\n */\n protected _update_sub_cell_offset(\n viewport: Viewport,\n last_cell?: CellTuple,\n ): void {\n const y_offset =\n (this._column_sizes.row_height || 0) * (viewport.start_row % 1) ||\n 0;\n\n const x_offset_index =\n (this.table_model._row_headers_length || 0) +\n Math.floor(viewport.start_col);\n\n if (this._column_sizes.indices[x_offset_index] === undefined) {\n this._column_sizes.indices[x_offset_index] =\n last_cell?.[0]?.offsetWidth || 0;\n }\n\n const x_offset =\n this._column_sizes.indices[x_offset_index]! *\n (viewport.start_col % 1) || 0;\n\n this._sub_cell_rule.style.setProperty(CLIP_X, `${x_offset}px`);\n this._sub_cell_rule.style.setProperty(CLIP_Y, `${y_offset}px`);\n this._sub_cell_rule.style.setProperty(TRANSFORM_X, `${-x_offset}px`);\n this._sub_cell_rule.style.setProperty(TRANSFORM_Y, `${-y_offset}px`);\n }\n\n /**\n * Calculates `start_col` and `end_col` for the viewport - most of the\n * details of which are actually calculated in `_max_column`, the equivalent\n * of `total_scroll_height` from `_calculate_row_range`.\n *\n * @returns\n */\n protected _calculate_column_range(num_columns: number): {\n start_col: number;\n end_col: number;\n } {\n if (\n this._virtual_mode === \"none\" ||\n this._virtual_mode === \"vertical\"\n ) {\n return { start_col: 0, end_col: Infinity };\n } else {\n const start_col = this._calc_start_column();\n const vis_cols =\n this.table_model.num_columns() ||\n Math.min(\n num_columns,\n Math.ceil(this._container_size.width / 60),\n );\n let end_col = start_col + vis_cols + 1;\n return { start_col, end_col };\n }\n }\n\n /**\n * Calculate `start_row` and `end_row` for the viewport. We do this by\n * first calculating `total_scroll_height`, the px height of the\n * scrollable page, from the `_virtual_panel.offsetHeight`.\n *\n * 0px +------------+-------------+ - virtual_panel.offsetHeight\n * | | . | . 600px\n * | viewport | . | .\n * | | . | .\n * 200px +------------+ - height | . - total_scroll_height\n * | 200px | . . 400px\n * | | . .\n * | | . .\n * | | . .\n * | | . .\n * 600px +--------------------------+ - -\n *\n * `percent_scroll` can be calculated from this value and `scrollTop`,\n * which we can then apply to the new calculated height to preserve scroll\n * position when the height has changed since previous render.\n *\n * 0px +--------------------------+ -\n * | | .\n * | | .\n * | | . scrollable area\n * 300px +------------+ | .\n * | | | .\n * - - - | viewport | - - - - - - | - total_scroll_height\n * | | | 400px\n * 500px +------------+ |\n * | |\n * 600px +--------------------------+\n *\n * @param {*} nrows\n * @returns\n */\n private _calculate_row_range(nrows: number): {\n start_row: number;\n end_row: number;\n } {\n const { height, containerHeight } = this._container_size;\n const row_height = this._column_sizes.row_height || 0;\n const header_levels = this._view_cache.column_headers_length;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - containerHeight,\n );\n\n const percent_scroll =\n Math.max(Math.ceil(this.scrollTop), 0) / total_scroll_height;\n\n const clip_panel_row_height = height / row_height - header_levels;\n const relative_nrows = nrows || 0;\n const scrollable_rows = Math.max(\n 0,\n relative_nrows - clip_panel_row_height,\n );\n const start_row = scrollable_rows * percent_scroll;\n const end_row = Math.max(\n 0,\n Math.min(start_row + clip_panel_row_height, nrows),\n );\n return { start_row, end_row };\n }\n\n private _calc_start_column(): number {\n const scroll_index_offset = this._view_cache.row_headers_length;\n let start_col = 0;\n let offset_width = 0;\n let diff = 0;\n while (offset_width < this.scrollLeft) {\n const new_val =\n this._column_sizes.indices[start_col + scroll_index_offset];\n diff = this.scrollLeft - offset_width;\n start_col += 1;\n offset_width += new_val !== undefined ? new_val : 60;\n }\n\n start_col +=\n diff /\n (this._column_sizes.indices[start_col + scroll_index_offset - 1] ||\n 60);\n\n return Math.max(0, start_col - 1);\n }\n\n /**\n * Calculates the minimum possible starting column index for which the last\n * column is completely visible (e.g. not occluded by the container clip).\n * This is assumed to be the # of columns until the column widths are\n * calculated as they are scrolled into view by the user, which requires\n * special synchronization with _update_virtual_panel_width`\n * as the scrollable width will change as the user scrolls left to right.\n *\n * Once `_column_sizes.indices` has enough column widths populated from\n * user scrolling, it calulates the cumulative sum of column widths from\n * last visible column backwards, until the sum is larger than the viewport\n * px width, which is 1 below the max scroll column\n *\n * width = 290 = 210 = 100 = 0\n * 0px V V V 500px\n * +-----------------+-------+---------+--------+\n * | ..ol B) (Col C) | Col D | Col E | Col F |\n * | | 80px | 110px | 100px |\n * | | | | |\n *\n * @returns\n */\n private _max_scroll_column(num_columns: number): number {\n let width = 0;\n if (this._view_cache.row_headers_length > 0) {\n for (const w of this._column_sizes.indices.slice(\n 0,\n this._view_cache.row_headers_length,\n )) {\n width += w || 0;\n }\n }\n\n let scroll_index_offset = this._view_cache.row_headers_length;\n let max_scroll_column = num_columns;\n while (width < this._container_size.width && max_scroll_column >= 0) {\n max_scroll_column--;\n width +=\n this._column_sizes.indices[\n max_scroll_column + scroll_index_offset\n ] || 60;\n }\n\n return Math.min(num_columns - 1, max_scroll_column + 1);\n }\n\n private _calc_scrollable_column_width(num_columns: number): number {\n let scroll_index_offset = this._view_cache.row_headers_length;\n const max_scroll_column = this._max_scroll_column(num_columns);\n let cidx = scroll_index_offset,\n virtual_width = 0;\n\n while (cidx < max_scroll_column + scroll_index_offset) {\n virtual_width += this._column_sizes.indices[cidx] || 60;\n cidx++;\n }\n\n if (cidx < this._column_sizes.indices.length) {\n let viewport_width = 0;\n const rhLen = this._view_cache.row_headers_length;\n for (\n let i = 0;\n i < rhLen && i < this._column_sizes.indices.length;\n i++\n ) {\n viewport_width += this._column_sizes.indices[i] || 0;\n }\n virtual_width += Math.max(\n 0,\n (this._column_sizes.indices[cidx] || 0) -\n (this._container_size.width - (viewport_width || 0)) || 0,\n );\n }\n\n return virtual_width;\n }\n}\n\nasync function internal_draw(\n this: RegularVirtualTableViewModel,\n options: DrawOptions,\n): Promise<void> {\n const __debug_start_time__ = DEBUG && performance.now();\n if (!options.cache) {\n this.table_model._resetDimState();\n }\n\n const { invalid_viewport = true, preserve_width = false } = options;\n const {\n num_columns,\n num_rows,\n num_row_headers,\n num_column_headers,\n row_height,\n } = await this.table_model._getDimState(this._view_cache);\n\n this._column_sizes.row_height = row_height || this._column_sizes.row_height;\n if (!this._column_sizes.row_height) {\n this._probe_row_height();\n }\n\n if (num_row_headers !== undefined) {\n this._view_cache.row_headers_length = num_row_headers;\n }\n\n if (num_column_headers !== undefined) {\n this._view_cache.column_headers_length = num_column_headers;\n }\n\n // Cache virtual mode checks and default values\n const is_non_vertical =\n this._virtual_mode === \"none\" || this._virtual_mode === \"horizontal\";\n\n const is_non_horizontal =\n this._virtual_mode === \"none\" || this._virtual_mode === \"vertical\";\n\n const safe_num_rows = num_rows || 0;\n const safe_num_columns = num_columns || 0;\n this._container_size = {\n width: is_non_horizontal ? Infinity : this._table_clip.clientWidth,\n height: is_non_vertical ? Infinity : this._table_clip.clientHeight,\n containerHeight: is_non_vertical ? Infinity : this.clientHeight,\n };\n\n this._update_virtual_panel_height(safe_num_rows);\n if (!preserve_width) {\n this._update_virtual_panel_width(invalid_viewport, safe_num_columns);\n }\n\n const viewport = this._calculate_viewport(safe_num_rows, safe_num_columns);\n const { invalid_row, invalid_column } = this._validate_viewport(viewport);\n const invalid_schema_or_column = this._invalid_schema || invalid_column;\n if (invalid_schema_or_column || invalid_row || invalid_viewport) {\n let first_iteration = true;\n await this.table_model.draw(\n this._container_size,\n this._view_cache,\n this._selected_id,\n preserve_width,\n viewport,\n safe_num_columns,\n async (last_cells) => {\n // We want to perform this before the next event loop so there\n // is no scroll jitter, but only on the first iteration as\n // subsequent viewports are incorrect.\n if (first_iteration) {\n this._update_sub_cell_offset(viewport, last_cells);\n first_iteration = false;\n }\n\n for (const callback of this._style_callbacks) {\n await callback({ detail: this as RegularTableElement });\n }\n },\n );\n\n const old_height = this._column_sizes.row_height;\n this.table_model.header.reset_header_cache();\n if (old_height !== this._column_sizes.row_height) {\n this._update_virtual_panel_height(safe_num_rows);\n }\n\n if (!preserve_width) {\n this._update_virtual_panel_width(\n invalid_schema_or_column,\n safe_num_columns,\n );\n }\n\n this._invalid_schema = false;\n } else {\n this._update_sub_cell_offset(viewport);\n }\n\n if (DEBUG) {\n log_perf(performance.now() - __debug_start_time__);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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, CellMetadataBuilder, ColumnSizes } from \"./types\";\n\n// Singleton `WeakMap`s to store metadata for td/th elements, as well as the\n// datagrids themselves for each `<perspective-viewer>`\nexport const METADATA_MAP: WeakMap<HTMLElement, CellMetadata> = new WeakMap();\n\n/******************************************************************************\n *\n * View Model\n *\n */\n\nclass ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n reset() {\n this._index = 0;\n }\n\n get() {\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 class ViewModel {\n protected _column_sizes: ColumnSizes;\n protected _container: HTMLElement;\n public _span_factory: ElemFactory;\n public table: HTMLElement;\n public cells: (HTMLTableCellElement | undefined)[][];\n public rows: HTMLTableRowElement[];\n\n constructor(\n column_sizes: ColumnSizes,\n container: HTMLElement,\n table: HTMLElement,\n ) {\n this._column_sizes = column_sizes;\n this._container = container;\n this._span_factory = new ElemFactory(\"span\");\n this.table = table;\n this.cells = [];\n this.rows = [];\n }\n\n num_columns(): number {\n return this._get_row(Math.max(0, this.rows.length - 1)).row_container\n .length;\n }\n\n num_rows(): number {\n return this.cells.length;\n }\n\n _set_metadata(td: HTMLTableCellElement, metadata: CellMetadata): void {\n METADATA_MAP.set(td, metadata);\n }\n\n _get_or_create_metadata(\n td: HTMLTableCellElement | undefined,\n ): CellMetadataBuilder {\n if (!td) {\n return { value: undefined } as CellMetadataBuilder;\n }\n\n let metadata = METADATA_MAP.get(td);\n if (!metadata) {\n metadata = { value: undefined } as CellMetadata;\n METADATA_MAP.set(td, metadata);\n }\n\n return metadata;\n }\n\n _replace_cell(\n ridx: number,\n cidx: number,\n ): HTMLTableCellElement | undefined {\n const { tr, row_container } = this._get_row(ridx);\n let td = row_container[cidx];\n if (td) {\n tr.removeChild(td);\n row_container.splice(cidx, 1, undefined);\n }\n return td;\n }\n\n _fetch_cell(ridx: number, cidx: number): HTMLTableCellElement | undefined {\n if (ridx < 0 || cidx < 0) {\n return;\n }\n\n return this.cells[ridx]?.[cidx];\n }\n\n _get_row(ridx: number): {\n tr: HTMLTableRowElement;\n row_container: (HTMLTableCellElement | undefined)[];\n } {\n let tr = this.rows[ridx];\n if (!tr) {\n tr = this.rows[ridx] = document.createElement(\"tr\");\n this.table.appendChild(tr);\n }\n\n let row_container = this.cells[ridx];\n if (!row_container) {\n row_container = this.cells[ridx] = [];\n }\n\n return { tr, row_container };\n }\n\n _get_cell(tag = \"TD\", ridx: number, cidx: number): HTMLTableCellElement {\n const { tr, row_container } = this._get_row(ridx);\n let td = row_container[cidx];\n if (!td) {\n if (cidx < row_container.length) {\n td = row_container[cidx] = document.createElement(\n tag,\n ) as HTMLTableCellElement;\n const nextCell = row_container.slice(cidx + 1).find((x) => x);\n tr.insertBefore(td, nextCell || null);\n } else {\n td = row_container[cidx] = document.createElement(\n tag,\n ) as HTMLTableCellElement;\n tr.appendChild(td);\n }\n }\n\n if (td.tagName !== tag) {\n const new_td = document.createElement(tag) as HTMLTableCellElement;\n tr.replaceChild(new_td, td);\n this.cells[ridx].splice(cidx, 1, new_td);\n td = new_td;\n }\n\n return td;\n }\n\n _clean_columns(cidx: number | number[]): void {\n for (let i = 0; i < this.rows.length; i++) {\n const tr = this.rows[i];\n const row_container = this.cells[i];\n row_container.length = (Array.isArray(cidx) ? cidx[i] : cidx) || 0;\n const idx = this.cells[i].filter((x) => x !== undefined).length;\n const toRemove: Element[] = [];\n for (let j = idx; j < tr.children.length; j++) {\n toRemove.push(tr.children[j]);\n }\n\n for (const node of toRemove) {\n node.remove();\n }\n }\n }\n\n _clean_rows(ridx: number): void {\n // Batch collect rows to remove, then remove all at once\n const toRemove: Element[] = [];\n for (let i = ridx; i < this.table.children.length; i++) {\n toRemove.push(this.table.children[i]);\n }\n\n for (const node of toRemove) {\n node.remove();\n }\n\n this.rows.length = ridx;\n this.cells.length = ridx;\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularVirtualTableViewModel } from \"./scroll_panel\";\nimport { throttle_tag } from \"./utils\";\nimport { CellMetadata } from \"./types\";\nimport { METADATA_MAP } from \"./view_model\";\n\n/**\n * When enabled, override iOS overscroll behavior by emulating scroll position\n * in JavaScript. This prevents \"bounce\" on edges, but it also removes scroll\n * inertia. This waspreviously enabled by default in `regular-table<=0.4.3`,\n * but this version also had bugged (exaggerated) position calculation.\n * As `0.5.0` introduces sub-cell scrolling by defualt, this is now disabled by\n * default as well.\n */\nconst IOS_DISABLE_OVERSCROLL = false;\n\n/**\n *\n *\n * @class RegularViewEventModel\n * @extends {RegularVirtualTableViewModel}\n */\nexport class RegularViewEventModel extends RegularVirtualTableViewModel {\n private _memo_scroll_top?: number;\n private _memo_scroll_left?: number;\n private _memo_touch_startY?: number;\n private _memo_touch_startX?: number;\n private _last_clicked_time?: number;\n register_listeners() {\n // // TODO see `_on_click_or_dblclick` method jsdoc\n // this.addEventListener(\"dblclick\", this._on_dblclick.bind(this));\n\n this.addEventListener(\n \"mousedown\",\n this._on_click_or_dblclick.bind(this),\n );\n this.addEventListener(\"scroll\", this._on_scroll.bind(this), {\n passive: true,\n });\n\n this._register_glitch_scroll_listeners();\n }\n\n /**\n *\n */\n async _on_scroll(event: Event) {\n event.stopPropagation();\n await this.draw({ invalid_viewport: false, cache: true });\n this.dispatchEvent(new CustomEvent<undefined>(\"regular-table-scroll\"));\n }\n\n /**\n * Modern and mobile browsers implement complex scroll behavior to\n * implement fancy touch and intertia effects; these must be intercepted\n * and disabled to achieve clean virtual scrolling in the presence of a\n * `fixed` element.\n */\n private _register_glitch_scroll_listeners() {\n this.addEventListener(\"mousewheel\", this._on_mousewheel.bind(this), {\n passive: true,\n });\n\n if (IOS_DISABLE_OVERSCROLL) {\n this.addEventListener(\"touchmove\", this._on_touchmove.bind(this));\n this.addEventListener(\n \"touchstart\",\n this._on_touchstart.bind(this),\n {\n passive: true,\n },\n );\n }\n }\n /**\n * Mousewheel must precalculate in addition to `_on_scroll` to prevent\n * visual artifacts due to scrolling \"inertia\" on modern browsers.\n *\n * @param {*} event\n */\n private _on_mousewheel(event2: Event) {\n if (!window.hasOwnProperty(\"safari\")) {\n // **** Apple\n return;\n }\n\n const event = event2 as WheelEvent;\n const { clientWidth, clientHeight, scrollTop, scrollLeft } = this;\n event.preventDefault();\n event.returnValue = false;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - clientHeight,\n );\n\n const total_scroll_width = Math.max(\n 1,\n this._virtual_panel.offsetWidth - clientWidth,\n );\n\n this.scrollTop = Math.max(\n 0,\n Math.min(total_scroll_height, scrollTop + event.deltaY),\n );\n\n this.scrollLeft = Math.max(\n 0,\n Math.min(total_scroll_width, scrollLeft + event.deltaX),\n );\n\n this._on_scroll(event);\n }\n\n /**\n * Touchmove/touchstart must precalculate in addition to `_on_scroll` to\n * prevent visual artifacts due to scrolling \"inertia\" on mobile browsers.\n * This has the unfortunate side-effect of disabling scroll intertia.\n *\n * @param {*} event\n * @returns\n */\n private _on_touchmove(event: TouchEvent) {\n event.stopPropagation();\n event.preventDefault();\n event.returnValue = false;\n const { clientWidth, clientHeight } = this;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - clientHeight,\n );\n const total_scroll_width = Math.max(\n 1,\n this._virtual_panel.offsetWidth - clientWidth,\n );\n this.scrollTop = Math.min(\n total_scroll_height,\n (this._memo_scroll_top || 0) +\n ((this._memo_touch_startY || 0) - event.touches[0].pageY),\n );\n this.scrollLeft = Math.min(\n total_scroll_width,\n (this._memo_scroll_left || 0) +\n ((this._memo_touch_startX || 0) - event.touches[0].pageX),\n );\n this._on_scroll(event);\n }\n\n private _on_touchstart(event: TouchEvent) {\n this._memo_touch_startY = event.touches[0].pageY;\n this._memo_touch_startX = event.touches[0].pageX;\n this._memo_scroll_top = this.scrollTop;\n this._memo_scroll_left = this.scrollLeft;\n }\n\n /**\n * Handles double-click header width override reset.\n *\n * @param {*} event\n * @returns\n */\n private async _on_dblclick(event: MouseEvent) {\n let element = event.target as HTMLElement;\n const is_resize = element.classList.contains(\"rt-column-resize\");\n\n while (element.tagName !== \"TD\" && element.tagName !== \"TH\") {\n element = element.parentElement as HTMLElement;\n if (!this.contains(element)) {\n return;\n }\n }\n\n const metadata = METADATA_MAP.get(element);\n if (is_resize && metadata) {\n event.stopImmediatePropagation();\n\n // Clear column size data\n if (event.shiftKey) {\n this._column_sizes.override = {};\n this._column_sizes.auto = [];\n this._column_sizes.indices = [];\n } else {\n delete this._column_sizes.override[metadata.size_key];\n this._column_sizes.auto[metadata.size_key] = undefined;\n this._column_sizes.indices[metadata.size_key] = undefined;\n }\n\n // Update column width styles via adoptedStyleSheets\n this.table_model.updateColumnWidthStyles(\n {\n start_row: 0,\n end_row: 0,\n ...this._calculate_column_range(0),\n },\n this._view_cache.row_headers_length,\n );\n\n // Clear inline styles and clipping classes\n for (const row of event.shiftKey\n ? [\n this.table_model.header.cells[\n this.table_model.header.cells.length - 1\n ],\n ...this.table_model.body.cells,\n ]\n : this.table_model.body.cells) {\n for (const td of event.shiftKey\n ? row\n : [row[metadata.virtual_x!]]) {\n if (!td) {\n continue;\n }\n\n td.classList.remove(\"rt-cell-clip\");\n }\n }\n\n await this.draw({ cache: true });\n }\n }\n\n /**\n * Dispatches all click events to other handlers, depending on\n * `event.target`.\n *\n * @param {*} event\n * @returns\n */\n private async _on_click(event: MouseEvent) {\n if (event.button !== 0) {\n return;\n }\n\n let element = event.target as HTMLElement;\n const is_resize = element.classList.contains(\"rt-column-resize\");\n while (element.tagName !== \"TD\" && element.tagName !== \"TH\") {\n element = element.parentElement!;\n if (!this.contains(element)) {\n return;\n }\n }\n\n const metadata = METADATA_MAP.get(element);\n if (is_resize && metadata) {\n this._on_resize_column(\n event,\n element as HTMLTableCellElement,\n metadata,\n );\n event.stopImmediatePropagation();\n }\n }\n\n /**\n * `dblclick` event does not work reliably for some reason so dispatch this\n * event in JavaScript instead.\n *\n * @param {`*`} event\n */\n async _on_click_or_dblclick(event: MouseEvent) {\n const now = performance.now();\n if (this._last_clicked_time && now - this._last_clicked_time < 500) {\n this._last_clicked_time = now;\n await this._on_dblclick(event);\n } else {\n this._last_clicked_time = now;\n await this._on_click(event);\n }\n }\n\n /**\n * Regular event for column resize.\n *\n * @param {*} event\n * @param {*} element\n * @param {*} metadata\n */\n _on_resize_column(\n event: MouseEvent,\n element: HTMLTableCellElement,\n metadata: CellMetadata,\n ) {\n const { virtual_x, size_key } = metadata;\n const start = event.pageX;\n const header_x = (virtual_x || 0) + element.colSpan - 1;\n const header_element =\n this.table_model.header.get_column_header(header_x);\n const width = this._column_sizes.indices[size_key || 0] || 0;\n const move = (event: MouseEvent) =>\n throttle_tag(\n this,\n async () =>\n await this._on_resize_column_move(\n event,\n header_element,\n start,\n width,\n size_key || 0,\n header_x,\n ),\n );\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n const override_width = this._column_sizes.override[size_key || 0];\n const should_redraw =\n this._column_sizes.indices[size_key || 0] !== override_width;\n this._column_sizes.indices[size_key || 0] = override_width;\n if (should_redraw) {\n this.draw({ cache: true });\n }\n };\n\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n }\n\n /**\n * Regular event for mouse movement when resizing a column.\n *\n * @param {*} event\n * @param {*} th\n * @param {*} start\n * @param {*} width\n * @param {*} metadata\n */\n async _on_resize_column_move(\n event: MouseEvent,\n th: HTMLTableCellElement,\n start: number,\n width: number,\n size_key: number,\n virtual_x: number,\n ) {\n await new Promise(requestAnimationFrame);\n const diff = event.pageX - start;\n const override_width = Math.max(1, width + diff);\n this._column_sizes.override[size_key] = override_width;\n\n // If the column is smaller, new columns may need to be fetched, so\n // redraw, else just update the DOM widths and clipping classes.\n if (diff < 0) {\n await this.draw({\n preserve_width: true,\n throttle: false,\n cache: true,\n });\n } else {\n // Update column width styles via adoptedStyleSheets\n this.table_model.updateColumnWidthStyles(\n {\n start_row: 0,\n end_row: 0,\n ...this._calculate_column_range(0),\n },\n this._view_cache.row_headers_length,\n );\n\n // Update clipping classes for cells in this column\n const auto_width = this._column_sizes.auto[size_key] || 0;\n const should_clip = auto_width > override_width;\n\n // Update header clipping class\n th.classList.toggle(\"rt-cell-clip\", should_clip);\n\n // Update body cell clipping classes\n for (const row of this.table_model.body.cells) {\n const td = row[virtual_x];\n if (td) {\n td.classList.toggle(\"rt-cell-clip\", should_clip);\n }\n }\n }\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { ViewModel } from \"./view_model\";\nimport {\n HeaderDrawResult,\n ColumnSizes,\n CellMetadata,\n CellScalar,\n CellMetadataRowHeader,\n CellMetadataColumnHeader,\n CellMetadataBuilder,\n} from \"./types\";\n\n/**\n * <thead> view model. This model accumulates state in the form of\n * column_sizes, which leverages <tables> autosize behavior across\n * virtual pages.\n *\n * @class RegularHeaderViewModel\n */\nexport class RegularHeaderViewModel extends ViewModel {\n private _group_header_cache: [\n CellMetadataBuilder,\n HTMLTableCellElement,\n number,\n ][];\n private _offset_cache: number[];\n\n constructor(\n column_sizes: ColumnSizes,\n container: HTMLElement,\n table: HTMLElement,\n ) {\n super(column_sizes, container, table);\n this._group_header_cache = [];\n this._offset_cache = [];\n }\n\n _draw_group_th(\n offset_cache: number[],\n d: number,\n column: unknown,\n ): HTMLTableCellElement {\n const th = this._get_cell(\"TH\", d, offset_cache[d] || 0);\n offset_cache[d] += 1;\n th.removeAttribute(\"colspan\");\n th.textContent = \"\";\n if (column instanceof HTMLElement) {\n th.appendChild(column);\n } else {\n const span = this._span_factory.get();\n span.textContent = String(column ?? \"\");\n th.appendChild(span);\n }\n\n const resizeSpan = this._span_factory.get();\n resizeSpan.className = \"rt-column-resize\";\n th.appendChild(resizeSpan);\n return th;\n }\n\n _draw_group(\n column: CellScalar[],\n column_name: unknown,\n th: HTMLTableCellElement,\n ): CellMetadataBuilder {\n const metadata = this._get_or_create_metadata(th);\n metadata.column_header = column;\n metadata.value = column_name;\n return metadata;\n }\n\n _draw_th(\n column: CellScalar[],\n column_name: unknown,\n th: HTMLTableCellElement,\n size_key: number | number[],\n ): CellMetadataBuilder {\n const metadata = this._get_or_create_metadata(th);\n metadata.column_header = column;\n metadata.value = column_name;\n metadata.size_key = Array.isArray(size_key) ? size_key[0] : size_key;\n if (!Array.isArray(size_key) || size_key.length <= 1) {\n const override_width =\n this._column_sizes.override[metadata.size_key || 0];\n const auto_width =\n this._column_sizes.auto[metadata.size_key || 0] || 0;\n\n // Handle clipping class for overridden columns\n if (override_width) {\n th.classList.toggle(\n \"rt-cell-clip\",\n auto_width > override_width,\n );\n } else {\n th.classList.remove(\"rt-cell-clip\");\n }\n }\n\n return metadata;\n }\n\n get_column_header(cidx: number): HTMLTableCellElement {\n return this._get_cell(\"TH\", this.num_rows() - 1, cidx);\n }\n\n draw(\n alias: CellScalar[],\n parts: CellScalar[],\n colspan: number | undefined,\n x: number | undefined,\n size_key: number | number[],\n x0: number,\n _virtual_x: number,\n column_header_merge_depth: number | undefined,\n merge_headers: boolean,\n ): HeaderDrawResult | undefined {\n const header_levels = parts?.length; //config.column_pivots.length + 1;\n if (header_levels === 0) {\n return;\n }\n\n let th: HTMLTableCellElement | undefined;\n let metadata: CellMetadataBuilder | undefined;\n let column_name: unknown;\n let output: HeaderDrawResult | undefined = undefined;\n column_header_merge_depth =\n typeof column_header_merge_depth === \"undefined\"\n ? header_levels - 1\n : column_header_merge_depth;\n for (let d = 0; d < header_levels; d++) {\n column_name = parts[d] ? parts[d] : \"\";\n this._offset_cache[d] = this._offset_cache[d] || 0;\n\n if (d < column_header_merge_depth) {\n if (\n merge_headers &&\n this._group_header_cache?.[d]?.[0]?.value === column_name\n ) {\n th = this._group_header_cache[d][1];\n this._group_header_cache[d][2] += 1;\n if (colspan === 1) {\n this._group_header_cache[d][0].row_header_x =\n Array.isArray(size_key) ? size_key[0] : size_key;\n }\n th.setAttribute(\n \"colspan\",\n String(this._group_header_cache[d][2]),\n );\n } else {\n th = this._draw_group_th(\n this._offset_cache,\n d,\n column_name,\n );\n metadata = this._draw_group(parts, column_name, th);\n this._group_header_cache[d] = [metadata, th, 1];\n }\n } else {\n th = this._draw_group_th(this._offset_cache, d, column_name);\n\n // Update the group header's metadata such that each group\n // header has the same metadata coordinates of its rightmost\n // column.\n metadata = this._draw_th(\n alias.length > 0 ? alias : parts,\n column_name,\n th,\n size_key,\n );\n\n if (typeof output === \"undefined\") {\n output = { th, metadata } as {\n th: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n\n for (const [group_meta] of this._group_header_cache) {\n group_meta.size_key = metadata.size_key;\n }\n\n th.removeAttribute(\"colspan\");\n }\n\n this._get_row(d).tr.classList.toggle(\n \"rt-autosize\",\n d === column_header_merge_depth,\n );\n\n th.classList.toggle(\"rt-group-corner\", x === undefined);\n if (metadata) {\n metadata.x = typeof x === \"undefined\" ? x : Math.floor(x);\n metadata.column_header_y = d;\n metadata.x0 = Math.floor(x0);\n metadata.virtual_x = _virtual_x;\n if (colspan === 1) {\n metadata.type = \"corner\";\n metadata.row_header_x = Array.isArray(size_key)\n ? size_key[0]\n : size_key;\n } else {\n metadata.type = \"column_header\";\n delete metadata.row_header_x;\n }\n }\n }\n\n this._clean_rows(this._offset_cache.length);\n output =\n output ||\n ({ th: th!, metadata: metadata! } as {\n th: HTMLTableCellElement;\n metadata: CellMetadata;\n });\n return output;\n }\n\n clean(): void {\n this._clean_columns(this._offset_cache);\n }\n\n reset_header_cache(): void {\n this._offset_cache = [];\n this._group_header_cache = [];\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 BodyDrawResult,\n CellMetadata,\n CellMetadataBuilder,\n CellScalar,\n ColumnState,\n ViewState,\n} from \"./types\";\nimport { ViewModel } from \"./view_model\";\n\n/**\n * <tbody> view model.\n *\n * @class RegularBodyViewModel\n */\nexport class RegularBodyViewModel extends ViewModel {\n _draw_td(\n tagName: string,\n ridx: number,\n val: unknown,\n cidx: number,\n { column_name }: ColumnState,\n { ridx_offset }: ViewState,\n size_key: number,\n ): { td: HTMLTableCellElement; metadata: CellMetadataBuilder } {\n const td = this._get_cell(tagName, ridx, cidx);\n const metadata = this._get_or_create_metadata(td);\n metadata.y = ridx + Math.floor(ridx_offset);\n const key = (metadata.size_key = size_key || 0);\n if (tagName === \"TD\") {\n metadata.column_header = column_name;\n }\n\n // Handle clipping class for overridden columns\n const override_width = this._column_sizes.override[key];\n if (override_width) {\n const auto_width = this._column_sizes.auto[key] || 0;\n const clip = auto_width > override_width;\n if (td.classList.contains(\"rt-cell-clip\") !== clip) {\n td.classList.toggle(\"rt-cell-clip\", clip);\n }\n } else {\n td.classList.remove(\"rt-cell-clip\");\n }\n\n if (metadata.value !== val) {\n if (val instanceof HTMLElement) {\n td.textContent = \"\";\n td.appendChild(val);\n } else {\n td.textContent = String(val ?? \"\");\n }\n }\n\n metadata.value = val;\n return { td, metadata };\n }\n\n draw<T extends CellScalar | CellScalar[]>(\n container_height: number,\n column_state: ColumnState<T>,\n view_state: ViewState,\n th: boolean = false,\n x?: number,\n x0?: number,\n size_key?: number,\n merge_headers?: boolean,\n ): BodyDrawResult {\n const {\n cidx,\n column_data,\n row_headers,\n column_data_listener_metadata,\n } = column_state;\n let { row_height } = view_state;\n let metadata: CellMetadataBuilder | undefined;\n const ridx_offset: number[] = [];\n const tds: Array<{ td: HTMLTableCellElement; metadata: CellMetadata }> =\n [];\n let ridx = 0;\n const cidx_offset: number[] = [];\n const loops = th ? (view_state.row_headers_length ?? 1) : 1;\n const y0_floor = Math.floor(view_state.ridx_offset);\n const y1_ceil = Math.ceil(view_state.y1);\n const x1_ceil = Math.ceil(view_state.x1);\n const x_floor = x === undefined ? x : Math.floor(x);\n const x0_floor = x0 === undefined ? undefined : Math.floor(x0);\n const dx = Math.floor((x ?? 0) - (x0 ?? 0));\n\n for (let i = 0; i < loops; i++) {\n ridx = 0;\n const cidx_i = cidx + i;\n\n for (const val of column_data) {\n let obj:\n | {\n td: HTMLTableCellElement;\n metadata: CellMetadataBuilder;\n }\n | undefined;\n if (th) {\n const valArray = val as CellScalar[];\n const row_header = valArray[i];\n const ridx_off_i = ridx_offset[i] || 1;\n const prev_row = this._fetch_cell(\n ridx - ridx_off_i,\n cidx_i,\n );\n\n const prev_row_metadata =\n this._get_or_create_metadata(prev_row);\n\n const cidx_off_ridx = cidx_offset[ridx] || 1;\n const prev_col = this._fetch_cell(\n ridx,\n cidx_i - cidx_off_ridx,\n );\n const prev_col_metadata =\n this._get_or_create_metadata(prev_col);\n\n if (\n merge_headers &&\n prev_col &&\n (prev_col_metadata.value === row_header ||\n row_header === undefined) &&\n !prev_col.hasAttribute(\"rowspan\")\n ) {\n const offset = (cidx_offset[ridx] = cidx_off_ridx + 1);\n prev_col.setAttribute(\"colspan\", String(offset));\n this._replace_cell(ridx, cidx_i);\n } else if (\n merge_headers &&\n prev_row &&\n prev_row_metadata.value === row_header &&\n !prev_row.hasAttribute(\"colspan\")\n ) {\n const offset = (ridx_offset[i] = ridx_off_i + 1);\n prev_row.setAttribute(\"rowspan\", String(offset));\n this._replace_cell(ridx, cidx_i);\n } else {\n obj = this._draw_td(\n \"TH\",\n ridx,\n row_header,\n cidx_i,\n column_state as ColumnState<CellScalar>,\n view_state,\n i,\n );\n\n const td = obj.td;\n const meta = obj.metadata;\n td.style.display = \"\";\n td.removeAttribute(\"rowspan\");\n td.removeAttribute(\"colspan\");\n meta.type = \"row_header\";\n meta.row_header = valArray;\n meta.row_header_x = i;\n meta.y0 = y0_floor;\n meta.y1 = y1_ceil;\n meta.virtual_x = i;\n if (x0_floor !== undefined) {\n meta.x0 = x0_floor;\n }\n ridx_offset[i] = 1;\n cidx_offset[ridx] = 1;\n tds[i] = obj as {\n td: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n } else {\n obj = this._draw_td(\n \"TD\",\n ridx,\n val,\n cidx,\n column_state as ColumnState<CellScalar>,\n view_state,\n size_key ?? 0,\n );\n const meta = obj.metadata;\n if (column_data_listener_metadata) {\n meta.user = column_data_listener_metadata[ridx];\n }\n\n meta.type = \"body\";\n meta.x = x_floor || 0;\n meta.x1 = x1_ceil;\n meta.row_header = row_headers?.[ridx] || [];\n meta.y0 = y0_floor;\n meta.y1 = y1_ceil;\n meta.dx = dx;\n meta.dy = (meta.y ?? 0) - y0_floor;\n meta.virtual_x = cidx;\n if (x0_floor !== undefined) {\n meta.x0 = x0_floor;\n }\n\n tds[0] = obj as {\n td: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n\n ridx++;\n metadata = obj ? obj.metadata : metadata;\n row_height = row_height || obj?.td.offsetHeight;\n if (ridx * (row_height ?? 0) > container_height) {\n break;\n }\n }\n }\n this._clean_rows(ridx);\n return { tds, ridx, row_height };\n }\n\n clean({ ridx, cidx }: { ridx: number; cidx: number }): void {\n this._clean_rows(ridx);\n this._clean_columns(cidx);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularHeaderViewModel } from \"./thead\";\nimport { RegularBodyViewModel } from \"./tbody\";\nimport {\n BodyDrawResult,\n CellScalar,\n CellTuple,\n CellMetadata,\n ColumnState,\n DataColumnDrawResult,\n FetchResult,\n RowHeadersResult,\n ViewCache,\n ViewFunction,\n Viewport,\n DataResponse,\n ViewState,\n} from \"./types\";\nimport { ColumnSizes } from \"./types\";\n\n/**\n * Base class containing protected helper methods for table rendering.\n * This class provides the internal implementation details for drawing\n * and managing table view state.\n *\n * @class RegularTableViewModelBase\n */\nabstract class RegularTableViewModelBase {\n public _column_sizes!: ColumnSizes;\n public _row_headers_length: number = 0;\n public header!: RegularHeaderViewModel;\n public body!: RegularBodyViewModel;\n\n /**\n * Initializes view state with viewport and sizing information.\n */\n protected _initializeViewState(\n viewport: Viewport,\n selected_id: number | undefined,\n ): ViewState {\n const {\n start_row: ridx_offset = 0,\n start_col: x0 = 0,\n end_col: x1 = 0,\n end_row: y1 = 0,\n } = viewport;\n\n const sub_cell_offset =\n this._column_sizes.indices[\n (this._row_headers_length || 0) + Math.floor(viewport.start_col)\n ] ?? 0;\n\n return {\n viewport_width: 0,\n selected_id,\n ridx_offset,\n sub_cell_offset,\n x0: x0,\n x1: x1,\n y1: y1,\n row_height: this._column_sizes.row_height,\n row_headers_length: this._row_headers_length,\n };\n }\n\n /**\n * Draws row headers and returns updated state.\n */\n protected _drawRowHeaders(\n row_headers: CellScalar[][],\n row_headers_length: number,\n column_headers_length: number,\n container_height: number,\n view_state: ViewState,\n preserve_width: boolean,\n x0: number,\n column_header_merge_depth: number | undefined,\n merge_column_headers: boolean,\n merge_row_headers: boolean,\n ): RowHeadersResult {\n const column_name = [`${row_headers_length}`];\n const last_cells: CellTuple[] = [];\n\n const column_state: ColumnState<CellScalar[]> = {\n column_name,\n cidx: 0,\n column_data: row_headers,\n row_headers,\n first_col: true,\n };\n\n const size_key = Math.floor(x0);\n const cont_body = this.body.draw(\n container_height,\n column_state,\n { ...view_state, x0: 0 },\n true,\n undefined,\n undefined,\n size_key,\n merge_row_headers,\n );\n\n const cont_heads = [];\n for (let i = 0; i < row_headers_length; i++) {\n const header = this.header.draw(\n column_name,\n Array(column_headers_length).fill(\"\"),\n 1,\n undefined,\n i,\n x0,\n i,\n column_header_merge_depth,\n merge_column_headers,\n );\n if (!!header) {\n cont_heads.push(header);\n }\n }\n\n for (let i = 0; i < cont_heads.length; i++) {\n const { th } = cont_heads[i];\n view_state.viewport_width +=\n this._column_sizes.indices[i] || th.offsetWidth;\n }\n view_state.row_height = view_state.row_height || cont_body.row_height;\n\n const _virtual_x = row_headers[0].length;\n\n if (!preserve_width) {\n for (let i = 0; i < row_headers_length; i++) {\n const { td, metadata } = cont_body.tds[i] || {};\n const { th, metadata: hmetadata } = cont_heads[i] || {};\n if (!!td || !!th) {\n last_cells.push([th || td, hmetadata || metadata]);\n }\n }\n }\n\n return { cont_body, first_col: false, _virtual_x, last_cells };\n }\n\n /**\n * Calculates how many additional columns are needed to fill the viewport.\n */\n protected _calculateViewportExtension(\n viewport: Viewport,\n view_state: ViewState,\n container_width: number,\n num_columns: number,\n _virtual_x: number,\n x0: number,\n ): void {\n let end_col_offset = 0,\n size_extension = 0;\n\n while (\n this._column_sizes.indices.length >\n _virtual_x + x0 + end_col_offset + 1 &&\n size_extension + view_state.viewport_width < container_width\n ) {\n end_col_offset++;\n size_extension +=\n this._column_sizes.indices[_virtual_x + x0 + end_col_offset] ||\n 0;\n }\n\n if (size_extension + view_state.viewport_width < container_width) {\n const estimate = Math.min(num_columns, viewport.start_col + 5);\n viewport.end_col = Math.max(1, Math.min(num_columns, estimate));\n } else {\n viewport.end_col = Math.max(\n 1,\n Math.min(num_columns, viewport.start_col + end_col_offset),\n );\n }\n }\n\n /**\n * Draws a single data column and returns rendering information.\n */\n protected _drawDataColumn(\n dcidx: number,\n view_response: DataResponse,\n _virtual_x: number,\n x0: number,\n container_height: number,\n view_state: ViewState,\n first_col: boolean,\n column_header_merge_depth: number | undefined,\n merge_column_headers: boolean,\n merge_row_headers: boolean,\n ): DataColumnDrawResult {\n const column_name = view_response.column_headers?.[dcidx] || [];\n const column_data = view_response.data[dcidx];\n const column_data_listener_metadata = view_response.metadata?.[dcidx];\n const column_state: ColumnState = {\n column_name,\n cidx: _virtual_x,\n column_data,\n column_data_listener_metadata,\n row_headers: view_response.row_headers,\n first_col,\n };\n\n const x = dcidx + x0;\n const size_key = _virtual_x + Math.floor(x0);\n const cont_head = this.header.draw(\n column_name,\n column_name,\n undefined,\n x,\n size_key,\n x0,\n _virtual_x,\n column_header_merge_depth,\n merge_column_headers,\n );\n\n const cont_body = this.body.draw(\n container_height,\n column_state,\n view_state,\n false,\n x,\n x0,\n size_key,\n merge_row_headers,\n );\n\n return { cont_head, cont_body };\n }\n\n /**\n * Fetches additional columns when data is missing during rendering.\n */\n protected async _fetchMissingColumns(\n viewport: Viewport,\n view: ViewFunction,\n view_response: DataResponse,\n dcidx: number,\n view_state: ViewState,\n container_width: number,\n num_columns: number,\n _virtual_x: number,\n x0: number,\n ): Promise<FetchResult> {\n let missing_cidx = Math.max(dcidx + Math.floor(x0), 0);\n const new_viewport = structuredClone(viewport);\n new_viewport.start_col = missing_cidx;\n this._calculateViewportExtension(\n new_viewport,\n view_state,\n container_width,\n num_columns,\n _virtual_x,\n x0,\n );\n\n const new_col = await view(\n Math.floor(new_viewport.start_col),\n Math.floor(new_viewport.start_row),\n Math.ceil(new_viewport.end_col),\n Math.ceil(new_viewport.end_row),\n );\n\n let column_header_merge_depth: number | undefined;\n let merge_headers: \"both\" | \"row\" | \"column\" | undefined;\n\n if (typeof new_col.column_header_merge_depth !== \"undefined\") {\n column_header_merge_depth = new_col.column_header_merge_depth;\n }\n\n if (typeof new_col.merge_headers !== \"undefined\") {\n merge_headers = new_col.merge_headers;\n }\n\n if (new_col.data.length === 0) {\n return { column_header_merge_depth, merge_headers };\n }\n\n viewport.end_col = new_viewport.start_col + new_col.data.length;\n for (let i = 0; i < new_col.data.length; i++) {\n view_response.data[dcidx + i] = new_col.data[i];\n if (new_col.metadata && view_response.metadata) {\n view_response.metadata[dcidx + i] = new_col.metadata[i];\n }\n\n if (view_response.column_headers && new_col.column_headers?.[i]) {\n view_response.column_headers[dcidx + i] =\n new_col.column_headers[i];\n }\n }\n\n return { column_header_merge_depth, merge_headers };\n }\n\n /**\n * Cleans up body and header after drawing.\n */\n protected _cleanupAfterDraw(\n cont_body: BodyDrawResult | undefined,\n _virtual_x: number,\n ): void {\n this.body.clean({ ridx: cont_body?.ridx || 0, cidx: _virtual_x });\n this.header.clean();\n }\n\n protected _carriageReturn() {\n this.body._span_factory.reset();\n this.header._span_factory.reset();\n }\n}\n\n/**\n * <table> view model. In order to handle unknown column width when `draw()`\n * is called, this model will iteratively fetch more data to fill in columns\n * until the page is complete, and makes some column viewport estimations\n * when this information is not availble.\n *\n * @class RegularTableViewModel\n */\nexport class RegularTableViewModel extends RegularTableViewModelBase {\n public table: HTMLTableElement;\n private _columnWidthStyleSheet?: CSSStyleSheet;\n private _lastColumnWidthCss?: string;\n private _lastDataResponse?: DataResponse;\n private _lastViewport?: Viewport;\n\n constructor(\n table_clip: HTMLElement,\n column_sizes: ColumnSizes,\n element: HTMLElement,\n ) {\n super();\n this._column_sizes = column_sizes;\n this.clear(element);\n const [table] = element.children as HTMLCollectionOf<HTMLTableElement>;\n const [thead, tbody] =\n table.children as HTMLCollectionOf<HTMLTableSectionElement>;\n\n this.table = table;\n this.header = new RegularHeaderViewModel(\n column_sizes,\n table_clip,\n thead,\n );\n\n this.body = new RegularBodyViewModel(column_sizes, table_clip, tbody);\n }\n\n num_columns(): number {\n return this.header.num_columns();\n }\n\n clear(element: HTMLElement): void {\n element.innerHTML =\n '<table cellspacing=\"0\"><thead></thead><tbody></tbody></table>';\n }\n\n /**\n * Calculate amendments to auto size from this render pass.\n * Uses adoptedStyleSheets with :nth-child selectors for optimal performance.\n *\n * This method separates DOM reads (getBoundingClientRect) from DOM writes\n * (CSS stylesheet updates) to minimize forced reflows. All measurements are\n * collected first, then column size data is updated, and finally all column\n * widths (both auto and override) are applied via a single stylesheet update.\n */\n autosize_cells(\n last_cells: CellTuple[],\n override_row_height?: number,\n ): void {\n const zoom = this.table.currentCSSZoom ?? 1;\n const measurements: Array<{\n cell: HTMLElement;\n metadata: CellMetadata | undefined;\n box: DOMRect;\n }> = [];\n\n for (const [cell, metadata] of last_cells) {\n const box = cell.getBoundingClientRect();\n measurements.push({ cell, metadata, box });\n }\n\n for (const { metadata, box } of measurements) {\n this._column_sizes.row_height =\n override_row_height ??\n Math.max(\n 10,\n Math.min(\n this._column_sizes.row_height ?? box.height / zoom,\n box.height / zoom,\n ),\n );\n\n if (metadata?.size_key !== undefined) {\n this._column_sizes.indices[metadata.size_key] =\n box.width / zoom;\n if (\n box.width / zoom &&\n this._column_sizes.override[metadata.size_key] === undefined\n ) {\n this._column_sizes.auto[metadata.size_key] =\n box.width / zoom;\n }\n }\n }\n }\n\n /**\n * Updates column width styles for all columns using adoptedStyleSheets.\n * Generates CSS rules with :nth-child selectors for both auto-sized and\n * overridden column widths, applying them all in a single stylesheet update.\n *\n * This method should be called whenever column sizes change, including:\n * - After autosize_cells() measurements\n * - When user resizes columns\n * - When resetAutoSize() is called\n */\n updateColumnWidthStyles(\n viewport: Viewport,\n row_headers_length: number,\n ): void {\n const cssRules: string[] = [];\n\n let row_headers_size_key;\n for (\n row_headers_size_key = 0;\n row_headers_size_key < row_headers_length;\n row_headers_size_key++\n ) {\n const override_width =\n this._column_sizes.override[row_headers_size_key];\n const auto_width = this._column_sizes.auto[row_headers_size_key];\n if (override_width !== undefined) {\n // Override width takes precedence\n // CSS :nth-child is 1-indexed\n const columnIndex = row_headers_size_key + 1; // - Math.floor(viewport.start_col);\n\n // Work backwards to handle colspan/rowspan missing elements in\n // `row_headers`.\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody th.rt-cell-clip:nth-last-of-type(${row_headers_length - row_headers_size_key})`,\n `{min-width:${override_width}px;max-width:${override_width}px;}`,\n );\n } else if (auto_width !== undefined) {\n // Auto width applies when no override\n const columnIndex = row_headers_size_key + 1; // - Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody th.rt-cell-clip:nth-last-of-type(${row_headers_length - row_headers_size_key})`,\n `{min-width:${auto_width}px;}`,\n );\n }\n }\n\n for (\n let size_key = row_headers_size_key;\n size_key <\n row_headers_size_key +\n (Math.floor(viewport.end_col) - Math.floor(viewport.start_col));\n size_key++\n ) {\n const override_width =\n this._column_sizes.override[\n size_key + Math.floor(viewport.start_col)\n ];\n const auto_width =\n this._column_sizes.auto[\n size_key + Math.floor(viewport.start_col)\n ];\n\n if (override_width !== undefined) {\n // Override width takes precedence\n // CSS :nth-child is 1-indexed\n const columnIndex = size_key + 1; // Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-of-type(${columnIndex - row_headers_size_key})`,\n `{min-width:${override_width}px;max-width:${override_width}px;}`,\n );\n } else if (auto_width !== undefined) {\n // Auto width applies when no override\n const columnIndex = size_key + 1; // Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-of-type(${columnIndex - row_headers_size_key})`,\n `{min-width:${auto_width}px;}`,\n );\n }\n }\n\n // Apply all rules via single stylesheet update\n if (cssRules.length > 0) {\n this._applyColumnWidthStyles(cssRules.join(\"\\n\"));\n } else if (this._columnWidthStyleSheet) {\n this._columnWidthStyleSheet.replaceSync(\"\");\n }\n }\n\n /**\n * Applies column width styles using adoptedStyleSheets.\n * Creates or updates a dedicated stylesheet for column widths.\n * Caches the CSS string to avoid redundant replaceSync calls.\n */\n private _applyColumnWidthStyles(css: string): void {\n if (css === this._lastColumnWidthCss) {\n return;\n }\n\n const shadowRoot = this.table.getRootNode() as ShadowRoot;\n if (!shadowRoot || !shadowRoot.adoptedStyleSheets) {\n return;\n }\n\n // Find or create the column width stylesheet\n if (!this._columnWidthStyleSheet) {\n this._columnWidthStyleSheet = new CSSStyleSheet();\n shadowRoot.adoptedStyleSheets = [\n ...shadowRoot.adoptedStyleSheets,\n this._columnWidthStyleSheet,\n ];\n }\n\n this._columnWidthStyleSheet.replaceSync(css);\n this._lastColumnWidthCss = css;\n }\n\n async _getDimState(view_cache: ViewCache): Promise<DataResponse> {\n if (!this._lastDataResponse) {\n return await view_cache.view(0, 0, 0, 0);\n }\n\n return this._lastDataResponse!;\n }\n\n _resetDimState() {\n this._lastDataResponse = undefined;\n this._lastViewport = undefined;\n }\n\n async draw(\n container_size: { width: number; height: number },\n view_cache: ViewCache,\n selected_id: number | undefined,\n preserve_width: boolean,\n viewport: Viewport,\n num_columns: number,\n style_callback: (last_cells: CellTuple) => Promise<undefined>,\n ): Promise<undefined> {\n const { width: container_width, height: container_height } =\n container_size;\n\n // Fetch and prepare initial data\n const view_response = (this._lastDataResponse = await view_cache.view(\n Math.floor(viewport.start_col),\n Math.floor(viewport.start_row),\n Math.ceil(viewport.end_col),\n Math.ceil(viewport.end_row),\n ));\n\n let { column_header_merge_depth, merge_headers = \"both\" } =\n view_response;\n\n const merge_row_headers =\n merge_headers === \"both\" || merge_headers === \"row\";\n const merge_column_headers =\n merge_headers === \"both\" || merge_headers === \"column\";\n const x0 = viewport.start_col ?? 0;\n\n if (view_response.row_headers) {\n let maxLen = 0;\n for (const rh of view_response.row_headers) {\n if (rh.length > maxLen) maxLen = rh.length;\n }\n this._row_headers_length = maxLen;\n\n for (let i = 0; i < view_response.row_headers.length; i++) {\n view_response.row_headers[i].length =\n this._row_headers_length || 0;\n }\n }\n\n // Update view cache lengths\n view_cache.row_headers_length =\n view_response.num_row_headers ??\n view_response.row_headers?.[0]?.length ??\n 0;\n\n view_cache.column_headers_length =\n view_response.num_column_headers ??\n view_response.column_headers?.[0]?.length ??\n 0;\n\n const { view, row_headers_length, column_headers_length } = view_cache;\n const view_state = this._initializeViewState(viewport, selected_id);\n\n // Draw row headers\n let cont_body: BodyDrawResult | undefined;\n let _virtual_x = 0;\n let last_cells: CellTuple[] = [];\n let first_col = true;\n\n if (view_response.row_headers?.length) {\n const row_header_result = this._drawRowHeaders(\n view_response.row_headers,\n row_headers_length,\n column_headers_length,\n container_height,\n view_state,\n preserve_width,\n x0,\n column_header_merge_depth,\n merge_column_headers,\n merge_row_headers,\n );\n cont_body = row_header_result.cont_body;\n first_col = row_header_result.first_col;\n _virtual_x = row_header_result._virtual_x;\n last_cells = row_header_result.last_cells;\n }\n\n // Draw data columns\n try {\n let dcidx = 0;\n const num_visible_columns = num_columns - viewport.start_col;\n\n while (dcidx < num_visible_columns) {\n // Fetch missing columns if needed\n if (!view_response.data[dcidx]) {\n // Style the partially-renderd rows so there is no FOUT\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n const fetch_result = await this._fetchMissingColumns(\n viewport,\n view,\n view_response,\n dcidx,\n view_state,\n container_width,\n num_columns,\n _virtual_x,\n x0,\n );\n\n if (fetch_result.column_header_merge_depth !== undefined) {\n column_header_merge_depth =\n fetch_result.column_header_merge_depth;\n }\n\n if (fetch_result.merge_headers !== undefined) {\n merge_headers = fetch_result.merge_headers;\n }\n\n if (!view_response.data[dcidx]) {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this._carriageReturn();\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(\n last_cells[this._row_headers_length],\n );\n\n this.autosize_cells(\n last_cells,\n this._column_sizes.row_height,\n );\n\n return;\n }\n }\n\n // Draw column\n const { cont_head, cont_body: drawn_body } =\n this._drawDataColumn(\n dcidx,\n view_response,\n _virtual_x,\n x0,\n container_height,\n view_state,\n first_col,\n column_header_merge_depth,\n merge_column_headers,\n merge_row_headers,\n );\n\n cont_body = drawn_body;\n first_col = false;\n\n // Collect cells for autosizing\n if (!preserve_width) {\n for (const { td, metadata } of cont_body.tds) {\n last_cells.push([\n cont_head?.th || td,\n cont_head?.metadata || metadata,\n ]);\n }\n }\n\n // Update dimensions\n let col_width =\n this._column_sizes.indices[_virtual_x + Math.floor(x0)] ||\n cont_head?.th?.offsetWidth;\n\n if (!col_width) {\n col_width = 0;\n for (const { td } of cont_body.tds) {\n col_width += td?.offsetWidth || 0;\n }\n }\n\n view_state.viewport_width += col_width;\n view_state.row_height =\n view_state.row_height || cont_body.row_height;\n\n _virtual_x++;\n dcidx++;\n\n // Check if viewport filled\n if (this._isViewportFilled(view_state, container_width)) {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n\n // Recalculate after style listeners\n view_state.viewport_width = 0;\n this.autosize_cells(\n last_cells,\n this._column_sizes.row_height,\n );\n\n for (let i = 0; i < last_cells.length; i++) {\n view_state.viewport_width +=\n this._column_sizes.indices[Math.floor(x0) + i] || 0;\n }\n\n if (this._isViewportFilled(view_state, container_width)) {\n this._carriageReturn();\n return;\n }\n }\n }\n\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this._carriageReturn();\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n this.autosize_cells(last_cells, this._column_sizes.row_height);\n } finally {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n }\n }\n\n private _isViewportFilled(\n view_state: ViewState,\n container_width: number,\n ): boolean {\n return (\n view_state.viewport_width - view_state.sub_cell_offset >\n container_width\n );\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularViewEventModel } from \"./events\";\nimport { RegularTableViewModel } from \"./table\";\nimport {\n CellMetadata,\n DataListener,\n FPSRecord,\n SetDataListenerOptions,\n} from \"./types\";\nimport { get_draw_fps } from \"./utils\";\nimport { METADATA_MAP } from \"./view_model\";\n\nexport type VirtualMode = \"both\" | \"horizontal\" | \"vertical\" | \"none\";\n\nconst VIRTUAL_MODES: VirtualMode[] = [\"both\", \"horizontal\", \"vertical\", \"none\"];\n\nexport type ResetAutoSizeOptions = {\n auto: boolean;\n override: boolean;\n indices: boolean;\n row_height: boolean;\n};\n\n/**\n * The `<regular-table>` custom element.\n *\n * This module has no exports, but importing it has a side effect: the\n * `RegularTableElement` class is registered as a custom element, after which\n * it can be used as a standard DOM element.\n *\n * The documentation in this module defines the instance structure of a\n * `<regular-table>` DOM object instantiated typically, through HTML or any\n * relevent DOM method e.g. `document.createElement(\"perspective-viewer\")` or\n * `document.getElementsByTagName(\"perspective-viewer\")`.\n */\nexport class RegularTableElement extends RegularViewEventModel {\n _initialized!: boolean;\n\n constructor() {\n super();\n this._column_sizes = { auto: [], override: {}, indices: [] } as any;\n this._style_callbacks = [];\n this._initialized = false;\n }\n\n connectedCallback() {\n if (!this._initialized) {\n this._create_shadow_dom();\n this.register_listeners();\n this.setAttribute(\"tabindex\", \"0\");\n this._initialized = true;\n this.table_model = new RegularTableViewModel(\n this._table_clip,\n this._column_sizes,\n this,\n );\n }\n }\n\n /**\n * Reset column autosizing, such that column sizes will be recalculated\n * on the next draw() call.\n */\n resetAutoSize(options?: ResetAutoSizeOptions) {\n if (!options || options.auto) {\n this._column_sizes.auto = [];\n }\n\n if (!options || options.override) {\n this._column_sizes.override = {};\n }\n\n if (!options || options.indices) {\n this._column_sizes.indices = [];\n }\n\n if (!options || options.row_height) {\n this._column_sizes.row_height = undefined;\n }\n }\n\n /**\n * Gets a mapping of column indices and sizes overriden by the users.\n *\n * @returns A mapping of column index to override pixel size.\n */\n saveColumnSizes(): Record<number, number> {\n return structuredClone(this._column_sizes.override);\n }\n\n /**\n * Restore an array of column widths.\n *\n * @param sizes A mapping of column index to override pixel size.\n */\n restoreColumnSizes(sizes: Record<number, number>) {\n this._column_sizes.override = structuredClone(sizes);\n }\n\n /**\n * Clears the current renderer `<table>`.\n */\n clear(): void {\n this.table_model = new RegularTableViewModel(\n this._table_clip,\n this._column_sizes,\n this,\n );\n }\n\n /**\n * Adds a style listener callback. The style listeners are called\n * whenever the <table> is re-rendered, such as through API invocations\n * of draw() and user-initiated events such as scrolling. Within this\n * optionally async callback, you can select `<td>`, `<th>`, etc. elements\n * via regular DOM API methods like querySelectorAll().\n *\n * # Examples\n *\n * ```javascript\n * const unsubscribe = table.addStyleListener(() => {\n * for (const td of table.querySelectorAll(\"td\")) {\n * td.setAttribute(\"contenteditable\", true);\n * }\n * });\n *\n * setTimeout(() => {\n * unsubscribe();\n * }, 1000);\n * ```\n *\n * @param {function({detail: RegularTableElement}): void} styleListener - A\n * (possibly async) function that styles the inner <table>.\n * @returns {function(): void} A function to remove this style listener.\n */\n addStyleListener(\n styleListener: (event: {\n detail: RegularTableElement;\n }) => void | Promise<void>,\n ): () => void {\n this._style_callbacks.push(styleListener as any);\n let isSubscribed = true;\n const unsubscribe = () => {\n if (!isSubscribed) {\n return;\n }\n\n isSubscribed = false;\n this._style_callbacks = this._style_callbacks.slice();\n const index = this._style_callbacks.indexOf(styleListener as any);\n this._style_callbacks.splice(index, 1);\n };\n\n return unsubscribe;\n }\n\n /**\n * Removes a style listener added by `addStyleListener`.\n * `removeStyleListener` throws an error if the provided listener is not\n * registered.\n *\n * @param {*} styleListener A listener previously added with\n * `addStyleListener`\n */\n removeStyleListener(\n styleListener: (event: {\n detail: RegularTableElement;\n }) => void | Promise<void>,\n ): void {\n const start_len = this._style_callbacks.length;\n this._style_callbacks = this._style_callbacks.filter(\n (x) => x !== (styleListener as any),\n );\n console.assert(\n this._style_callbacks.length === start_len - 1,\n \"No listener found\",\n );\n }\n\n /**\n * Returns the `MetaData` object associated with a `<td>` or `<th>`. When\n * your `StyleListener` is invoked, use this method to look up additional\n * `MetaData` about any `HTMLTableCellElement` in the rendered `<table>`.\n *\n * # Examples\n *\n * ```javascript\n * const elems = document.querySelector(\"td:last-child td:last_child\");\n * const metadata = table.getMeta(elems);\n * console.log(`Viewport corner is ${metadata.x}, ${metadata.y}`);\n * const header = table.getMeta({row_header_x: 1, y: 3}).row_header;\n * ```\n *\n * @param {HTMLTableCellElement|Partial<MetaData>} element - The child\n * element of this `<regular-table>` for which to look up metadata, or a\n * coordinates-like object to refer to metadata by logical position.\n * @returns {MetaData} The metadata associated with the element.\n */\n getMeta(element?: HTMLElement | CellMetadata): CellMetadata | undefined {\n if (element === undefined) {\n return;\n } else if (element instanceof HTMLElement) {\n return METADATA_MAP.get(element);\n } else if (\n \"row_header_x\" in element &&\n element.row_header_x &&\n element.row_header_x >= 0\n ) {\n if (element.row_header_x! < this._view_cache.row_headers_length) {\n const td = this.table_model.body._fetch_cell(\n element.y!,\n element.row_header_x!,\n );\n return this.getMeta(td);\n }\n } else if (\n \"column_header_y\" in element &&\n element.column_header_y! >= 0\n ) {\n if (\n element.column_header_y! <\n this._view_cache.column_headers_length\n ) {\n const td = this.table_model.header._fetch_cell(\n element.column_header_y!,\n element.x!,\n );\n return this.getMeta(td);\n }\n } else if (\"dx\" in element) {\n return this.getMeta(\n this.table_model.body._fetch_cell(\n element.dy,\n element.dx + (this.table_model._row_headers_length || 0),\n ),\n );\n }\n }\n\n /**\n * Get performance statistics about this `<regular-table>`. Calling this\n * method resets the internal state, which makes it convenient to measure\n * performance at regular intervals (see example).\n *\n * # Examples\n *\n * ```javascript\n * const table = document.getElementById(\"my_regular_table\");\n * setInterval(() => {\n * const {real_fps} = table.getDrawFPS();\n * console.log(`Measured ${fps} fps`)\n * });\n * ```\n *\n * @returns {Performance} Performance data aggregated since the last\n * call to `getDrawFPS()`.\n */\n getDrawFPS(): FPSRecord {\n return get_draw_fps();\n }\n\n /**\n * Call this method to set the `scrollLeft` and `scrollTop` for this\n * `<regular-table>` by calculating the position of this `scrollLeft`\n * and `scrollTop` relative to the underlying widths of its columns\n * and heights of its rows.\n *\n * # Examples\n *\n * ```javascript\n * table.scrollToCell(1, 3);\n * ```\n *\n * @param {number} x - The left most `x` index column to scroll into view.\n * @param {number} y - The top most `y` index row to scroll into view.\n */\n async scrollToCell(x: number, y: number): Promise<void> {\n if (!this._view_cache) {\n console.warn(\"data listener not configured\");\n return;\n }\n\n const viewport_row_height = this._column_sizes.row_height || 0;\n this.scrollTop = Math.ceil(viewport_row_height * y);\n let scroll_left = 0;\n while (x > 0) {\n x--;\n scroll_left +=\n this._column_sizes.indices[\n x + this._view_cache.row_headers_length\n ] || 60;\n }\n\n this.scrollLeft = Math.ceil(scroll_left);\n await new Promise(requestAnimationFrame);\n await this.flush();\n }\n\n /**\n * Call this method to set `DataListener` for this `<regular-table>`,\n * which will be called whenever a new data slice is needed to render.\n * Calls to `draw()` will fail if no `DataListener` has been set\n *\n * # Examples\n *\n * ```javascript\n * table.setDataListener((x0, y0, x1, y1) => {\n * return {\n * num_rows: num_rows = DATA[0].length,\n * num_columns: DATA.length,\n * data: DATA.slice(x0, x1).map(col => col.slice(y0, y1))\n * };\n * })\n * ```\n *\n * @param dataListener\n * `dataListener` is called by to request a rectangular section of data\n * for a virtual viewport, (x0, y0, x1, y1), and returns a `DataReponse`\n * object.\n * @param options\n */\n setDataListener(\n dataListener: DataListener,\n {\n virtual_mode = \"both\",\n preserve_state = false,\n }: SetDataListenerOptions = {},\n ): void {\n console.assert(\n VIRTUAL_MODES.indexOf(virtual_mode) > -1,\n `Unknown virtual_mode ${virtual_mode}; valid options are \"both\" (default), \"horizontal\", \"vertical\" or \"none\"`,\n );\n\n const virtual_mode_changed = this._virtual_mode !== virtual_mode;\n if (preserve_state) {\n console.assert(\n !virtual_mode_changed,\n \"preserve_state called with modified virtual_mode\",\n );\n\n this._view_cache.view = dataListener as any;\n } else {\n this._virtual_mode = virtual_mode;\n this._invalid_schema = true;\n this._view_cache = {\n view: dataListener as any,\n row_headers_length: 0,\n column_headers_length: 0,\n };\n\n if (virtual_mode_changed) {\n this._setup_virtual_scroll();\n }\n }\n }\n}\n\nif (document.createElement(\"regular-table\").constructor === HTMLElement) {\n window.customElements.define(\"regular-table\", RegularTableElement);\n}\n\n// Custom Elements extensions\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n \"regular-table\": RegularTableElement;\n }\n }\n}\n\ndeclare global {\n interface Document {\n createElement(\n tagName: \"regular-table\",\n options?: ElementCreationOptions,\n ): RegularTableElement;\n querySelector<E extends Element = Element>(selectors: string): E | null;\n querySelector(selectors: \"regular-table\"): RegularTableElement | null;\n }\n\n interface CustomElementRegistry {\n get(tagName: \"regular-table\"): typeof RegularTableElement;\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 { HTMLPerspectiveViewerPluginElement } from \"./plugin\";\nimport type { PerspectiveViewerElement } from \"../../dist/wasm/perspective-viewer.js\";\nimport type React from \"react\";\nimport type { ViewerConfigUpdate } from \"./ts-rs/ViewerConfigUpdate.js\";\nimport type {\n ViewWindow,\n ViewConfigUpdate,\n Filter,\n} from \"@perspective-dev/client\";\n\nexport class PerspectiveSelectDetail {\n selected: boolean;\n row: Record<string, unknown>;\n column_names?: string[];\n removeConfigs: ViewConfigUpdate[];\n insertConfigs: ViewConfigUpdate[];\n constructor(\n selected: boolean,\n row: Record<string, unknown>,\n column_names: string[],\n removeConfigs: ViewConfigUpdate[],\n insertConfigs: ViewConfigUpdate[],\n ) {\n this.selected = selected;\n this.row = row;\n this.column_names = column_names;\n this.removeConfigs = removeConfigs;\n this.insertConfigs = insertConfigs;\n }\n\n get removeFilters(): Filter[] {\n return this.removeConfigs.flatMap((x) => x.filter ?? []);\n }\n\n get insertFilters(): Filter[] {\n return this.insertConfigs.flatMap((x) => x.filter ?? []);\n }\n}\n\nimport type {\n ExportDropDownMenuElement,\n CopyDropDownMenuElement,\n} from \"../../dist/wasm/perspective-viewer.d.ts\";\n\n// DOM extensions\n\nexport type HTMLPerspectiveViewerElement = PerspectiveViewerElement &\n PerspectiveViewerElementExt &\n HTMLElement;\n\nexport interface HTMLPerspectiveViewerExportMenuElement\n extends HTMLElement,\n ExportDropDownMenuElement {}\n\nexport interface HTMLPerspectiveViewerCopyMenuElement\n extends HTMLElement,\n CopyDropDownMenuElement {}\n\nexport type PerspectiveClickEventDetail = {\n config: ViewerConfigUpdate;\n row: Record<string, any>;\n column_names: Array<string | Array<string>>;\n};\n\nexport type PerspectiveSelectEventDetail = {\n view_window: ViewWindow;\n};\n\n// JSX / React extensions\n\ntype ReactPerspectiveViewerAttributes<T> = React.HTMLAttributes<T>;\n\ntype JsxPerspectiveViewerElement = {\n class?: string;\n} & React.DetailedHTMLProps<\n ReactPerspectiveViewerAttributes<HTMLPerspectiveViewerElement>,\n HTMLPerspectiveViewerElement\n>;\n\n// React <19\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// React >=19\n\n// Why are these `ts-ignore`? React 19 makes choice of JSX runtime in `tsconfig`\n// the determination of which runtime this needs to be, but this is chosen\n// by the user ... so I'm not sure what the React authors want from me here\n// exactly. Divination?\n\n// @ts-ignore\ndeclare module \"react/jsx-runtime\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// @ts-ignore\ndeclare module \"react/jsx-dev-runtime\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\ndeclare module \"react\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// Custom Elements extensions\n\ndeclare global {\n interface Document {\n createElement(\n tagName: \"perspective-viewer\",\n options?: ElementCreationOptions,\n ): HTMLPerspectiveViewerElement;\n createElement(\n tagName: \"perspective-viewer-plugin\",\n options?: ElementCreationOptions,\n ): HTMLPerspectiveViewerPluginElement;\n querySelector<E extends Element = Element>(selectors: string): E | null;\n querySelector(\n selectors: \"perspective-viewer\",\n ): HTMLPerspectiveViewerElement | null;\n }\n\n interface CustomElementRegistry {\n get(\n tagName: \"perspective-viewer\",\n ): typeof PerspectiveViewerElement &\n PerspectiveViewerElementExt &\n typeof HTMLElement;\n get(\n tagName: \"perspective-viewer-plugin\",\n ): typeof HTMLPerspectiveViewerPluginElement;\n }\n}\n\nexport interface PerspectiveViewerElementExt {\n /**\n * Register a new plugin via its custom element name. This method is called\n * automatically as a side effect of importing a plugin module, so this\n * method should only typically be called by plugin authors.\n *\n * @category Plugin\n * @param name The `name` of the custom element to register, as supplied\n * to the `customElements.define(name)` method.\n * @example\n * ```javascript\n * customElements.get(\"perspective-viewer\").registerPlugin(\"my-plugin\");\n * ```\n */\n registerPlugin(name: string): Promise<void>;\n\n addEventListener(\n name: \"perspective-click\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-select\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-global-filter\",\n cb: (e: CustomEvent<PerspectiveSelectEventDetail>) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-toggle-settings\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-toggle-settings-before\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-config-update\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-statusbar-pointerdown\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-table-delete\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-table-delete-before\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n removeEventListener(name: \"perspective-click\", cb: any): void;\n removeEventListener(name: \"perspective-select\", cb: any): void;\n removeEventListener(name: \"perspective-global-filter\", cb: any): void;\n removeEventListener(name: \"perspective-toggle-settings\", cb: any): void;\n removeEventListener(\n name: \"perspective-toggle-settings-before\",\n cb: any,\n ): void;\n removeEventListener(name: \"perspective-config-update\", cb: any): void;\n removeEventListener(\n name: \"perspective-statusbar-pointerdown\",\n cb: any,\n ): void;\n removeEventListener(name: \"perspective-table-delete\", cb: any): void;\n removeEventListener(name: \"perspective-table-delete-before\", cb: any): void;\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 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", "// \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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["AVG", "TOTAL", "START", "get_draw_fps", "now", "elapsed", "avg", "real_fps", "virtual_fps", "num_frames", "log_perf", "x", "TAGS", "flush_tag", "tag", "throttle_tag", "f", "l", "isFirefox", "BROWSER_MAX_HEIGHT", "container_default", "sub_cell_offsets_default", "CLIP_X", "CLIP_Y", "TRANSFORM_X", "TRANSFORM_Y", "HTML_TEMPLATE", "RegularVirtualTableViewModel", "_sub_cell_rule", "_virtual_panel", "_virtual_mode", "_container_size", "_start_row", "_end_row", "_start_col", "_end_col", "_invalid_schema", "_selected_id", "_table_clip", "_column_sizes", "_view_cache", "_invalidated", "_is_styling", "_style_callbacks", "_probe_element", "options", "internal_draw", "_probe_row_height", "tbody", "tr", "_create_shadow_dom", "containerStyleSheet", "sub_cell_style", "virtual_panel", "table_clip", "_setup_virtual_scroll", "_calculate_viewport", "nrows", "num_columns", "start_row", "end_row", "_calculate_row_range", "start_col", "end_col", "_calculate_column_range", "_validate_viewport", "invalid_column", "invalid_row", "_update_virtual_panel_width", "invalid", "totalWidth", "w", "virtual_width", "_calc_scrollable_column_width", "panel_width", "_update_virtual_panel_height", "row_height", "header_height", "virtual_panel_px_size", "_update_sub_cell_offset", "viewport", "last_cell", "y_offset", "x_offset_index", "_row_headers_length", "x_offset", "_calc_start_column", "vis_cols", "height", "containerHeight", "header_levels", "total_scroll_height", "percent_scroll", "clip_panel_row_height", "scroll_index_offset", "offset_width", "diff", "new_val", "_max_scroll_column", "width", "max_scroll_column", "cidx", "viewport_width", "rhLen", "i", "__debug_start_time__", "_resetDimState", "invalid_viewport", "preserve_width", "num_rows", "num_row_headers", "num_column_headers", "_getDimState", "is_non_vertical", "is_non_horizontal", "safe_num_rows", "safe_num_columns", "invalid_schema_or_column", "first_iteration", "last_cells", "callback", "old_height", "METADATA_MAP", "ElemFactory", "_name", "_elements", "_index", "name", "elem", "ViewModel", "_container", "_span_factory", "column_sizes", "container", "table", "_get_row", "_set_metadata", "td", "metadata", "_get_or_create_metadata", "_replace_cell", "ridx", "row_container", "_fetch_cell", "_get_cell", "nextCell", "new_td", "_clean_columns", "idx", "toRemove", "j", "node", "_clean_rows", "IOS_DISABLE_OVERSCROLL", "RegularViewEventModel", "_memo_scroll_top", "_memo_scroll_left", "_memo_touch_startY", "_memo_touch_startX", "_last_clicked_time", "_on_click_or_dblclick", "_on_scroll", "_register_glitch_scroll_listeners", "event", "_on_mousewheel", "_on_touchmove", "_on_touchstart", "event2", "clientWidth", "clientHeight", "scrollTop", "scrollLeft", "total_scroll_width", "_on_dblclick", "element", "is_resize", "row", "_on_click", "_on_resize_column", "virtual_x", "size_key", "start", "header_x", "header_element", "move", "_on_resize_column_move", "up", "override_width", "should_redraw", "th", "should_clip", "RegularHeaderViewModel", "_group_header_cache", "_offset_cache", "_draw_group_th", "offset_cache", "d", "column", "span", "resizeSpan", "_draw_group", "column_name", "_draw_th", "auto_width", "alias", "parts", "colspan", "x0", "_virtual_x", "column_header_merge_depth", "merge_headers", "output", "group_meta", "RegularBodyViewModel", "_draw_td", "tagName", "val", "ridx_offset", "key", "clip", "container_height", "column_state", "view_state", "column_data", "row_headers", "column_data_listener_metadata", "tds", "cidx_offset", "loops", "y0_floor", "y1_ceil", "x1_ceil", "x_floor", "x0_floor", "dx", "cidx_i", "obj", "valArray", "row_header", "ridx_off_i", "prev_row", "prev_row_metadata", "cidx_off_ridx", "prev_col", "prev_col_metadata", "offset", "meta", "RegularTableViewModelBase", "_initializeViewState", "selected_id", "x1", "y1", "sub_cell_offset", "_drawRowHeaders", "row_headers_length", "column_headers_length", "merge_column_headers", "merge_row_headers", "cont_body", "cont_heads", "header", "hmetadata", "_calculateViewportExtension", "container_width", "end_col_offset", "size_extension", "estimate", "_drawDataColumn", "dcidx", "view_response", "first_col", "cont_head", "_fetchMissingColumns", "view", "missing_cidx", "new_viewport", "new_col", "_cleanupAfterDraw", "_carriageReturn", "RegularTableViewModel", "_columnWidthStyleSheet", "_lastColumnWidthCss", "_lastDataResponse", "_lastViewport", "thead", "override_row_height", "zoom", "measurements", "cell", "box", "cssRules", "row_headers_size_key", "columnIndex", "_applyColumnWidthStyles", "css", "shadowRoot", "view_cache", "container_size", "style_callback", "maxLen", "rh", "row_header_result", "num_visible_columns", "fetch_result", "drawn_body", "col_width", "_isViewportFilled", "VIRTUAL_MODES", "RegularTableElement", "_initialized", "sizes", "styleListener", "isSubscribed", "index", "start_len", "y", "viewport_row_height", "scroll_left", "dataListener", "virtual_mode", "preserve_state", "virtual_mode_changed", "PerspectiveSelectDetail", "selected", "row", "column_names", "removeConfigs", "insertConfigs", "x", "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": ["../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/utils.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/constants.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/dist/css/container.css", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/dist/css/sub-cell-offsets.css", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/scroll_panel.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/view_model.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/events.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/thead.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/tbody.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/table.ts", "../../../../node_modules/.pnpm/regular-table@0.8.4/node_modules/regular-table/src/ts/regular-table.ts", "../../../../rust/perspective-viewer/src/ts/extensions.ts", "../../src/ts/types.ts", "../../src/ts/model/meta_columns.ts", "../../../../rust/perspective-viewer/src/ts/column-format.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", "../../src/ts/index.ts"],
|
|
4
|
+
"sourcesContent": ["// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { FPSRecord } from \"./types\";\n\n/******************************************************************************\n *\n * Profling\n *\n */\n\nlet AVG = 0,\n TOTAL = 0,\n START = performance.now();\n\nexport function get_draw_fps(): FPSRecord {\n const now = performance.now();\n const elapsed = now - START;\n const avg = AVG;\n const real_fps = (TOTAL * 1000) / elapsed;\n const virtual_fps = 1000 / avg;\n const num_frames = TOTAL;\n AVG = 0;\n TOTAL = 0;\n START = now;\n return { avg, real_fps, virtual_fps, num_frames, elapsed };\n}\n\nexport function log_perf(x: number) {\n AVG = (AVG * TOTAL + x) / (TOTAL + 1);\n TOTAL += 1;\n}\n\n/******************************************************************************\n *\n * Utils\n *\n */\n\nconst TAGS: Map<any, PromiseWithResolvers<undefined>> = new Map();\n\nexport async function flush_tag(\n tag: any,\n): Promise<PromiseWithResolvers<undefined> | undefined> {\n await new Promise(requestAnimationFrame);\n return await TAGS.get(tag)?.promise;\n}\n\nexport async function throttle_tag<T>(\n tag: any,\n f: () => Promise<T>,\n): Promise<T | undefined> {\n if (TAGS.has(tag)) {\n await TAGS.get(tag)?.promise;\n if (TAGS.has(tag)) {\n await TAGS.get(tag)?.promise;\n return;\n }\n }\n\n TAGS.set(tag, Promise.withResolvers());\n try {\n return await f();\n } finally {\n const l = TAGS.get(tag);\n TAGS.delete(tag);\n l?.resolve(undefined);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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// Output runtime debug info like FPS.\nexport const DEBUG = true;\n\n// The largest size virtual <div> in (px) that Chrome can support without\n// glitching.\nconst isFirefox = navigator.userAgent.toLowerCase().indexOf(\"firefox\") > -1;\nexport const BROWSER_MAX_HEIGHT = isFirefox ? 5000000 : 10000000;\n", ":host{position:absolute;top:0px;left:0px;right:0px;bottom:0px;overflow:scroll;overflow-anchor:none;overscroll-behavior:none;-webkit-overflow-scrolling:touch;}div.rt-virtual-panel{position:absolute;top:0;left:0;right:0;pointer-events:none;}div.rt-scroll-table-clip{position:sticky;contain:strict;overflow-anchor:none;width:100%;height:100%;}slot{position:absolute;overflow:hidden;overflow-anchor:none;}", ":host ::slotted(table){--regular-table--transform-x:0px;--regular-table--transform-y:0px;--regular-table--clip-x:0px;--regular-table--clip-y:0px;}", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { log_perf, throttle_tag, flush_tag } from \"./utils\";\nimport { DEBUG, BROWSER_MAX_HEIGHT } from \"./constants\";\nimport type { RegularTableViewModel } from \"./table\";\nimport { RegularTableElement } from \"./regular-table\";\nimport {\n CellTuple,\n ColumnSizes,\n StyleCallback,\n ContainerSize,\n DrawOptions,\n ViewCache,\n Viewport,\n ViewportValidation,\n VirtualMode,\n} from \"./types\";\n\n// @ts-ignore - CSS imports handled by build system\nimport container_css from \"../../dist/css/container.css\";\n\n// @ts-ignore - CSS imports handled by build system\nimport sub_cell_offsets from \"../../dist/css/sub-cell-offsets.css\";\n\n// CSS custom property names for sub-cell offsets\nconst CLIP_X = \"--regular-table--clip-x\";\nconst CLIP_Y = \"--regular-table--clip-y\";\nconst TRANSFORM_X = \"--regular-table--transform-x\";\nconst TRANSFORM_Y = \"--regular-table--transform-y\";\n\nconst HTML_TEMPLATE = `<div class=\"rt-virtual-panel\"></div><div class=\"rt-scroll-table-clip\"><slot></slot></div>`;\n\n/**\n * Handles the virtual scroll pane, as well as the double buffering\n * of the underlying <table>. This DOM structure looks a little like\n * this:\n *\n * +------------------------+ <- regular-table\n * | +----------------------|------<- div.rt-virtual-panel\n * | | +------------------+ | <- div.rt-scroll-table-clip\n * | | | +----------------|-|--+ <- table |\n * | | | | 1 A Alabama | | | |\n * | | | | 2 B Arizona | | | |\n * | | | | 3 C Arkansas | | | |\n * | | | | 4 D Californi| | | |\n * | | | | 5 E Colorado | | | |\n * | | +------------------+ | | |\n * +------------------------+ | |\n * | | 8 H District of C | |\n * | +---------------------+ |\n * | |\n * | |\n * | |\n * | |\n * | |\n * +--------------------------------------------------+\n *\n * `overflow: auto` is applied to `.rt-scroll-container`, and `.rt-virtual-pane`\n * is sized to match the estimated \"virtual\" size of the `table`; estimated,\n * because it's true size can't be known until all columns dimensions are known,\n * which may be deferred in the case of auto-sized tables.\n *\n * Double buffering can be enabled on \"column scroll\", \"row scroll\" and/or\n * \"column schema change\". When enabled and a redraw is requested for the case,\n * the existing table is cloned with `cloneNode()` and swapped with the real\n * `table`, which is then updated offscreen and swapped back in. While this is\n * much slower to render, it prevents draw-in.\n *\n * @class RegularVirtualTableViewModel\n */\nexport class RegularVirtualTableViewModel extends HTMLElement {\n private _sub_cell_rule!: CSSStyleRule;\n protected _virtual_panel!: HTMLElement;\n protected _virtual_mode!: VirtualMode;\n protected _container_size!: ContainerSize;\n protected _start_row?: number;\n protected _end_row?: number;\n protected _start_col?: number;\n protected _end_col?: number;\n protected _invalid_schema?: boolean;\n protected _selected_id?: number;\n protected _table_clip!: HTMLElement;\n protected _column_sizes!: ColumnSizes;\n protected _view_cache!: ViewCache;\n protected _invalidated?: boolean;\n protected _is_styling?: boolean;\n protected table_model!: RegularTableViewModel;\n protected _style_callbacks!: Array<StyleCallback>;\n private _probe_element?: [HTMLElement, HTMLElement];\n\n /**\n * Draws this virtual panel, given an object of render options that allow\n * the implementor to fine tune the individual render frames based on the\n * interaction and previous render state.\n *\n * @param {DrawOptions} [options]\n * @param {boolean} [options.invalid_viewport=true]\n * @param {boolean} [options.preserve_width=false]\n * @param {boolean} [options.throttle=true]\n */\n async draw(options: DrawOptions = {}): Promise<void> {\n if (typeof options.throttle !== \"undefined\" && !options.throttle) {\n return await internal_draw.call(this, options);\n } else {\n return await throttle_tag(this, () =>\n internal_draw.call(this, options),\n );\n }\n }\n\n /**\n * Await any pending rendering operations.\n */\n async flush(): Promise<void> {\n await flush_tag(this);\n }\n\n /**\n * Probe the shadow DOM to measure the default row height from CSS.\n */\n protected _probe_row_height() {\n if (!this._probe_element) {\n this._probe_element = [\n document.createElement(\"table\"),\n document.createElement(\"td\"),\n ];\n this._probe_element[0].style.visibility = \"hidden\";\n this._probe_element[0].style.position = \"absolute\";\n const tbody = document.createElement(\"tbody\");\n const tr = document.createElement(\"tr\");\n this._probe_element[1].textContent = \"X\";\n tr.appendChild(this._probe_element[1]);\n tbody.appendChild(tr);\n this._probe_element[0].appendChild(tbody);\n }\n\n this.appendChild(this._probe_element[0]);\n this._column_sizes.row_height = this._probe_element[1].offsetHeight;\n this._probe_element[0].remove();\n }\n\n /**\n * Create the DOM for this `shadowRoot`.\n */\n protected _create_shadow_dom() {\n this.attachShadow({ mode: \"open\" });\n if (!this.shadowRoot) {\n return;\n }\n\n const containerStyleSheet = new CSSStyleSheet();\n containerStyleSheet.replaceSync(container_css);\n const sub_cell_style = new CSSStyleSheet();\n sub_cell_style.replaceSync(sub_cell_offsets);\n this._sub_cell_rule = sub_cell_style.cssRules[0] as CSSStyleRule;\n this.shadowRoot.adoptedStyleSheets = [\n containerStyleSheet,\n sub_cell_style,\n ];\n\n this.shadowRoot.innerHTML = HTML_TEMPLATE;\n const [virtual_panel, table_clip] = this.shadowRoot!.children;\n this._table_clip = table_clip as HTMLElement;\n this._virtual_panel = virtual_panel as HTMLElement;\n this._setup_virtual_scroll();\n }\n\n protected _setup_virtual_scroll() {\n if (this._table_clip) {\n if (\n this._virtual_mode === \"both\" ||\n this._virtual_mode === \"vertical\"\n ) {\n this._table_clip.style.top = \"0px\";\n } else {\n this._table_clip.style.removeProperty(\"top\");\n }\n\n if (\n this._virtual_mode === \"both\" ||\n this._virtual_mode === \"horizontal\"\n ) {\n this._table_clip.style.left = \"0px\";\n } else {\n this._table_clip.style.removeProperty(\"left\");\n }\n\n if (this._virtual_mode !== \"both\") {\n this._table_clip.style.contain = \"none\";\n } else {\n this._table_clip.style.removeProperty(\"contain\");\n }\n }\n }\n\n /**\n * Calculates the `viewport` argument for perspective's `to_columns` method.\n *\n * @param {*} nrows\n * @returns\n */\n protected _calculate_viewport(\n nrows: number,\n num_columns: number,\n ): Viewport {\n const { start_row, end_row } = this._calculate_row_range(nrows);\n const { start_col, end_col } =\n this._calculate_column_range(num_columns);\n\n return { start_col, end_col, start_row, end_row };\n }\n\n /**\n * Determines whether the viewport is identical in row and column axes to\n * the previous viewport rendered, for throttling identical render requests,\n * e.g. when the logical (row-wise) viewport does not change, but the pixel\n * viewport has moved a few px.\n *\n * @param {*} {start_col, end_col, start_row, end_row}\n * @returns\n */\n protected _validate_viewport({\n start_col,\n end_col,\n start_row,\n end_row,\n }: Viewport): ViewportValidation {\n start_row = Math.floor(start_row);\n end_row = Math.ceil(end_row);\n start_col = Math.floor(start_col);\n end_col = Math.ceil(end_col);\n const invalid_column = this._start_col !== start_col;\n const invalid_row =\n this._start_row !== start_row ||\n this._end_row !== end_row ||\n this._end_col !== end_col;\n this._start_col = start_col;\n this._end_col = end_col;\n this._start_row = start_row;\n this._end_row = end_row;\n return { invalid_column, invalid_row };\n }\n\n /**\n * Updates the `virtual_panel` width based on view state.\n *\n * @param {*} invalid\n */\n protected _update_virtual_panel_width(\n invalid: boolean,\n num_columns: number,\n ): void {\n if (invalid) {\n if (\n this._virtual_mode === \"vertical\" ||\n this._virtual_mode === \"none\"\n ) {\n let totalWidth = 0;\n for (const w of this._column_sizes.indices) {\n totalWidth += w || 0;\n }\n\n this._virtual_panel.style.width =\n totalWidth.toPrecision(10) + \"px\";\n } else {\n const virtual_width =\n this._calc_scrollable_column_width(num_columns);\n\n if (virtual_width !== 0) {\n const panel_width =\n this._container_size.width + virtual_width + 2;\n this._virtual_panel.style.width =\n panel_width.toPrecision(10) + \"px\";\n } else {\n this._virtual_panel.style.width = \"1px\";\n }\n }\n }\n }\n\n /**\n * Updates the `virtual_panel` height based on the view state.\n *\n * @param {*} nrows\n */\n protected _update_virtual_panel_height(nrows: number): void {\n const { row_height = 0 } = this._column_sizes;\n const header_height =\n this._view_cache.column_headers_length * row_height;\n let virtual_panel_px_size;\n virtual_panel_px_size = Math.min(\n BROWSER_MAX_HEIGHT,\n nrows * row_height + header_height,\n );\n this._virtual_panel.style.height = `${virtual_panel_px_size.toPrecision(10)}px`;\n }\n\n /**\n * Update sub-cell offset CSS.\n *\n * @param viewport\n */\n protected _update_sub_cell_offset(\n viewport: Viewport,\n last_cell?: CellTuple,\n ): void {\n const y_offset =\n (this._column_sizes.row_height || 0) * (viewport.start_row % 1) ||\n 0;\n\n const x_offset_index =\n (this.table_model._row_headers_length || 0) +\n Math.floor(viewport.start_col);\n\n if (this._column_sizes.indices[x_offset_index] === undefined) {\n this._column_sizes.indices[x_offset_index] =\n last_cell?.[0]?.offsetWidth || 0;\n }\n\n const x_offset =\n this._column_sizes.indices[x_offset_index]! *\n (viewport.start_col % 1) || 0;\n\n this._sub_cell_rule.style.setProperty(CLIP_X, `${x_offset}px`);\n this._sub_cell_rule.style.setProperty(CLIP_Y, `${y_offset}px`);\n this._sub_cell_rule.style.setProperty(TRANSFORM_X, `${-x_offset}px`);\n this._sub_cell_rule.style.setProperty(TRANSFORM_Y, `${-y_offset}px`);\n }\n\n /**\n * Calculates `start_col` and `end_col` for the viewport - most of the\n * details of which are actually calculated in `_max_column`, the equivalent\n * of `total_scroll_height` from `_calculate_row_range`.\n *\n * @returns\n */\n protected _calculate_column_range(num_columns: number): {\n start_col: number;\n end_col: number;\n } {\n if (\n this._virtual_mode === \"none\" ||\n this._virtual_mode === \"vertical\"\n ) {\n return { start_col: 0, end_col: Infinity };\n } else {\n const start_col = this._calc_start_column();\n const vis_cols =\n this.table_model.num_columns() ||\n Math.min(\n num_columns,\n Math.ceil(this._container_size.width / 60),\n );\n let end_col = start_col + vis_cols + 1;\n return { start_col, end_col };\n }\n }\n\n /**\n * Calculate `start_row` and `end_row` for the viewport. We do this by\n * first calculating `total_scroll_height`, the px height of the\n * scrollable page, from the `_virtual_panel.offsetHeight`.\n *\n * 0px +------------+-------------+ - virtual_panel.offsetHeight\n * | | . | . 600px\n * | viewport | . | .\n * | | . | .\n * 200px +------------+ - height | . - total_scroll_height\n * | 200px | . . 400px\n * | | . .\n * | | . .\n * | | . .\n * | | . .\n * 600px +--------------------------+ - -\n *\n * `percent_scroll` can be calculated from this value and `scrollTop`,\n * which we can then apply to the new calculated height to preserve scroll\n * position when the height has changed since previous render.\n *\n * 0px +--------------------------+ -\n * | | .\n * | | .\n * | | . scrollable area\n * 300px +------------+ | .\n * | | | .\n * - - - | viewport | - - - - - - | - total_scroll_height\n * | | | 400px\n * 500px +------------+ |\n * | |\n * 600px +--------------------------+\n *\n * @param {*} nrows\n * @returns\n */\n private _calculate_row_range(nrows: number): {\n start_row: number;\n end_row: number;\n } {\n const { height, containerHeight } = this._container_size;\n const row_height = this._column_sizes.row_height || 0;\n const header_levels = this._view_cache.column_headers_length;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - containerHeight,\n );\n\n const percent_scroll =\n Math.max(Math.ceil(this.scrollTop), 0) / total_scroll_height;\n\n const clip_panel_row_height = height / row_height - header_levels;\n const relative_nrows = nrows || 0;\n const scrollable_rows = Math.max(\n 0,\n relative_nrows - clip_panel_row_height,\n );\n const start_row = scrollable_rows * percent_scroll;\n const end_row = Math.max(\n 0,\n Math.min(start_row + clip_panel_row_height, nrows),\n );\n return { start_row, end_row };\n }\n\n private _calc_start_column(): number {\n const scroll_index_offset = this._view_cache.row_headers_length;\n let start_col = 0;\n let offset_width = 0;\n let diff = 0;\n while (offset_width < this.scrollLeft) {\n const new_val =\n this._column_sizes.indices[start_col + scroll_index_offset];\n diff = this.scrollLeft - offset_width;\n start_col += 1;\n offset_width += new_val !== undefined ? new_val : 60;\n }\n\n start_col +=\n diff /\n (this._column_sizes.indices[start_col + scroll_index_offset - 1] ||\n 60);\n\n return Math.max(0, start_col - 1);\n }\n\n /**\n * Calculates the minimum possible starting column index for which the last\n * column is completely visible (e.g. not occluded by the container clip).\n * This is assumed to be the # of columns until the column widths are\n * calculated as they are scrolled into view by the user, which requires\n * special synchronization with _update_virtual_panel_width`\n * as the scrollable width will change as the user scrolls left to right.\n *\n * Once `_column_sizes.indices` has enough column widths populated from\n * user scrolling, it calulates the cumulative sum of column widths from\n * last visible column backwards, until the sum is larger than the viewport\n * px width, which is 1 below the max scroll column\n *\n * width = 290 = 210 = 100 = 0\n * 0px V V V 500px\n * +-----------------+-------+---------+--------+\n * | ..ol B) (Col C) | Col D | Col E | Col F |\n * | | 80px | 110px | 100px |\n * | | | | |\n *\n * @returns\n */\n private _max_scroll_column(num_columns: number): number {\n let width = 0;\n if (this._view_cache.row_headers_length > 0) {\n for (const w of this._column_sizes.indices.slice(\n 0,\n this._view_cache.row_headers_length,\n )) {\n width += w || 0;\n }\n }\n\n let scroll_index_offset = this._view_cache.row_headers_length;\n let max_scroll_column = num_columns;\n while (width < this._container_size.width && max_scroll_column >= 0) {\n max_scroll_column--;\n width +=\n this._column_sizes.indices[\n max_scroll_column + scroll_index_offset\n ] || 60;\n }\n\n return Math.min(num_columns - 1, max_scroll_column + 1);\n }\n\n private _calc_scrollable_column_width(num_columns: number): number {\n let scroll_index_offset = this._view_cache.row_headers_length;\n const max_scroll_column = this._max_scroll_column(num_columns);\n let cidx = scroll_index_offset,\n virtual_width = 0;\n\n while (cidx < max_scroll_column + scroll_index_offset) {\n virtual_width += this._column_sizes.indices[cidx] || 60;\n cidx++;\n }\n\n if (cidx < this._column_sizes.indices.length) {\n let viewport_width = 0;\n const rhLen = this._view_cache.row_headers_length;\n for (\n let i = 0;\n i < rhLen && i < this._column_sizes.indices.length;\n i++\n ) {\n viewport_width += this._column_sizes.indices[i] || 0;\n }\n virtual_width += Math.max(\n 0,\n (this._column_sizes.indices[cidx] || 0) -\n (this._container_size.width - (viewport_width || 0)) || 0,\n );\n }\n\n return virtual_width;\n }\n}\n\nasync function internal_draw(\n this: RegularVirtualTableViewModel,\n options: DrawOptions,\n): Promise<void> {\n const __debug_start_time__ = DEBUG && performance.now();\n if (!options.cache) {\n this.table_model._resetDimState();\n }\n\n const { invalid_viewport = true, preserve_width = false } = options;\n const {\n num_columns,\n num_rows,\n num_row_headers,\n num_column_headers,\n row_height,\n } = await this.table_model._getDimState(this._view_cache);\n\n this._column_sizes.row_height = row_height || this._column_sizes.row_height;\n if (!this._column_sizes.row_height) {\n this._probe_row_height();\n }\n\n if (num_row_headers !== undefined) {\n this._view_cache.row_headers_length = num_row_headers;\n }\n\n if (num_column_headers !== undefined) {\n this._view_cache.column_headers_length = num_column_headers;\n }\n\n // Cache virtual mode checks and default values\n const is_non_vertical =\n this._virtual_mode === \"none\" || this._virtual_mode === \"horizontal\";\n\n const is_non_horizontal =\n this._virtual_mode === \"none\" || this._virtual_mode === \"vertical\";\n\n const safe_num_rows = num_rows || 0;\n const safe_num_columns = num_columns || 0;\n this._container_size = {\n width: is_non_horizontal ? Infinity : this._table_clip.clientWidth,\n height: is_non_vertical ? Infinity : this._table_clip.clientHeight,\n containerHeight: is_non_vertical ? Infinity : this.clientHeight,\n };\n\n this._update_virtual_panel_height(safe_num_rows);\n if (!preserve_width) {\n this._update_virtual_panel_width(invalid_viewport, safe_num_columns);\n }\n\n const viewport = this._calculate_viewport(safe_num_rows, safe_num_columns);\n const { invalid_row, invalid_column } = this._validate_viewport(viewport);\n const invalid_schema_or_column = this._invalid_schema || invalid_column;\n if (invalid_schema_or_column || invalid_row || invalid_viewport) {\n let first_iteration = true;\n await this.table_model.draw(\n this._container_size,\n this._view_cache,\n this._selected_id,\n preserve_width,\n viewport,\n safe_num_columns,\n async (last_cells) => {\n // We want to perform this before the next event loop so there\n // is no scroll jitter, but only on the first iteration as\n // subsequent viewports are incorrect.\n if (first_iteration) {\n this._update_sub_cell_offset(viewport, last_cells);\n first_iteration = false;\n }\n\n for (const callback of this._style_callbacks) {\n await callback({ detail: this as RegularTableElement });\n }\n },\n );\n\n const old_height = this._column_sizes.row_height;\n this.table_model.header.reset_header_cache();\n if (old_height !== this._column_sizes.row_height) {\n this._update_virtual_panel_height(safe_num_rows);\n }\n\n if (!preserve_width) {\n this._update_virtual_panel_width(\n invalid_schema_or_column,\n safe_num_columns,\n );\n }\n\n this._invalid_schema = false;\n } else {\n this._update_sub_cell_offset(viewport);\n }\n\n if (DEBUG) {\n log_perf(performance.now() - __debug_start_time__);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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, CellMetadataBuilder, ColumnSizes } from \"./types\";\n\n// Singleton `WeakMap`s to store metadata for td/th elements, as well as the\n// datagrids themselves for each `<perspective-viewer>`\nexport const METADATA_MAP: WeakMap<HTMLElement, CellMetadata> = new WeakMap();\n\n/******************************************************************************\n *\n * View Model\n *\n */\n\nclass ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n reset() {\n this._index = 0;\n }\n\n get() {\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 class ViewModel {\n protected _column_sizes: ColumnSizes;\n protected _container: HTMLElement;\n public _span_factory: ElemFactory;\n public table: HTMLElement;\n public cells: (HTMLTableCellElement | undefined)[][];\n public rows: HTMLTableRowElement[];\n\n constructor(\n column_sizes: ColumnSizes,\n container: HTMLElement,\n table: HTMLElement,\n ) {\n this._column_sizes = column_sizes;\n this._container = container;\n this._span_factory = new ElemFactory(\"span\");\n this.table = table;\n this.cells = [];\n this.rows = [];\n }\n\n num_columns(): number {\n return this._get_row(Math.max(0, this.rows.length - 1)).row_container\n .length;\n }\n\n num_rows(): number {\n return this.cells.length;\n }\n\n _set_metadata(td: HTMLTableCellElement, metadata: CellMetadata): void {\n METADATA_MAP.set(td, metadata);\n }\n\n _get_or_create_metadata(\n td: HTMLTableCellElement | undefined,\n ): CellMetadataBuilder {\n if (!td) {\n return { value: undefined } as CellMetadataBuilder;\n }\n\n let metadata = METADATA_MAP.get(td);\n if (!metadata) {\n metadata = { value: undefined } as CellMetadata;\n METADATA_MAP.set(td, metadata);\n }\n\n return metadata;\n }\n\n _replace_cell(\n ridx: number,\n cidx: number,\n ): HTMLTableCellElement | undefined {\n const { tr, row_container } = this._get_row(ridx);\n let td = row_container[cidx];\n if (td) {\n tr.removeChild(td);\n row_container.splice(cidx, 1, undefined);\n }\n return td;\n }\n\n _fetch_cell(ridx: number, cidx: number): HTMLTableCellElement | undefined {\n if (ridx < 0 || cidx < 0) {\n return;\n }\n\n return this.cells[ridx]?.[cidx];\n }\n\n _get_row(ridx: number): {\n tr: HTMLTableRowElement;\n row_container: (HTMLTableCellElement | undefined)[];\n } {\n let tr = this.rows[ridx];\n if (!tr) {\n tr = this.rows[ridx] = document.createElement(\"tr\");\n this.table.appendChild(tr);\n }\n\n let row_container = this.cells[ridx];\n if (!row_container) {\n row_container = this.cells[ridx] = [];\n }\n\n return { tr, row_container };\n }\n\n _get_cell(tag = \"TD\", ridx: number, cidx: number): HTMLTableCellElement {\n const { tr, row_container } = this._get_row(ridx);\n let td = row_container[cidx];\n if (!td) {\n if (cidx < row_container.length) {\n td = row_container[cidx] = document.createElement(\n tag,\n ) as HTMLTableCellElement;\n const nextCell = row_container.slice(cidx + 1).find((x) => x);\n tr.insertBefore(td, nextCell || null);\n } else {\n td = row_container[cidx] = document.createElement(\n tag,\n ) as HTMLTableCellElement;\n tr.appendChild(td);\n }\n }\n\n if (td.tagName !== tag) {\n const new_td = document.createElement(tag) as HTMLTableCellElement;\n tr.replaceChild(new_td, td);\n this.cells[ridx].splice(cidx, 1, new_td);\n td = new_td;\n }\n\n return td;\n }\n\n _clean_columns(cidx: number | number[]): void {\n for (let i = 0; i < this.rows.length; i++) {\n const tr = this.rows[i];\n const row_container = this.cells[i];\n row_container.length = (Array.isArray(cidx) ? cidx[i] : cidx) || 0;\n const idx = this.cells[i].filter((x) => x !== undefined).length;\n const toRemove: Element[] = [];\n for (let j = idx; j < tr.children.length; j++) {\n toRemove.push(tr.children[j]);\n }\n\n for (const node of toRemove) {\n node.remove();\n }\n }\n }\n\n _clean_rows(ridx: number): void {\n // Batch collect rows to remove, then remove all at once\n const toRemove: Element[] = [];\n for (let i = ridx; i < this.table.children.length; i++) {\n toRemove.push(this.table.children[i]);\n }\n\n for (const node of toRemove) {\n node.remove();\n }\n\n this.rows.length = ridx;\n this.cells.length = ridx;\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularVirtualTableViewModel } from \"./scroll_panel\";\nimport { throttle_tag } from \"./utils\";\nimport { CellMetadata } from \"./types\";\nimport { METADATA_MAP } from \"./view_model\";\n\n/**\n * When enabled, override iOS overscroll behavior by emulating scroll position\n * in JavaScript. This prevents \"bounce\" on edges, but it also removes scroll\n * inertia. This waspreviously enabled by default in `regular-table<=0.4.3`,\n * but this version also had bugged (exaggerated) position calculation.\n * As `0.5.0` introduces sub-cell scrolling by defualt, this is now disabled by\n * default as well.\n */\nconst IOS_DISABLE_OVERSCROLL = false;\n\n/**\n *\n *\n * @class RegularViewEventModel\n * @extends {RegularVirtualTableViewModel}\n */\nexport class RegularViewEventModel extends RegularVirtualTableViewModel {\n private _memo_scroll_top?: number;\n private _memo_scroll_left?: number;\n private _memo_touch_startY?: number;\n private _memo_touch_startX?: number;\n private _last_clicked_time?: number;\n register_listeners() {\n // // TODO see `_on_click_or_dblclick` method jsdoc\n // this.addEventListener(\"dblclick\", this._on_dblclick.bind(this));\n\n this.addEventListener(\n \"mousedown\",\n this._on_click_or_dblclick.bind(this),\n );\n this.addEventListener(\"scroll\", this._on_scroll.bind(this), {\n passive: true,\n });\n\n this._register_glitch_scroll_listeners();\n }\n\n /**\n *\n */\n async _on_scroll(event: Event) {\n event.stopPropagation();\n await this.draw({ invalid_viewport: false, cache: true });\n this.dispatchEvent(new CustomEvent<undefined>(\"regular-table-scroll\"));\n }\n\n /**\n * Modern and mobile browsers implement complex scroll behavior to\n * implement fancy touch and intertia effects; these must be intercepted\n * and disabled to achieve clean virtual scrolling in the presence of a\n * `fixed` element.\n */\n private _register_glitch_scroll_listeners() {\n this.addEventListener(\"mousewheel\", this._on_mousewheel.bind(this), {\n passive: true,\n });\n\n if (IOS_DISABLE_OVERSCROLL) {\n this.addEventListener(\"touchmove\", this._on_touchmove.bind(this));\n this.addEventListener(\n \"touchstart\",\n this._on_touchstart.bind(this),\n {\n passive: true,\n },\n );\n }\n }\n /**\n * Mousewheel must precalculate in addition to `_on_scroll` to prevent\n * visual artifacts due to scrolling \"inertia\" on modern browsers.\n *\n * @param {*} event\n */\n private _on_mousewheel(event2: Event) {\n if (!window.hasOwnProperty(\"safari\")) {\n // **** Apple\n return;\n }\n\n const event = event2 as WheelEvent;\n const { clientWidth, clientHeight, scrollTop, scrollLeft } = this;\n event.preventDefault();\n event.returnValue = false;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - clientHeight,\n );\n\n const total_scroll_width = Math.max(\n 1,\n this._virtual_panel.offsetWidth - clientWidth,\n );\n\n this.scrollTop = Math.max(\n 0,\n Math.min(total_scroll_height, scrollTop + event.deltaY),\n );\n\n this.scrollLeft = Math.max(\n 0,\n Math.min(total_scroll_width, scrollLeft + event.deltaX),\n );\n\n this._on_scroll(event);\n }\n\n /**\n * Touchmove/touchstart must precalculate in addition to `_on_scroll` to\n * prevent visual artifacts due to scrolling \"inertia\" on mobile browsers.\n * This has the unfortunate side-effect of disabling scroll intertia.\n *\n * @param {*} event\n * @returns\n */\n private _on_touchmove(event: TouchEvent) {\n event.stopPropagation();\n event.preventDefault();\n event.returnValue = false;\n const { clientWidth, clientHeight } = this;\n const total_scroll_height = Math.max(\n 1,\n this._virtual_panel.offsetHeight - clientHeight,\n );\n const total_scroll_width = Math.max(\n 1,\n this._virtual_panel.offsetWidth - clientWidth,\n );\n this.scrollTop = Math.min(\n total_scroll_height,\n (this._memo_scroll_top || 0) +\n ((this._memo_touch_startY || 0) - event.touches[0].pageY),\n );\n this.scrollLeft = Math.min(\n total_scroll_width,\n (this._memo_scroll_left || 0) +\n ((this._memo_touch_startX || 0) - event.touches[0].pageX),\n );\n this._on_scroll(event);\n }\n\n private _on_touchstart(event: TouchEvent) {\n this._memo_touch_startY = event.touches[0].pageY;\n this._memo_touch_startX = event.touches[0].pageX;\n this._memo_scroll_top = this.scrollTop;\n this._memo_scroll_left = this.scrollLeft;\n }\n\n /**\n * Handles double-click header width override reset.\n *\n * @param {*} event\n * @returns\n */\n private async _on_dblclick(event: MouseEvent) {\n let element = event.target as HTMLElement;\n const is_resize = element.classList.contains(\"rt-column-resize\");\n\n while (element.tagName !== \"TD\" && element.tagName !== \"TH\") {\n element = element.parentElement as HTMLElement;\n if (!this.contains(element)) {\n return;\n }\n }\n\n const metadata = METADATA_MAP.get(element);\n if (is_resize && metadata) {\n event.stopImmediatePropagation();\n\n // Clear column size data\n if (event.shiftKey) {\n this._column_sizes.override = {};\n this._column_sizes.auto = [];\n this._column_sizes.indices = [];\n } else {\n delete this._column_sizes.override[metadata.size_key];\n this._column_sizes.auto[metadata.size_key] = undefined;\n this._column_sizes.indices[metadata.size_key] = undefined;\n }\n\n // Update column width styles via adoptedStyleSheets\n this.table_model.updateColumnWidthStyles(\n {\n start_row: 0,\n end_row: 0,\n ...this._calculate_column_range(0),\n },\n this._view_cache.row_headers_length,\n );\n\n // Clear inline styles and clipping classes\n for (const row of event.shiftKey\n ? [\n this.table_model.header.cells[\n this.table_model.header.cells.length - 1\n ],\n ...this.table_model.body.cells,\n ]\n : this.table_model.body.cells) {\n for (const td of event.shiftKey\n ? row\n : [row[metadata.virtual_x!]]) {\n if (!td) {\n continue;\n }\n\n td.classList.remove(\"rt-cell-clip\");\n }\n }\n\n await this.draw({ cache: true });\n }\n }\n\n /**\n * Dispatches all click events to other handlers, depending on\n * `event.target`.\n *\n * @param {*} event\n * @returns\n */\n private async _on_click(event: MouseEvent) {\n if (event.button !== 0) {\n return;\n }\n\n let element = event.target as HTMLElement;\n const is_resize = element.classList.contains(\"rt-column-resize\");\n while (element.tagName !== \"TD\" && element.tagName !== \"TH\") {\n element = element.parentElement!;\n if (!this.contains(element)) {\n return;\n }\n }\n\n const metadata = METADATA_MAP.get(element);\n if (is_resize && metadata) {\n this._on_resize_column(\n event,\n element as HTMLTableCellElement,\n metadata,\n );\n event.stopImmediatePropagation();\n }\n }\n\n /**\n * `dblclick` event does not work reliably for some reason so dispatch this\n * event in JavaScript instead.\n *\n * @param {`*`} event\n */\n async _on_click_or_dblclick(event: MouseEvent) {\n const now = performance.now();\n if (this._last_clicked_time && now - this._last_clicked_time < 500) {\n this._last_clicked_time = now;\n await this._on_dblclick(event);\n } else {\n this._last_clicked_time = now;\n await this._on_click(event);\n }\n }\n\n /**\n * Regular event for column resize.\n *\n * @param {*} event\n * @param {*} element\n * @param {*} metadata\n */\n _on_resize_column(\n event: MouseEvent,\n element: HTMLTableCellElement,\n metadata: CellMetadata,\n ) {\n const { virtual_x, size_key } = metadata;\n const start = event.pageX;\n const header_x = (virtual_x || 0) + element.colSpan - 1;\n const header_element =\n this.table_model.header.get_column_header(header_x);\n const width = this._column_sizes.indices[size_key || 0] || 0;\n const move = (event: MouseEvent) =>\n throttle_tag(\n this,\n async () =>\n await this._on_resize_column_move(\n event,\n header_element,\n start,\n width,\n size_key || 0,\n header_x,\n ),\n );\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n const override_width = this._column_sizes.override[size_key || 0];\n const should_redraw =\n this._column_sizes.indices[size_key || 0] !== override_width;\n this._column_sizes.indices[size_key || 0] = override_width;\n if (should_redraw) {\n this.draw({ cache: true });\n }\n };\n\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n }\n\n /**\n * Regular event for mouse movement when resizing a column.\n *\n * @param {*} event\n * @param {*} th\n * @param {*} start\n * @param {*} width\n * @param {*} metadata\n */\n async _on_resize_column_move(\n event: MouseEvent,\n th: HTMLTableCellElement,\n start: number,\n width: number,\n size_key: number,\n virtual_x: number,\n ) {\n await new Promise(requestAnimationFrame);\n const diff = event.pageX - start;\n const override_width = Math.max(1, width + diff);\n this._column_sizes.override[size_key] = override_width;\n\n // If the column is smaller, new columns may need to be fetched, so\n // redraw, else just update the DOM widths and clipping classes.\n if (diff < 0) {\n await this.draw({\n preserve_width: true,\n throttle: false,\n cache: true,\n });\n } else {\n // Update column width styles via adoptedStyleSheets\n this.table_model.updateColumnWidthStyles(\n {\n start_row: 0,\n end_row: 0,\n ...this._calculate_column_range(0),\n },\n this._view_cache.row_headers_length,\n );\n\n // Update clipping classes for cells in this column\n const auto_width = this._column_sizes.auto[size_key] || 0;\n const should_clip = auto_width > override_width;\n\n // Update header clipping class\n th.classList.toggle(\"rt-cell-clip\", should_clip);\n\n // Update body cell clipping classes\n for (const row of this.table_model.body.cells) {\n const td = row[virtual_x];\n if (td) {\n td.classList.toggle(\"rt-cell-clip\", should_clip);\n }\n }\n }\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { ViewModel } from \"./view_model\";\nimport {\n HeaderDrawResult,\n ColumnSizes,\n CellMetadata,\n CellScalar,\n CellMetadataRowHeader,\n CellMetadataColumnHeader,\n CellMetadataBuilder,\n} from \"./types\";\n\n/**\n * <thead> view model. This model accumulates state in the form of\n * column_sizes, which leverages <tables> autosize behavior across\n * virtual pages.\n *\n * @class RegularHeaderViewModel\n */\nexport class RegularHeaderViewModel extends ViewModel {\n private _group_header_cache: [\n CellMetadataBuilder,\n HTMLTableCellElement,\n number,\n ][];\n private _offset_cache: number[];\n\n constructor(\n column_sizes: ColumnSizes,\n container: HTMLElement,\n table: HTMLElement,\n ) {\n super(column_sizes, container, table);\n this._group_header_cache = [];\n this._offset_cache = [];\n }\n\n _draw_group_th(\n offset_cache: number[],\n d: number,\n column: unknown,\n ): HTMLTableCellElement {\n const th = this._get_cell(\"TH\", d, offset_cache[d] || 0);\n offset_cache[d] += 1;\n th.removeAttribute(\"colspan\");\n th.textContent = \"\";\n if (column instanceof HTMLElement) {\n th.appendChild(column);\n } else {\n const span = this._span_factory.get();\n span.textContent = String(column ?? \"\");\n th.appendChild(span);\n }\n\n const resizeSpan = this._span_factory.get();\n resizeSpan.className = \"rt-column-resize\";\n th.appendChild(resizeSpan);\n return th;\n }\n\n _draw_group(\n column: CellScalar[],\n column_name: unknown,\n th: HTMLTableCellElement,\n ): CellMetadataBuilder {\n const metadata = this._get_or_create_metadata(th);\n metadata.column_header = column;\n metadata.value = column_name;\n return metadata;\n }\n\n _draw_th(\n column: CellScalar[],\n column_name: unknown,\n th: HTMLTableCellElement,\n size_key: number | number[],\n ): CellMetadataBuilder {\n const metadata = this._get_or_create_metadata(th);\n metadata.column_header = column;\n metadata.value = column_name;\n metadata.size_key = Array.isArray(size_key) ? size_key[0] : size_key;\n if (!Array.isArray(size_key) || size_key.length <= 1) {\n const override_width =\n this._column_sizes.override[metadata.size_key || 0];\n const auto_width =\n this._column_sizes.auto[metadata.size_key || 0] || 0;\n\n // Handle clipping class for overridden columns\n if (override_width) {\n th.classList.toggle(\n \"rt-cell-clip\",\n auto_width > override_width,\n );\n } else {\n th.classList.remove(\"rt-cell-clip\");\n }\n }\n\n return metadata;\n }\n\n get_column_header(cidx: number): HTMLTableCellElement {\n return this._get_cell(\"TH\", this.num_rows() - 1, cidx);\n }\n\n draw(\n alias: CellScalar[],\n parts: CellScalar[],\n colspan: number | undefined,\n x: number | undefined,\n size_key: number | number[],\n x0: number,\n _virtual_x: number,\n column_header_merge_depth: number | undefined,\n merge_headers: boolean,\n ): HeaderDrawResult | undefined {\n const header_levels = parts?.length; //config.column_pivots.length + 1;\n if (header_levels === 0) {\n return;\n }\n\n let th: HTMLTableCellElement | undefined;\n let metadata: CellMetadataBuilder | undefined;\n let column_name: unknown;\n let output: HeaderDrawResult | undefined = undefined;\n column_header_merge_depth =\n typeof column_header_merge_depth === \"undefined\"\n ? header_levels - 1\n : column_header_merge_depth;\n for (let d = 0; d < header_levels; d++) {\n column_name = parts[d] ? parts[d] : \"\";\n this._offset_cache[d] = this._offset_cache[d] || 0;\n\n if (d < column_header_merge_depth) {\n if (\n merge_headers &&\n this._group_header_cache?.[d]?.[0]?.value === column_name\n ) {\n th = this._group_header_cache[d][1];\n this._group_header_cache[d][2] += 1;\n if (colspan === 1) {\n this._group_header_cache[d][0].row_header_x =\n Array.isArray(size_key) ? size_key[0] : size_key;\n }\n th.setAttribute(\n \"colspan\",\n String(this._group_header_cache[d][2]),\n );\n } else {\n th = this._draw_group_th(\n this._offset_cache,\n d,\n column_name,\n );\n metadata = this._draw_group(parts, column_name, th);\n this._group_header_cache[d] = [metadata, th, 1];\n }\n } else {\n th = this._draw_group_th(this._offset_cache, d, column_name);\n\n // Update the group header's metadata such that each group\n // header has the same metadata coordinates of its rightmost\n // column.\n metadata = this._draw_th(\n alias.length > 0 ? alias : parts,\n column_name,\n th,\n size_key,\n );\n\n if (typeof output === \"undefined\") {\n output = { th, metadata } as {\n th: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n\n for (const [group_meta] of this._group_header_cache) {\n group_meta.size_key = metadata.size_key;\n }\n\n th.removeAttribute(\"colspan\");\n }\n\n this._get_row(d).tr.classList.toggle(\n \"rt-autosize\",\n d === column_header_merge_depth,\n );\n\n th.classList.toggle(\"rt-group-corner\", x === undefined);\n if (metadata) {\n metadata.x = typeof x === \"undefined\" ? x : Math.floor(x);\n metadata.column_header_y = d;\n metadata.x0 = Math.floor(x0);\n metadata.virtual_x = _virtual_x;\n if (colspan === 1) {\n metadata.type = \"corner\";\n metadata.row_header_x = Array.isArray(size_key)\n ? size_key[0]\n : size_key;\n } else {\n metadata.type = \"column_header\";\n delete metadata.row_header_x;\n }\n }\n }\n\n this._clean_rows(this._offset_cache.length);\n output =\n output ||\n ({ th: th!, metadata: metadata! } as {\n th: HTMLTableCellElement;\n metadata: CellMetadata;\n });\n return output;\n }\n\n clean(): void {\n this._clean_columns(this._offset_cache);\n }\n\n reset_header_cache(): void {\n this._offset_cache = [];\n this._group_header_cache = [];\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 BodyDrawResult,\n CellMetadata,\n CellMetadataBuilder,\n CellScalar,\n ColumnState,\n ViewState,\n} from \"./types\";\nimport { ViewModel } from \"./view_model\";\n\n/**\n * <tbody> view model.\n *\n * @class RegularBodyViewModel\n */\nexport class RegularBodyViewModel extends ViewModel {\n _draw_td(\n tagName: string,\n ridx: number,\n val: unknown,\n cidx: number,\n { column_name }: ColumnState,\n { ridx_offset }: ViewState,\n size_key: number,\n ): { td: HTMLTableCellElement; metadata: CellMetadataBuilder } {\n const td = this._get_cell(tagName, ridx, cidx);\n const metadata = this._get_or_create_metadata(td);\n metadata.y = ridx + Math.floor(ridx_offset);\n const key = (metadata.size_key = size_key || 0);\n if (tagName === \"TD\") {\n metadata.column_header = column_name;\n }\n\n // Handle clipping class for overridden columns\n const override_width = this._column_sizes.override[key];\n if (override_width) {\n const auto_width = this._column_sizes.auto[key] || 0;\n const clip = auto_width > override_width;\n if (td.classList.contains(\"rt-cell-clip\") !== clip) {\n td.classList.toggle(\"rt-cell-clip\", clip);\n }\n } else {\n td.classList.remove(\"rt-cell-clip\");\n }\n\n if (metadata.value !== val) {\n if (val instanceof HTMLElement) {\n td.textContent = \"\";\n td.appendChild(val);\n } else {\n td.textContent = String(val ?? \"\");\n }\n }\n\n metadata.value = val;\n return { td, metadata };\n }\n\n draw<T extends CellScalar | CellScalar[]>(\n container_height: number,\n column_state: ColumnState<T>,\n view_state: ViewState,\n th: boolean = false,\n x?: number,\n x0?: number,\n size_key?: number,\n merge_headers?: boolean,\n ): BodyDrawResult {\n const {\n cidx,\n column_data,\n row_headers,\n column_data_listener_metadata,\n } = column_state;\n let { row_height } = view_state;\n let metadata: CellMetadataBuilder | undefined;\n const ridx_offset: number[] = [];\n const tds: Array<{ td: HTMLTableCellElement; metadata: CellMetadata }> =\n [];\n let ridx = 0;\n const cidx_offset: number[] = [];\n const loops = th ? (view_state.row_headers_length ?? 1) : 1;\n const y0_floor = Math.floor(view_state.ridx_offset);\n const y1_ceil = Math.ceil(view_state.y1);\n const x1_ceil = Math.ceil(view_state.x1);\n const x_floor = x === undefined ? x : Math.floor(x);\n const x0_floor = x0 === undefined ? undefined : Math.floor(x0);\n const dx = Math.floor((x ?? 0) - (x0 ?? 0));\n\n for (let i = 0; i < loops; i++) {\n ridx = 0;\n const cidx_i = cidx + i;\n\n for (const val of column_data) {\n let obj:\n | {\n td: HTMLTableCellElement;\n metadata: CellMetadataBuilder;\n }\n | undefined;\n if (th) {\n const valArray = val as CellScalar[];\n const row_header = valArray[i];\n const ridx_off_i = ridx_offset[i] || 1;\n const prev_row = this._fetch_cell(\n ridx - ridx_off_i,\n cidx_i,\n );\n\n const prev_row_metadata =\n this._get_or_create_metadata(prev_row);\n\n const cidx_off_ridx = cidx_offset[ridx] || 1;\n const prev_col = this._fetch_cell(\n ridx,\n cidx_i - cidx_off_ridx,\n );\n const prev_col_metadata =\n this._get_or_create_metadata(prev_col);\n\n if (\n merge_headers &&\n prev_col &&\n (prev_col_metadata.value === row_header ||\n row_header === undefined) &&\n !prev_col.hasAttribute(\"rowspan\")\n ) {\n const offset = (cidx_offset[ridx] = cidx_off_ridx + 1);\n prev_col.setAttribute(\"colspan\", String(offset));\n this._replace_cell(ridx, cidx_i);\n } else if (\n merge_headers &&\n prev_row &&\n prev_row_metadata.value === row_header &&\n !prev_row.hasAttribute(\"colspan\")\n ) {\n const offset = (ridx_offset[i] = ridx_off_i + 1);\n prev_row.setAttribute(\"rowspan\", String(offset));\n this._replace_cell(ridx, cidx_i);\n } else {\n obj = this._draw_td(\n \"TH\",\n ridx,\n row_header,\n cidx_i,\n column_state as ColumnState<CellScalar>,\n view_state,\n i,\n );\n\n const td = obj.td;\n const meta = obj.metadata;\n td.style.display = \"\";\n td.removeAttribute(\"rowspan\");\n td.removeAttribute(\"colspan\");\n meta.type = \"row_header\";\n meta.row_header = valArray;\n meta.row_header_x = i;\n meta.y0 = y0_floor;\n meta.y1 = y1_ceil;\n meta.virtual_x = i;\n if (x0_floor !== undefined) {\n meta.x0 = x0_floor;\n }\n ridx_offset[i] = 1;\n cidx_offset[ridx] = 1;\n tds[i] = obj as {\n td: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n } else {\n obj = this._draw_td(\n \"TD\",\n ridx,\n val,\n cidx,\n column_state as ColumnState<CellScalar>,\n view_state,\n size_key ?? 0,\n );\n const meta = obj.metadata;\n if (column_data_listener_metadata) {\n meta.user = column_data_listener_metadata[ridx];\n }\n\n meta.type = \"body\";\n meta.x = x_floor || 0;\n meta.x1 = x1_ceil;\n meta.row_header = row_headers?.[ridx] || [];\n meta.y0 = y0_floor;\n meta.y1 = y1_ceil;\n meta.dx = dx;\n meta.dy = (meta.y ?? 0) - y0_floor;\n meta.virtual_x = cidx;\n if (x0_floor !== undefined) {\n meta.x0 = x0_floor;\n }\n\n tds[0] = obj as {\n td: HTMLTableCellElement;\n metadata: CellMetadata;\n };\n }\n\n ridx++;\n metadata = obj ? obj.metadata : metadata;\n row_height = row_height || obj?.td.offsetHeight;\n if (ridx * (row_height ?? 0) > container_height) {\n break;\n }\n }\n }\n this._clean_rows(ridx);\n return { tds, ridx, row_height };\n }\n\n clean({ ridx, cidx }: { ridx: number; cidx: number }): void {\n this._clean_rows(ridx);\n this._clean_columns(cidx);\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularHeaderViewModel } from \"./thead\";\nimport { RegularBodyViewModel } from \"./tbody\";\nimport {\n BodyDrawResult,\n CellScalar,\n CellTuple,\n CellMetadata,\n ColumnState,\n DataColumnDrawResult,\n FetchResult,\n RowHeadersResult,\n ViewCache,\n ViewFunction,\n Viewport,\n DataResponse,\n ViewState,\n} from \"./types\";\nimport { ColumnSizes } from \"./types\";\n\n/**\n * Base class containing protected helper methods for table rendering.\n * This class provides the internal implementation details for drawing\n * and managing table view state.\n *\n * @class RegularTableViewModelBase\n */\nabstract class RegularTableViewModelBase {\n public _column_sizes!: ColumnSizes;\n public _row_headers_length: number = 0;\n public header!: RegularHeaderViewModel;\n public body!: RegularBodyViewModel;\n\n /**\n * Initializes view state with viewport and sizing information.\n */\n protected _initializeViewState(\n viewport: Viewport,\n selected_id: number | undefined,\n ): ViewState {\n const {\n start_row: ridx_offset = 0,\n start_col: x0 = 0,\n end_col: x1 = 0,\n end_row: y1 = 0,\n } = viewport;\n\n const sub_cell_offset =\n this._column_sizes.indices[\n (this._row_headers_length || 0) + Math.floor(viewport.start_col)\n ] ?? 0;\n\n return {\n viewport_width: 0,\n selected_id,\n ridx_offset,\n sub_cell_offset,\n x0: x0,\n x1: x1,\n y1: y1,\n row_height: this._column_sizes.row_height,\n row_headers_length: this._row_headers_length,\n };\n }\n\n /**\n * Draws row headers and returns updated state.\n */\n protected _drawRowHeaders(\n row_headers: CellScalar[][],\n row_headers_length: number,\n column_headers_length: number,\n container_height: number,\n view_state: ViewState,\n preserve_width: boolean,\n x0: number,\n column_header_merge_depth: number | undefined,\n merge_column_headers: boolean,\n merge_row_headers: boolean,\n ): RowHeadersResult {\n const column_name = [`${row_headers_length}`];\n const last_cells: CellTuple[] = [];\n\n const column_state: ColumnState<CellScalar[]> = {\n column_name,\n cidx: 0,\n column_data: row_headers,\n row_headers,\n first_col: true,\n };\n\n const size_key = Math.floor(x0);\n const cont_body = this.body.draw(\n container_height,\n column_state,\n { ...view_state, x0: 0 },\n true,\n undefined,\n undefined,\n size_key,\n merge_row_headers,\n );\n\n const cont_heads = [];\n for (let i = 0; i < row_headers_length; i++) {\n const header = this.header.draw(\n column_name,\n Array(column_headers_length).fill(\"\"),\n 1,\n undefined,\n i,\n x0,\n i,\n column_header_merge_depth,\n merge_column_headers,\n );\n if (!!header) {\n cont_heads.push(header);\n }\n }\n\n for (let i = 0; i < cont_heads.length; i++) {\n const { th } = cont_heads[i];\n view_state.viewport_width +=\n this._column_sizes.indices[i] || th.offsetWidth;\n }\n view_state.row_height = view_state.row_height || cont_body.row_height;\n\n const _virtual_x = row_headers[0].length;\n\n if (!preserve_width) {\n for (let i = 0; i < row_headers_length; i++) {\n const { td, metadata } = cont_body.tds[i] || {};\n const { th, metadata: hmetadata } = cont_heads[i] || {};\n if (!!td || !!th) {\n last_cells.push([th || td, hmetadata || metadata]);\n }\n }\n }\n\n return { cont_body, first_col: false, _virtual_x, last_cells };\n }\n\n /**\n * Calculates how many additional columns are needed to fill the viewport.\n */\n protected _calculateViewportExtension(\n viewport: Viewport,\n view_state: ViewState,\n container_width: number,\n num_columns: number,\n _virtual_x: number,\n x0: number,\n ): void {\n let end_col_offset = 0,\n size_extension = 0;\n\n while (\n this._column_sizes.indices.length >\n _virtual_x + x0 + end_col_offset + 1 &&\n size_extension + view_state.viewport_width < container_width\n ) {\n end_col_offset++;\n size_extension +=\n this._column_sizes.indices[_virtual_x + x0 + end_col_offset] ||\n 0;\n }\n\n if (size_extension + view_state.viewport_width < container_width) {\n const estimate = Math.min(num_columns, viewport.start_col + 5);\n viewport.end_col = Math.max(1, Math.min(num_columns, estimate));\n } else {\n viewport.end_col = Math.max(\n 1,\n Math.min(num_columns, viewport.start_col + end_col_offset),\n );\n }\n }\n\n /**\n * Draws a single data column and returns rendering information.\n */\n protected _drawDataColumn(\n dcidx: number,\n view_response: DataResponse,\n _virtual_x: number,\n x0: number,\n container_height: number,\n view_state: ViewState,\n first_col: boolean,\n column_header_merge_depth: number | undefined,\n merge_column_headers: boolean,\n merge_row_headers: boolean,\n ): DataColumnDrawResult {\n const column_name = view_response.column_headers?.[dcidx] || [];\n const column_data = view_response.data[dcidx];\n const column_data_listener_metadata = view_response.metadata?.[dcidx];\n const column_state: ColumnState = {\n column_name,\n cidx: _virtual_x,\n column_data,\n column_data_listener_metadata,\n row_headers: view_response.row_headers,\n first_col,\n };\n\n const x = dcidx + x0;\n const size_key = _virtual_x + Math.floor(x0);\n const cont_head = this.header.draw(\n column_name,\n column_name,\n undefined,\n x,\n size_key,\n x0,\n _virtual_x,\n column_header_merge_depth,\n merge_column_headers,\n );\n\n const cont_body = this.body.draw(\n container_height,\n column_state,\n view_state,\n false,\n x,\n x0,\n size_key,\n merge_row_headers,\n );\n\n return { cont_head, cont_body };\n }\n\n /**\n * Fetches additional columns when data is missing during rendering.\n */\n protected async _fetchMissingColumns(\n viewport: Viewport,\n view: ViewFunction,\n view_response: DataResponse,\n dcidx: number,\n view_state: ViewState,\n container_width: number,\n num_columns: number,\n _virtual_x: number,\n x0: number,\n ): Promise<FetchResult> {\n let missing_cidx = Math.max(dcidx + Math.floor(x0), 0);\n const new_viewport = structuredClone(viewport);\n new_viewport.start_col = missing_cidx;\n this._calculateViewportExtension(\n new_viewport,\n view_state,\n container_width,\n num_columns,\n _virtual_x,\n x0,\n );\n\n const new_col = await view(\n Math.floor(new_viewport.start_col),\n Math.floor(new_viewport.start_row),\n Math.ceil(new_viewport.end_col),\n Math.ceil(new_viewport.end_row),\n );\n\n let column_header_merge_depth: number | undefined;\n let merge_headers: \"both\" | \"row\" | \"column\" | undefined;\n\n if (typeof new_col.column_header_merge_depth !== \"undefined\") {\n column_header_merge_depth = new_col.column_header_merge_depth;\n }\n\n if (typeof new_col.merge_headers !== \"undefined\") {\n merge_headers = new_col.merge_headers;\n }\n\n if (new_col.data.length === 0) {\n return { column_header_merge_depth, merge_headers };\n }\n\n viewport.end_col = new_viewport.start_col + new_col.data.length;\n for (let i = 0; i < new_col.data.length; i++) {\n view_response.data[dcidx + i] = new_col.data[i];\n if (new_col.metadata && view_response.metadata) {\n view_response.metadata[dcidx + i] = new_col.metadata[i];\n }\n\n if (view_response.column_headers && new_col.column_headers?.[i]) {\n view_response.column_headers[dcidx + i] =\n new_col.column_headers[i];\n }\n }\n\n return { column_header_merge_depth, merge_headers };\n }\n\n /**\n * Cleans up body and header after drawing.\n */\n protected _cleanupAfterDraw(\n cont_body: BodyDrawResult | undefined,\n _virtual_x: number,\n ): void {\n this.body.clean({ ridx: cont_body?.ridx || 0, cidx: _virtual_x });\n this.header.clean();\n }\n\n protected _carriageReturn() {\n this.body._span_factory.reset();\n this.header._span_factory.reset();\n }\n}\n\n/**\n * <table> view model. In order to handle unknown column width when `draw()`\n * is called, this model will iteratively fetch more data to fill in columns\n * until the page is complete, and makes some column viewport estimations\n * when this information is not availble.\n *\n * @class RegularTableViewModel\n */\nexport class RegularTableViewModel extends RegularTableViewModelBase {\n public table: HTMLTableElement;\n private _columnWidthStyleSheet?: CSSStyleSheet;\n private _lastColumnWidthCss?: string;\n private _lastDataResponse?: DataResponse;\n private _lastViewport?: Viewport;\n\n constructor(\n table_clip: HTMLElement,\n column_sizes: ColumnSizes,\n element: HTMLElement,\n ) {\n super();\n this._column_sizes = column_sizes;\n this.clear(element);\n const [table] = element.children as HTMLCollectionOf<HTMLTableElement>;\n const [thead, tbody] =\n table.children as HTMLCollectionOf<HTMLTableSectionElement>;\n\n this.table = table;\n this.header = new RegularHeaderViewModel(\n column_sizes,\n table_clip,\n thead,\n );\n\n this.body = new RegularBodyViewModel(column_sizes, table_clip, tbody);\n }\n\n num_columns(): number {\n return this.header.num_columns();\n }\n\n clear(element: HTMLElement): void {\n element.innerHTML =\n '<table cellspacing=\"0\"><thead></thead><tbody></tbody></table>';\n }\n\n /**\n * Calculate amendments to auto size from this render pass.\n * Uses adoptedStyleSheets with :nth-child selectors for optimal performance.\n *\n * This method separates DOM reads (getBoundingClientRect) from DOM writes\n * (CSS stylesheet updates) to minimize forced reflows. All measurements are\n * collected first, then column size data is updated, and finally all column\n * widths (both auto and override) are applied via a single stylesheet update.\n */\n autosize_cells(\n last_cells: CellTuple[],\n override_row_height?: number,\n ): void {\n const zoom = this.table.currentCSSZoom ?? 1;\n const measurements: Array<{\n cell: HTMLElement;\n metadata: CellMetadata | undefined;\n box: DOMRect;\n }> = [];\n\n for (const [cell, metadata] of last_cells) {\n const box = cell.getBoundingClientRect();\n measurements.push({ cell, metadata, box });\n }\n\n for (const { metadata, box } of measurements) {\n this._column_sizes.row_height =\n override_row_height ??\n Math.max(\n 10,\n Math.min(\n this._column_sizes.row_height ?? box.height / zoom,\n box.height / zoom,\n ),\n );\n\n if (metadata?.size_key !== undefined) {\n this._column_sizes.indices[metadata.size_key] =\n box.width / zoom;\n if (\n box.width / zoom &&\n this._column_sizes.override[metadata.size_key] === undefined\n ) {\n this._column_sizes.auto[metadata.size_key] =\n box.width / zoom;\n }\n }\n }\n }\n\n /**\n * Updates column width styles for all columns using adoptedStyleSheets.\n * Generates CSS rules with :nth-child selectors for both auto-sized and\n * overridden column widths, applying them all in a single stylesheet update.\n *\n * This method should be called whenever column sizes change, including:\n * - After autosize_cells() measurements\n * - When user resizes columns\n * - When resetAutoSize() is called\n */\n updateColumnWidthStyles(\n viewport: Viewport,\n row_headers_length: number,\n ): void {\n const cssRules: string[] = [];\n\n let row_headers_size_key;\n for (\n row_headers_size_key = 0;\n row_headers_size_key < row_headers_length;\n row_headers_size_key++\n ) {\n const override_width =\n this._column_sizes.override[row_headers_size_key];\n const auto_width = this._column_sizes.auto[row_headers_size_key];\n if (override_width !== undefined) {\n // Override width takes precedence\n // CSS :nth-child is 1-indexed\n const columnIndex = row_headers_size_key + 1; // - Math.floor(viewport.start_col);\n\n // Work backwards to handle colspan/rowspan missing elements in\n // `row_headers`.\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody th.rt-cell-clip:nth-last-of-type(${row_headers_length - row_headers_size_key})`,\n `{min-width:${override_width}px;max-width:${override_width}px;}`,\n );\n } else if (auto_width !== undefined) {\n // Auto width applies when no override\n const columnIndex = row_headers_size_key + 1; // - Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody th.rt-cell-clip:nth-last-of-type(${row_headers_length - row_headers_size_key})`,\n `{min-width:${auto_width}px;}`,\n );\n }\n }\n\n for (\n let size_key = row_headers_size_key;\n size_key <\n row_headers_size_key +\n (Math.floor(viewport.end_col) - Math.floor(viewport.start_col));\n size_key++\n ) {\n const override_width =\n this._column_sizes.override[\n size_key + Math.floor(viewport.start_col)\n ];\n const auto_width =\n this._column_sizes.auto[\n size_key + Math.floor(viewport.start_col)\n ];\n\n if (override_width !== undefined) {\n // Override width takes precedence\n // CSS :nth-child is 1-indexed\n const columnIndex = size_key + 1; // Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-of-type(${columnIndex - row_headers_size_key})`,\n `{min-width:${override_width}px;max-width:${override_width}px;}`,\n );\n } else if (auto_width !== undefined) {\n // Auto width applies when no override\n const columnIndex = size_key + 1; // Math.floor(viewport.start_col);\n cssRules.push(\n `thead tr.rt-autosize th:nth-of-type(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-of-type(${columnIndex - row_headers_size_key})`,\n `{min-width:${auto_width}px;}`,\n );\n }\n }\n\n // Apply all rules via single stylesheet update\n if (cssRules.length > 0) {\n this._applyColumnWidthStyles(cssRules.join(\"\\n\"));\n } else if (this._columnWidthStyleSheet) {\n this._columnWidthStyleSheet.replaceSync(\"\");\n }\n }\n\n /**\n * Applies column width styles using adoptedStyleSheets.\n * Creates or updates a dedicated stylesheet for column widths.\n * Caches the CSS string to avoid redundant replaceSync calls.\n */\n private _applyColumnWidthStyles(css: string): void {\n if (css === this._lastColumnWidthCss) {\n return;\n }\n\n const shadowRoot = this.table.getRootNode() as ShadowRoot;\n if (!shadowRoot || !shadowRoot.adoptedStyleSheets) {\n return;\n }\n\n // Find or create the column width stylesheet\n if (!this._columnWidthStyleSheet) {\n this._columnWidthStyleSheet = new CSSStyleSheet();\n shadowRoot.adoptedStyleSheets = [\n ...shadowRoot.adoptedStyleSheets,\n this._columnWidthStyleSheet,\n ];\n }\n\n this._columnWidthStyleSheet.replaceSync(css);\n this._lastColumnWidthCss = css;\n }\n\n async _getDimState(view_cache: ViewCache): Promise<DataResponse> {\n if (!this._lastDataResponse) {\n return await view_cache.view(0, 0, 0, 0);\n }\n\n return this._lastDataResponse!;\n }\n\n _resetDimState() {\n this._lastDataResponse = undefined;\n this._lastViewport = undefined;\n }\n\n async draw(\n container_size: { width: number; height: number },\n view_cache: ViewCache,\n selected_id: number | undefined,\n preserve_width: boolean,\n viewport: Viewport,\n num_columns: number,\n style_callback: (last_cells: CellTuple) => Promise<undefined>,\n ): Promise<undefined> {\n const { width: container_width, height: container_height } =\n container_size;\n\n // Fetch and prepare initial data\n const view_response = (this._lastDataResponse = await view_cache.view(\n Math.floor(viewport.start_col),\n Math.floor(viewport.start_row),\n Math.ceil(viewport.end_col),\n Math.ceil(viewport.end_row),\n ));\n\n let { column_header_merge_depth, merge_headers = \"both\" } =\n view_response;\n\n const merge_row_headers =\n merge_headers === \"both\" || merge_headers === \"row\";\n const merge_column_headers =\n merge_headers === \"both\" || merge_headers === \"column\";\n const x0 = viewport.start_col ?? 0;\n\n if (view_response.row_headers) {\n let maxLen = 0;\n for (const rh of view_response.row_headers) {\n if (rh.length > maxLen) maxLen = rh.length;\n }\n this._row_headers_length = maxLen;\n\n for (let i = 0; i < view_response.row_headers.length; i++) {\n view_response.row_headers[i].length =\n this._row_headers_length || 0;\n }\n }\n\n // Update view cache lengths\n view_cache.row_headers_length =\n view_response.num_row_headers ??\n view_response.row_headers?.[0]?.length ??\n 0;\n\n view_cache.column_headers_length =\n view_response.num_column_headers ??\n view_response.column_headers?.[0]?.length ??\n 0;\n\n const { view, row_headers_length, column_headers_length } = view_cache;\n const view_state = this._initializeViewState(viewport, selected_id);\n\n // Draw row headers\n let cont_body: BodyDrawResult | undefined;\n let _virtual_x = 0;\n let last_cells: CellTuple[] = [];\n let first_col = true;\n\n if (view_response.row_headers?.length) {\n const row_header_result = this._drawRowHeaders(\n view_response.row_headers,\n row_headers_length,\n column_headers_length,\n container_height,\n view_state,\n preserve_width,\n x0,\n column_header_merge_depth,\n merge_column_headers,\n merge_row_headers,\n );\n cont_body = row_header_result.cont_body;\n first_col = row_header_result.first_col;\n _virtual_x = row_header_result._virtual_x;\n last_cells = row_header_result.last_cells;\n }\n\n // Draw data columns\n try {\n let dcidx = 0;\n const num_visible_columns = num_columns - viewport.start_col;\n\n while (dcidx < num_visible_columns) {\n // Fetch missing columns if needed\n if (!view_response.data[dcidx]) {\n // Style the partially-renderd rows so there is no FOUT\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n const fetch_result = await this._fetchMissingColumns(\n viewport,\n view,\n view_response,\n dcidx,\n view_state,\n container_width,\n num_columns,\n _virtual_x,\n x0,\n );\n\n if (fetch_result.column_header_merge_depth !== undefined) {\n column_header_merge_depth =\n fetch_result.column_header_merge_depth;\n }\n\n if (fetch_result.merge_headers !== undefined) {\n merge_headers = fetch_result.merge_headers;\n }\n\n if (!view_response.data[dcidx]) {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this._carriageReturn();\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(\n last_cells[this._row_headers_length],\n );\n\n this.autosize_cells(\n last_cells,\n this._column_sizes.row_height,\n );\n\n return;\n }\n }\n\n // Draw column\n const { cont_head, cont_body: drawn_body } =\n this._drawDataColumn(\n dcidx,\n view_response,\n _virtual_x,\n x0,\n container_height,\n view_state,\n first_col,\n column_header_merge_depth,\n merge_column_headers,\n merge_row_headers,\n );\n\n cont_body = drawn_body;\n first_col = false;\n\n // Collect cells for autosizing\n if (!preserve_width) {\n for (const { td, metadata } of cont_body.tds) {\n last_cells.push([\n cont_head?.th || td,\n cont_head?.metadata || metadata,\n ]);\n }\n }\n\n // Update dimensions\n let col_width =\n this._column_sizes.indices[_virtual_x + Math.floor(x0)] ||\n cont_head?.th?.offsetWidth;\n\n if (!col_width) {\n col_width = 0;\n for (const { td } of cont_body.tds) {\n col_width += td?.offsetWidth || 0;\n }\n }\n\n view_state.viewport_width += col_width;\n view_state.row_height =\n view_state.row_height || cont_body.row_height;\n\n _virtual_x++;\n dcidx++;\n\n // Check if viewport filled\n if (this._isViewportFilled(view_state, container_width)) {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n\n // Recalculate after style listeners\n view_state.viewport_width = 0;\n this.autosize_cells(\n last_cells,\n this._column_sizes.row_height,\n );\n\n for (let i = 0; i < last_cells.length; i++) {\n view_state.viewport_width +=\n this._column_sizes.indices[Math.floor(x0) + i] || 0;\n }\n\n if (this._isViewportFilled(view_state, container_width)) {\n this._carriageReturn();\n return;\n }\n }\n }\n\n this._cleanupAfterDraw(cont_body, _virtual_x);\n this._carriageReturn();\n this.updateColumnWidthStyles(\n viewport,\n view_cache.row_headers_length,\n );\n\n await style_callback(last_cells[this._row_headers_length]);\n this.autosize_cells(last_cells, this._column_sizes.row_height);\n } finally {\n this._cleanupAfterDraw(cont_body, _virtual_x);\n }\n }\n\n private _isViewportFilled(\n view_state: ViewState,\n container_width: number,\n ): boolean {\n return (\n view_state.viewport_width - view_state.sub_cell_offset >\n container_width\n );\n }\n}\n", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2580\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2580\u2588\u2580\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2580\u2584\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2588\u2580\u2584\u2591\u2588\u2580\u2580\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2580\u2580\u2580\u2591\u2591\u2588\u2591\u2591\u2588\u2580\u2588\u2591\u2588\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2580\u2580\u2591\u2591\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2591\u2591\u2580\u2591\u2580\u2591\u2580\u2580\u2591\u2591\u2580\u2580\u2580\u2591\u2580\u2580\u2580\u2591\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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 * Copyright (c) 2020, the Regular Table Authors. This file is part * \u2503\n// \u2503 * of the Regular Table library, distributed under the terms of the * \u2503\n// \u2503 * [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 { RegularViewEventModel } from \"./events\";\nimport { RegularTableViewModel } from \"./table\";\nimport {\n CellMetadata,\n DataListener,\n FPSRecord,\n SetDataListenerOptions,\n} from \"./types\";\nimport { get_draw_fps } from \"./utils\";\nimport { METADATA_MAP } from \"./view_model\";\n\nexport type VirtualMode = \"both\" | \"horizontal\" | \"vertical\" | \"none\";\n\nconst VIRTUAL_MODES: VirtualMode[] = [\"both\", \"horizontal\", \"vertical\", \"none\"];\n\nexport type ResetAutoSizeOptions = {\n auto: boolean;\n override: boolean;\n indices: boolean;\n row_height: boolean;\n};\n\n/**\n * The `<regular-table>` custom element.\n *\n * This module has no exports, but importing it has a side effect: the\n * `RegularTableElement` class is registered as a custom element, after which\n * it can be used as a standard DOM element.\n *\n * The documentation in this module defines the instance structure of a\n * `<regular-table>` DOM object instantiated typically, through HTML or any\n * relevent DOM method e.g. `document.createElement(\"perspective-viewer\")` or\n * `document.getElementsByTagName(\"perspective-viewer\")`.\n */\nexport class RegularTableElement extends RegularViewEventModel {\n _initialized!: boolean;\n\n constructor() {\n super();\n this._column_sizes = { auto: [], override: {}, indices: [] } as any;\n this._style_callbacks = [];\n this._initialized = false;\n }\n\n connectedCallback() {\n if (!this._initialized) {\n this._create_shadow_dom();\n this.register_listeners();\n this.setAttribute(\"tabindex\", \"0\");\n this._initialized = true;\n this.table_model = new RegularTableViewModel(\n this._table_clip,\n this._column_sizes,\n this,\n );\n }\n }\n\n /**\n * Reset column autosizing, such that column sizes will be recalculated\n * on the next draw() call.\n */\n resetAutoSize(options?: ResetAutoSizeOptions) {\n if (!options || options.auto) {\n this._column_sizes.auto = [];\n }\n\n if (!options || options.override) {\n this._column_sizes.override = {};\n }\n\n if (!options || options.indices) {\n this._column_sizes.indices = [];\n }\n\n if (!options || options.row_height) {\n this._column_sizes.row_height = undefined;\n }\n }\n\n /**\n * Gets a mapping of column indices and sizes overriden by the users.\n *\n * @returns A mapping of column index to override pixel size.\n */\n saveColumnSizes(): Record<number, number> {\n return structuredClone(this._column_sizes.override);\n }\n\n /**\n * Restore an array of column widths.\n *\n * @param sizes A mapping of column index to override pixel size.\n */\n restoreColumnSizes(sizes: Record<number, number>) {\n this._column_sizes.override = structuredClone(sizes);\n }\n\n /**\n * Clears the current renderer `<table>`.\n */\n clear(): void {\n this.table_model = new RegularTableViewModel(\n this._table_clip,\n this._column_sizes,\n this,\n );\n }\n\n /**\n * Adds a style listener callback. The style listeners are called\n * whenever the <table> is re-rendered, such as through API invocations\n * of draw() and user-initiated events such as scrolling. Within this\n * optionally async callback, you can select `<td>`, `<th>`, etc. elements\n * via regular DOM API methods like querySelectorAll().\n *\n * # Examples\n *\n * ```javascript\n * const unsubscribe = table.addStyleListener(() => {\n * for (const td of table.querySelectorAll(\"td\")) {\n * td.setAttribute(\"contenteditable\", true);\n * }\n * });\n *\n * setTimeout(() => {\n * unsubscribe();\n * }, 1000);\n * ```\n *\n * @param {function({detail: RegularTableElement}): void} styleListener - A\n * (possibly async) function that styles the inner <table>.\n * @returns {function(): void} A function to remove this style listener.\n */\n addStyleListener(\n styleListener: (event: {\n detail: RegularTableElement;\n }) => void | Promise<void>,\n ): () => void {\n this._style_callbacks.push(styleListener as any);\n let isSubscribed = true;\n const unsubscribe = () => {\n if (!isSubscribed) {\n return;\n }\n\n isSubscribed = false;\n this._style_callbacks = this._style_callbacks.slice();\n const index = this._style_callbacks.indexOf(styleListener as any);\n this._style_callbacks.splice(index, 1);\n };\n\n return unsubscribe;\n }\n\n /**\n * Removes a style listener added by `addStyleListener`.\n * `removeStyleListener` throws an error if the provided listener is not\n * registered.\n *\n * @param {*} styleListener A listener previously added with\n * `addStyleListener`\n */\n removeStyleListener(\n styleListener: (event: {\n detail: RegularTableElement;\n }) => void | Promise<void>,\n ): void {\n const start_len = this._style_callbacks.length;\n this._style_callbacks = this._style_callbacks.filter(\n (x) => x !== (styleListener as any),\n );\n console.assert(\n this._style_callbacks.length === start_len - 1,\n \"No listener found\",\n );\n }\n\n /**\n * Returns the `MetaData` object associated with a `<td>` or `<th>`. When\n * your `StyleListener` is invoked, use this method to look up additional\n * `MetaData` about any `HTMLTableCellElement` in the rendered `<table>`.\n *\n * # Examples\n *\n * ```javascript\n * const elems = document.querySelector(\"td:last-child td:last_child\");\n * const metadata = table.getMeta(elems);\n * console.log(`Viewport corner is ${metadata.x}, ${metadata.y}`);\n * const header = table.getMeta({row_header_x: 1, y: 3}).row_header;\n * ```\n *\n * @param {HTMLTableCellElement|Partial<MetaData>} element - The child\n * element of this `<regular-table>` for which to look up metadata, or a\n * coordinates-like object to refer to metadata by logical position.\n * @returns {MetaData} The metadata associated with the element.\n */\n getMeta(element?: HTMLElement | CellMetadata): CellMetadata | undefined {\n if (element === undefined) {\n return;\n } else if (element instanceof HTMLElement) {\n return METADATA_MAP.get(element);\n } else if (\n \"row_header_x\" in element &&\n element.row_header_x &&\n element.row_header_x >= 0\n ) {\n if (element.row_header_x! < this._view_cache.row_headers_length) {\n const td = this.table_model.body._fetch_cell(\n element.y!,\n element.row_header_x!,\n );\n return this.getMeta(td);\n }\n } else if (\n \"column_header_y\" in element &&\n element.column_header_y! >= 0\n ) {\n if (\n element.column_header_y! <\n this._view_cache.column_headers_length\n ) {\n const td = this.table_model.header._fetch_cell(\n element.column_header_y!,\n element.x!,\n );\n return this.getMeta(td);\n }\n } else if (\"dx\" in element) {\n return this.getMeta(\n this.table_model.body._fetch_cell(\n element.dy,\n element.dx + (this.table_model._row_headers_length || 0),\n ),\n );\n }\n }\n\n /**\n * Get performance statistics about this `<regular-table>`. Calling this\n * method resets the internal state, which makes it convenient to measure\n * performance at regular intervals (see example).\n *\n * # Examples\n *\n * ```javascript\n * const table = document.getElementById(\"my_regular_table\");\n * setInterval(() => {\n * const {real_fps} = table.getDrawFPS();\n * console.log(`Measured ${fps} fps`)\n * });\n * ```\n *\n * @returns {Performance} Performance data aggregated since the last\n * call to `getDrawFPS()`.\n */\n getDrawFPS(): FPSRecord {\n return get_draw_fps();\n }\n\n /**\n * Call this method to set the `scrollLeft` and `scrollTop` for this\n * `<regular-table>` by calculating the position of this `scrollLeft`\n * and `scrollTop` relative to the underlying widths of its columns\n * and heights of its rows.\n *\n * # Examples\n *\n * ```javascript\n * table.scrollToCell(1, 3);\n * ```\n *\n * @param {number} x - The left most `x` index column to scroll into view.\n * @param {number} y - The top most `y` index row to scroll into view.\n */\n async scrollToCell(x: number, y: number): Promise<void> {\n if (!this._view_cache) {\n console.warn(\"data listener not configured\");\n return;\n }\n\n const viewport_row_height = this._column_sizes.row_height || 0;\n this.scrollTop = Math.ceil(viewport_row_height * y);\n let scroll_left = 0;\n while (x > 0) {\n x--;\n scroll_left +=\n this._column_sizes.indices[\n x + this._view_cache.row_headers_length\n ] || 60;\n }\n\n this.scrollLeft = Math.ceil(scroll_left);\n await new Promise(requestAnimationFrame);\n await this.flush();\n }\n\n /**\n * Call this method to set `DataListener` for this `<regular-table>`,\n * which will be called whenever a new data slice is needed to render.\n * Calls to `draw()` will fail if no `DataListener` has been set\n *\n * # Examples\n *\n * ```javascript\n * table.setDataListener((x0, y0, x1, y1) => {\n * return {\n * num_rows: num_rows = DATA[0].length,\n * num_columns: DATA.length,\n * data: DATA.slice(x0, x1).map(col => col.slice(y0, y1))\n * };\n * })\n * ```\n *\n * @param dataListener\n * `dataListener` is called by to request a rectangular section of data\n * for a virtual viewport, (x0, y0, x1, y1), and returns a `DataReponse`\n * object.\n * @param options\n */\n setDataListener(\n dataListener: DataListener,\n {\n virtual_mode = \"both\",\n preserve_state = false,\n }: SetDataListenerOptions = {},\n ): void {\n console.assert(\n VIRTUAL_MODES.indexOf(virtual_mode) > -1,\n `Unknown virtual_mode ${virtual_mode}; valid options are \"both\" (default), \"horizontal\", \"vertical\" or \"none\"`,\n );\n\n const virtual_mode_changed = this._virtual_mode !== virtual_mode;\n if (preserve_state) {\n console.assert(\n !virtual_mode_changed,\n \"preserve_state called with modified virtual_mode\",\n );\n\n this._view_cache.view = dataListener as any;\n } else {\n this._virtual_mode = virtual_mode;\n this._invalid_schema = true;\n this._view_cache = {\n view: dataListener as any,\n row_headers_length: 0,\n column_headers_length: 0,\n };\n\n if (virtual_mode_changed) {\n this._setup_virtual_scroll();\n }\n }\n }\n}\n\nif (document.createElement(\"regular-table\").constructor === HTMLElement) {\n window.customElements.define(\"regular-table\", RegularTableElement);\n}\n\n// Custom Elements extensions\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n \"regular-table\": RegularTableElement;\n }\n }\n}\n\ndeclare global {\n interface Document {\n createElement(\n tagName: \"regular-table\",\n options?: ElementCreationOptions,\n ): RegularTableElement;\n querySelector<E extends Element = Element>(selectors: string): E | null;\n querySelector(selectors: \"regular-table\"): RegularTableElement | null;\n }\n\n interface CustomElementRegistry {\n get(tagName: \"regular-table\"): typeof RegularTableElement;\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 { HTMLPerspectiveViewerPluginElement } from \"./plugin\";\nimport type { PerspectiveViewerElement } from \"../../dist/wasm/perspective-viewer.js\";\nimport type React from \"react\";\nimport type { ViewerConfigUpdate } from \"./ts-rs/ViewerConfigUpdate.js\";\nimport type {\n ViewWindow,\n ViewConfigUpdate,\n Filter,\n} from \"@perspective-dev/client\";\n\nexport class PerspectiveSelectDetail {\n selected: boolean;\n row: Record<string, unknown>;\n column_names?: string[];\n removeConfigs: ViewConfigUpdate[];\n insertConfigs: ViewConfigUpdate[];\n constructor(\n selected: boolean,\n row: Record<string, unknown>,\n column_names: string[],\n removeConfigs: ViewConfigUpdate[],\n insertConfigs: ViewConfigUpdate[],\n ) {\n this.selected = selected;\n this.row = row;\n this.column_names = column_names;\n this.removeConfigs = removeConfigs;\n this.insertConfigs = insertConfigs;\n }\n\n get removeFilters(): Filter[] {\n return this.removeConfigs.flatMap((x) => x.filter ?? []);\n }\n\n get insertFilters(): Filter[] {\n return this.insertConfigs.flatMap((x) => x.filter ?? []);\n }\n}\n\nimport type {\n ExportDropDownMenuElement,\n CopyDropDownMenuElement,\n} from \"../../dist/wasm/perspective-viewer.d.ts\";\n\n// DOM extensions\n\nexport type HTMLPerspectiveViewerElement = PerspectiveViewerElement &\n PerspectiveViewerElementExt &\n HTMLElement;\n\nexport interface HTMLPerspectiveViewerExportMenuElement\n extends HTMLElement,\n ExportDropDownMenuElement {}\n\nexport interface HTMLPerspectiveViewerCopyMenuElement\n extends HTMLElement,\n CopyDropDownMenuElement {}\n\nexport type PerspectiveClickEventDetail = {\n config: ViewerConfigUpdate;\n row: Record<string, any>;\n column_names: Array<string | Array<string>>;\n};\n\nexport type PerspectiveSelectEventDetail = {\n view_window: ViewWindow;\n};\n\n// JSX / React extensions\n\ntype ReactPerspectiveViewerAttributes<T> = React.HTMLAttributes<T>;\n\ntype JsxPerspectiveViewerElement = {\n class?: string;\n} & React.DetailedHTMLProps<\n ReactPerspectiveViewerAttributes<HTMLPerspectiveViewerElement>,\n HTMLPerspectiveViewerElement\n>;\n\n// React <19\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// React >=19\n\n// Why are these `ts-ignore`? React 19 makes choice of JSX runtime in `tsconfig`\n// the determination of which runtime this needs to be, but this is chosen\n// by the user ... so I'm not sure what the React authors want from me here\n// exactly. Divination?\n\n// @ts-ignore\ndeclare module \"react/jsx-runtime\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// @ts-ignore\ndeclare module \"react/jsx-dev-runtime\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\ndeclare module \"react\" {\n namespace JSX {\n interface IntrinsicElements {\n \"perspective-viewer\": JsxPerspectiveViewerElement;\n }\n }\n}\n\n// Custom Elements extensions\n\ndeclare global {\n interface Document {\n createElement(\n tagName: \"perspective-viewer\",\n options?: ElementCreationOptions,\n ): HTMLPerspectiveViewerElement;\n createElement(\n tagName: \"perspective-viewer-plugin\",\n options?: ElementCreationOptions,\n ): HTMLPerspectiveViewerPluginElement;\n querySelector<E extends Element = Element>(selectors: string): E | null;\n querySelector(\n selectors: \"perspective-viewer\",\n ): HTMLPerspectiveViewerElement | null;\n }\n\n interface CustomElementRegistry {\n get(\n tagName: \"perspective-viewer\",\n ): typeof PerspectiveViewerElement &\n PerspectiveViewerElementExt &\n typeof HTMLElement;\n get(\n tagName: \"perspective-viewer-plugin\",\n ): typeof HTMLPerspectiveViewerPluginElement;\n }\n}\n\nexport interface PerspectiveViewerElementExt {\n /**\n * Register a new plugin via its custom element name. This method is called\n * automatically as a side effect of importing a plugin module, so this\n * method should only typically be called by plugin authors.\n *\n * @category Plugin\n * @param name The `name` of the custom element to register, as supplied\n * to the `customElements.define(name)` method.\n * @example\n * ```javascript\n * customElements.get(\"perspective-viewer\").registerPlugin(\"my-plugin\");\n * ```\n */\n registerPlugin(name: string): Promise<void>;\n\n get_wasm_module(): WebAssembly.Module;\n\n get_worker_url(): URL;\n\n addEventListener(\n name: \"perspective-click\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-select\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-global-filter\",\n cb: (e: CustomEvent<PerspectiveSelectEventDetail>) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-toggle-settings\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-toggle-settings-before\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-config-update\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-statusbar-pointerdown\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-table-delete\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n addEventListener(\n name: \"perspective-table-delete-before\",\n cb: (e: CustomEvent) => void,\n options?: { signal: AbortSignal },\n ): void;\n\n removeEventListener(name: \"perspective-click\", cb: any): void;\n removeEventListener(name: \"perspective-select\", cb: any): void;\n removeEventListener(name: \"perspective-global-filter\", cb: any): void;\n removeEventListener(name: \"perspective-toggle-settings\", cb: any): void;\n removeEventListener(\n name: \"perspective-toggle-settings-before\",\n cb: any,\n ): void;\n removeEventListener(name: \"perspective-config-update\", cb: any): void;\n removeEventListener(\n name: \"perspective-statusbar-pointerdown\",\n cb: any,\n ): void;\n removeEventListener(name: \"perspective-table-delete\", cb: any): void;\n removeEventListener(name: \"perspective-table-delete-before\", cb: any): void;\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 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\n/**\n * Cross-package helpers for per-column value formatting. Used by both\n * `viewer-datagrid` (cell formatting) and `viewer-charts` (axis ticks,\n * tooltips, legends) so a column's `number_format` / `date_format`\n * configuration produces identical output across plugins.\n *\n * The format configs mirror the `Intl.NumberFormatOptions` /\n * `Intl.DateTimeFormatOptions` shapes one-for-one \u2014 they're written\n * straight into the respective constructors. The `date_format.format`\n * discriminator (\"simple\" | \"custom\") selects between two derivation\n * paths: simple uses `dateStyle` / `timeStyle`, custom uses the\n * per-field overrides (year / month / day / ...).\n */\n\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 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/**\n * Default `Intl.NumberFormatOptions` applied when a numeric column has no\n * `number_format` configured. Float columns get two fractional digits to\n * match the legacy datagrid behavior; integer columns get an empty\n * options bag (locale-default integer rendering).\n */\nconst NUMERIC_LEGACY_DEFAULTS: Record<string, Intl.NumberFormatOptions> = {\n float: {\n style: \"decimal\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n};\n\n/**\n * Default `Intl.DateTimeFormatOptions` applied when a datetime column has\n * no `date_format` configured.\n */\nconst DATETIME_LEGACY_DEFAULTS: Intl.DateTimeFormatOptions = {\n dateStyle: \"short\",\n timeStyle: \"medium\",\n};\n\nconst DATE_LEGACY_DEFAULTS: Intl.DateTimeFormatOptions = {\n dateStyle: \"short\",\n};\n\nexport function createNumberFormatter(\n type: string,\n cfg?: NumberFormatConfig,\n): Intl.NumberFormat {\n const opts: Intl.NumberFormatOptions =\n cfg ?? NUMERIC_LEGACY_DEFAULTS[type] ?? {};\n return new Intl.NumberFormat(navigator.languages as string[], opts);\n}\n\nexport function createDatetimeFormatter(\n cfg?: DateFormatConfig,\n): Intl.DateTimeFormat {\n if (!cfg || cfg.format !== \"custom\") {\n const opts: Intl.DateTimeFormatOptions = {\n timeZone: cfg?.timeZone,\n dateStyle:\n cfg?.dateStyle === \"disabled\"\n ? undefined\n : (cfg?.dateStyle ?? DATETIME_LEGACY_DEFAULTS.dateStyle),\n timeStyle:\n cfg?.timeStyle === \"disabled\"\n ? undefined\n : (cfg?.timeStyle ?? DATETIME_LEGACY_DEFAULTS.timeStyle),\n };\n\n return new Intl.DateTimeFormat(navigator.languages as string[], opts);\n }\n\n const opts: Intl.DateTimeFormatOptions = {\n timeZone: cfg.timeZone,\n hour12: cfg.hour12 ?? true,\n fractionalSecondDigits: cfg.fractionalSecondDigits,\n };\n if (cfg.year !== \"disabled\") {\n opts.year = cfg.year ?? \"2-digit\";\n }\n if (cfg.month !== \"disabled\") {\n opts.month = cfg.month ?? \"numeric\";\n }\n if (cfg.day !== \"disabled\") {\n opts.day = cfg.day ?? \"numeric\";\n }\n if (cfg.weekday && cfg.weekday !== \"disabled\") {\n opts.weekday = cfg.weekday;\n }\n if (cfg.hour !== \"disabled\") {\n opts.hour = cfg.hour ?? \"numeric\";\n }\n if (cfg.minute !== \"disabled\") {\n opts.minute = cfg.minute ?? \"numeric\";\n }\n if (cfg.second !== \"disabled\") {\n opts.second = cfg.second ?? \"numeric\";\n }\n return new Intl.DateTimeFormat(navigator.languages as string[], opts);\n}\n\nexport function createDateFormatter(\n cfg?: DateFormatConfig,\n): Intl.DateTimeFormat {\n const opts: Intl.DateTimeFormatOptions = {\n timeZone: \"utc\",\n dateStyle:\n cfg?.dateStyle === \"disabled\"\n ? undefined\n : (cfg?.dateStyle ?? DATE_LEGACY_DEFAULTS.dateStyle),\n };\n return new Intl.DateTimeFormat(navigator.languages as string[], opts);\n}\n\n/**\n * Recover the source column name from a synthetic split-by path. Split\n * pivoting produces paths of the form `<split_val_1>|...|<source_col>`;\n * per-column config (formatters, aggregate styling, \u2026) is always keyed\n * on the trailing source column.\n */\nexport function sourceColumn(path: string): string {\n return path.split(\"|\").at(-1) ?? path;\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", "// \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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["AVG", "TOTAL", "START", "get_draw_fps", "now", "elapsed", "avg", "real_fps", "virtual_fps", "num_frames", "log_perf", "x", "TAGS", "flush_tag", "tag", "throttle_tag", "f", "l", "isFirefox", "BROWSER_MAX_HEIGHT", "container_default", "sub_cell_offsets_default", "CLIP_X", "CLIP_Y", "TRANSFORM_X", "TRANSFORM_Y", "HTML_TEMPLATE", "RegularVirtualTableViewModel", "_sub_cell_rule", "_virtual_panel", "_virtual_mode", "_container_size", "_start_row", "_end_row", "_start_col", "_end_col", "_invalid_schema", "_selected_id", "_table_clip", "_column_sizes", "_view_cache", "_invalidated", "_is_styling", "_style_callbacks", "_probe_element", "options", "internal_draw", "_probe_row_height", "tbody", "tr", "_create_shadow_dom", "containerStyleSheet", "sub_cell_style", "virtual_panel", "table_clip", "_setup_virtual_scroll", "_calculate_viewport", "nrows", "num_columns", "start_row", "end_row", "_calculate_row_range", "start_col", "end_col", "_calculate_column_range", "_validate_viewport", "invalid_column", "invalid_row", "_update_virtual_panel_width", "invalid", "totalWidth", "w", "virtual_width", "_calc_scrollable_column_width", "panel_width", "_update_virtual_panel_height", "row_height", "header_height", "virtual_panel_px_size", "_update_sub_cell_offset", "viewport", "last_cell", "y_offset", "x_offset_index", "_row_headers_length", "x_offset", "_calc_start_column", "vis_cols", "height", "containerHeight", "header_levels", "total_scroll_height", "percent_scroll", "clip_panel_row_height", "scroll_index_offset", "offset_width", "diff", "new_val", "_max_scroll_column", "width", "max_scroll_column", "cidx", "viewport_width", "rhLen", "i", "__debug_start_time__", "_resetDimState", "invalid_viewport", "preserve_width", "num_rows", "num_row_headers", "num_column_headers", "_getDimState", "is_non_vertical", "is_non_horizontal", "safe_num_rows", "safe_num_columns", "invalid_schema_or_column", "first_iteration", "last_cells", "callback", "old_height", "METADATA_MAP", "ElemFactory", "_name", "_elements", "_index", "name", "elem", "ViewModel", "_container", "_span_factory", "column_sizes", "container", "table", "_get_row", "_set_metadata", "td", "metadata", "_get_or_create_metadata", "_replace_cell", "ridx", "row_container", "_fetch_cell", "_get_cell", "nextCell", "new_td", "_clean_columns", "idx", "toRemove", "j", "node", "_clean_rows", "IOS_DISABLE_OVERSCROLL", "RegularViewEventModel", "_memo_scroll_top", "_memo_scroll_left", "_memo_touch_startY", "_memo_touch_startX", "_last_clicked_time", "_on_click_or_dblclick", "_on_scroll", "_register_glitch_scroll_listeners", "event", "_on_mousewheel", "_on_touchmove", "_on_touchstart", "event2", "clientWidth", "clientHeight", "scrollTop", "scrollLeft", "total_scroll_width", "_on_dblclick", "element", "is_resize", "row", "_on_click", "_on_resize_column", "virtual_x", "size_key", "start", "header_x", "header_element", "move", "_on_resize_column_move", "up", "override_width", "should_redraw", "th", "should_clip", "RegularHeaderViewModel", "_group_header_cache", "_offset_cache", "_draw_group_th", "offset_cache", "d", "column", "span", "resizeSpan", "_draw_group", "column_name", "_draw_th", "auto_width", "alias", "parts", "colspan", "x0", "_virtual_x", "column_header_merge_depth", "merge_headers", "output", "group_meta", "RegularBodyViewModel", "_draw_td", "tagName", "val", "ridx_offset", "key", "clip", "container_height", "column_state", "view_state", "column_data", "row_headers", "column_data_listener_metadata", "tds", "cidx_offset", "loops", "y0_floor", "y1_ceil", "x1_ceil", "x_floor", "x0_floor", "dx", "cidx_i", "obj", "valArray", "row_header", "ridx_off_i", "prev_row", "prev_row_metadata", "cidx_off_ridx", "prev_col", "prev_col_metadata", "offset", "meta", "RegularTableViewModelBase", "_initializeViewState", "selected_id", "x1", "y1", "sub_cell_offset", "_drawRowHeaders", "row_headers_length", "column_headers_length", "merge_column_headers", "merge_row_headers", "cont_body", "cont_heads", "header", "hmetadata", "_calculateViewportExtension", "container_width", "end_col_offset", "size_extension", "estimate", "_drawDataColumn", "dcidx", "view_response", "first_col", "cont_head", "_fetchMissingColumns", "view", "missing_cidx", "new_viewport", "new_col", "_cleanupAfterDraw", "_carriageReturn", "RegularTableViewModel", "_columnWidthStyleSheet", "_lastColumnWidthCss", "_lastDataResponse", "_lastViewport", "thead", "override_row_height", "zoom", "measurements", "cell", "box", "cssRules", "row_headers_size_key", "columnIndex", "_applyColumnWidthStyles", "css", "shadowRoot", "view_cache", "container_size", "style_callback", "maxLen", "rh", "row_header_result", "num_visible_columns", "fetch_result", "drawn_body", "col_width", "_isViewportFilled", "VIRTUAL_MODES", "RegularTableElement", "_initialized", "sizes", "styleListener", "isSubscribed", "index", "start_len", "y", "viewport_row_height", "scroll_left", "dataListener", "virtual_mode", "preserve_state", "virtual_mode_changed", "PerspectiveSelectDetail", "selected", "row", "column_names", "removeConfigs", "insertConfigs", "x", "get_psp_type", "model", "metadata", "PRIVATE_PLUGIN_SYMBOL", "isEditableMode", "viewer", "allowed", "has_pivots", "plugin", "editable", "META_COLUMN_RE", "isMetaColumn", "name", "NUMERIC_LEGACY_DEFAULTS", "DATETIME_LEGACY_DEFAULTS", "DATE_LEGACY_DEFAULTS", "createNumberFormatter", "type", "cfg", "opts", "createDatetimeFormatter", "createDateFormatter", "sourceColumn", "path", "BooleanFormatter", "val", "FormatterCache", "_type", "plugin", "createDatetimeFormatter", "createDateFormatter", "type", "createNumberFormatter", "_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", "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", "sourceColumn", "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
|
}
|